2014-02-13 78 views
4

我最近對Java中的這種特性感興趣,因爲函數的參數數量是可變的。這是一個非常酷的功能。但我感興趣的是:JVM如何實現可變參數?

void method(int x, String.. args) { 
    // Do something 
} 

這是如何在實際運行時級別執行?是什麼在我腦海中,就是當我們有一個電話:

method(4, "Hello", "World!"); 

最後兩個參數是內部改造成一個陣列,傳遞給方法。我對此是否正確,或者JVM實際上將堆棧引用推入字符串,而不僅僅是對數組的引用?

回答

6

它在編譯時級別實現。你方法編譯成字節碼

varargs method(I[Ljava/lang/String;)V 
... 

這相當於

void method(int x, String[] args) { 
... 

varargs標誌。

而且

method(4, "Hello", "World!"); 

被編譯爲

method(4, new String[] {"Hello", "World!"}); 
3

這樣的方法被轉化成

void method(int x, String[] args) { 
} 

及其呼叫

method(4, "Hello", "World!"); 

被轉換成

method(4, new String[]{"Hello", "World!"}); 

注意,最後一個調用可以直接寫入。重寫可變參數的方法時,這是有用的:

@Override 
void method(int x, String... args) { 
    String[] newArgs=new String[]; 
    ... // fill new args; then 
    super.method(newArgs); 
} 
2

最後兩個參數在內部變換成一個陣列,傳遞給該方法。我是對的,

是的,你的理解是正確的。一個數組構造並作爲參數傳遞。

爲了確保如果你看到那個調用的字節代碼,你可以在那裏看到數組。數組創建並傳遞到目標。