2016-08-15 116 views
3
import java.util.*; 
public class Overload { 
    public static void main(String...args) { 
     System.out.println("in main 1"); 
    } 
    public static void main(String args[]) { 
     System.out.println("in main 2"); 
    } 
} 

我被檢查,如果這兩種主要的方法有哪一個會得到執行標準簽名,但是當我編譯它,它顯示錯誤。爲什麼這樣?爲什麼重載主要方法會導致語法錯誤?

+2

這是如何重複[在Java程序中是否存在兩個主要方法?](http://stackoverflow.com/questions/13399836/can-there-exist-two-main-methods-in-a -java-程序)。這個問題問該'主要(字符串參數... args)'由varargs'的''而主(字符串ARGS [])'由array'作爲參數的'。兩者都有不同的簽名(如果我們不考慮編譯時轉換),那麼爲什麼我們不能定義兩者。而問題* Java程序中是否可以存在兩種主要方法?*詢問問題是否可以有多個入口點。兩者都不同。 –

回答

2

使用省略號(...)只是語法加糖,它允許您傳遞多個以逗號分隔的參數,而不是顯式聲明數組。從該方法中,對於參數是數組的所有意圖和目的。所以,你基本上定義兩種方法具有相同簽名(public static void main(String[])),這是不允許的,不管事實,即它的特殊main方法。

0

不能聲明兩個主(字符串[])和主(字符串...)。你的類不能有兩個主要的方法具有相同的簽名(String ...)和(String [])相同。它不允許在Java中。

2

可變參數基本上編譯成單個陣列。因此,你有2種方法哪都一樣

你的代碼(改變的主要原因之一,它現在是一個有效的代碼):

import java.io.PrintStream; 

public class Overload { 
    public static void main2(String... paramVarArgs) { 
    System.out.println("in main 1"); 
    } 

    public static void main(String[] paramArrayOfString) { 
    System.out.println("in main 2"); 
    } 
} 

此代碼編譯,並用bytcode觀衆反編譯:

public class Overload { 

    public Overload() { // <init> //()V 
     L1 { 
      aload0 // reference to self 
      invokespecial java/lang/Object <init>(()V); 
      return 
     } 
    } 

    public static varargs main2(java.lang.String[] arg0) { //([Ljava/lang/String;)V 
     L1 { 
      getstatic java/lang/System.out:java.io.PrintStream 
      ldc "in main 1" (java.lang.String) 
      invokevirtual java/io/PrintStream println((Ljava/lang/String;)V); 
     } 
     L2 { 
      return 
     } 
    } 

    public static main(java.lang.String[] arg0) { //([Ljava/lang/String;)V 
     L1 { 
      getstatic java/lang/System.out:java.io.PrintStream 
      ldc "in main 2" (java.lang.String) 
      invokevirtual java/io/PrintStream println((Ljava/lang/String;)V); 
     } 
     L2 { 
      return 
     } 
    } 
} 
+0

好了,從技術上說,'的main()'和'MAIN2()'**是完全不同的功能**。那麼它是否消除了在這裏適用的術語**超載**?另外,如果這是解決方案,那麼我們是否應該得出結論:主方法不能被重載? – progyammer

相關問題