2013-01-07 27 views
4

可能重複:
Can we overload the main method in Java?爲什麼沒有主函數重載的碰撞?

當我tryed編譯和下面的代碼運行,它的工作,我看到 「A」 在控制檯上。

爲什麼?

在我的腦海裏(字符串參數... args)是同一(字符串阿根廷,字串[] args)

public class AFewMainExample { 
    public static void main(String... args) { 
     System.out.print("A"); 
    } 

    public static void main(String args) { 
     System.out.print("B"); 
    } 

    public static void main(String[] args, String arg) { 
     System.out.print("C"); 
    } 

    public static void main(String arg, String[] args) { 
     System.out.print("D"); 
    } 
} 
+0

''(String ... args)'它和'(String [] args)'一樣。 – MrSmith42

+0

@ MrSmith42大致相同,除非你叫他們;) –

+0

@Peter Lawrey:只是一點點語法糖就是區別。 – MrSmith42

回答

0

參數(order(或)type(或)both)對於每個main方法都是不同的,只留下一個main方法和真正的main語法,所以沒有問題。

如果您添加以下主要方法,您將看到編譯時錯誤,因爲現在有兩種方法具有精確的語法。

public static void main(String[] args) { 
    System.out.print("A"); 
} 

閱讀本教程上overloading更多信息。

2

這在JLS實際確定,§12.1.4

方法main絕被宣佈爲public,staticvoid。它必須指定一個形式參數(§8.4.1),其聲明類型是String的數組。因此,以下任一聲明的是可以接受的:

  • public static void main(String[] args)

  • public static void main(String... args)

還有就是可變參數類型和標準陣列類型之間沒有差異除了函數被調用的方式之外,正如所注意的那樣d here。因此,可變參數版本滿足上述所有標準並作爲有效的方法通過。顯然,你的所有其他main重載不等價(否則會有編譯錯誤)。

+1

不幸的是'public static void main(String argc [])' –

0

的主要問題是:

+ signature of main(String... args) is different for 
    - main(String[] args, String arg) 
    - main(String arg, String[] args) 

+ main(String... args) 
    - not equals for main(String[] args, String[] args2) 
    - only for main(String[] args) 

雖然我趕編譯錯誤上下面的例子:

public class MainOverloadingExample4 { 

void go(String s){ 
    System.out.println("void go(String s)"); 
} 
void go(String ... s){ 
    System.out.println("void go(String ... s)"); 
} 
void go(String s, String ... arr){ 
    System.out.println("void go(String s, String ... arr){"); 
} 
public static void main(String[] args) { 
    new MainOverloadingExample4().go("where I am?", "why I am here?"); 
} 
} 

的方法去(字符串[])是不明確的類型MainOverloadingExample