2016-06-30 75 views
-1

重載的主要方法與字符串[] args和可變參數?如果不是那麼爲什麼??我試着下面的代碼給編譯error.please幫助.i新的Java。重載的主要方法與字符串[]參數和可變參數?如果不是那麼爲什麼?

public class obj1 { 

    public static void main(String ... args) { 
     System.out.println("main method varargs"); 
    } 

    public static void main(String[] args) { 
     System.out.println("main method string arrays"); 
    } 
} 
+4

變量參數('...')實際上只是數組參數的語法糖。因此,您試圖使用相同的簽名來定義兩種方法。 –

+0

也在這裏解釋:http://stackoverflow.com/questions/301563/difference-fnstring-args-vs-fnstring-args – RichardK

+0

@AndyTurner你應該寫這個答案,而不是一個評論:) – sotix

回答

5

在Java中,這兩種方法實際上都是public static void main(String[] args)(基本上)。這就是爲什麼它不會編譯;你不能有兩個public static void main(String[])方法的類。

Java通過將函數編譯爲接受數組來添加可變參數,然後通過調用函數自動將可變參數包裝到數組中。

也就是說,如果我們有一個名爲與

foo("one", "two", "three"); 

什麼編譯器實際上是創建

void foo(String... args) 

void foo(String[] args) 

調用

foo(new String[] { "one", "two", "three"}) 

(編譯標記在類文件中的方法,以便它後來知道,在端部陣列是可變參數,但它創建的代碼是用於接受陣列的方法。)

這主要是由JLS§8.4.1覆蓋:

方法或構造的最後形式參數是特殊的:它可以是一個可變元數參數,通過以下類型的省略號指示。

...

形式參數的聲明類型取決於它是否是一個可變參數數量參數:

  • 如果正式參數不是一個可變參數數量的參數,則聲明的類型如果沒有括號對出現在UnannType和VariableDeclaratorId中,則由UnannType表示,否則由§10.2指定。

  • 如果形式參數是變量arity參數,則聲明的類型由§10.2指定。 (請注意,「混合符號」不允許針對可變元數參數。)

...其中§10.2在談論陣列。

事實上,使用數組而不是離散參數調用foo(String...)方法是完全有效的。例如,假設我們有:

private static void foo(String... args) { 
    for (String s : args) { 
     System.out.println(s); 
    } 
} 

我們可以調用,要麼是這樣的:

foo("one", "two", "three"); 

或類似這樣的

foo(new String[] { "four", "five", "six"}); 

兩者都是完全合法的;例如:http://ideone.com/a1Ku37

相關問題