在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覆蓋:
方法或構造的最後形式參數是特殊的:它可以是一個可變元數參數,通過以下類型的省略號指示。
...
形式參數的聲明類型取決於它是否是一個可變參數數量參數:
...其中§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
變量參數('...')實際上只是數組參數的語法糖。因此,您試圖使用相同的簽名來定義兩種方法。 –
也在這裏解釋:http://stackoverflow.com/questions/301563/difference-fnstring-args-vs-fnstring-args – RichardK
@AndyTurner你應該寫這個答案,而不是一個評論:) – sotix