2011-01-20 98 views
11

我想知道創建額外的主要方法對您的代碼會產生什麼效果。java中的多個main()方法

例如,

public class TestClass { 
    public static void main (String[] args){ 
     TestClass foo = new TestClass(); 
    } 
} 

後程序開始啓動時,foo將創建,它會在其內部都有另一個公共主要方法。會造成任何錯誤嗎?

回答

32

它不會導致錯誤。僅僅因爲你初始化一個對象,並不意味着主要的方法得到執行。 Java將最初只調用傳遞給它的類的主要方法,如

>java TestClass

然而,做這樣的事情:

public class TestClass 
{ 
public static void main (String[] args) 
{ 
    TestClass foo = new TestClass(); 
    foo.main(args); 
} 
} 

或者

public class TestClass 
{ 
public TestClass() 
{ 
    //This gets executed when you create an instance of TestClass 
    main(null); 
} 

public static void main (String[] args) 
{ 
    TestClass foo = new TestClass(); 
} 
} 

會導致StackOverflowError,因爲你是exp合法地調用TestClass中的主要方法,那麼這將再次調用的主要方法,又一次,又一次,....

有疑問時,只需對其進行測試,:-)

5

這很好。有多個main方法不會導致任何問題。當你第一次啓動Java程序時,執行在一些函數中以用戶指定的類或.jar文件指定的main函數開始。一旦程序開始運行,所有其他被稱爲main的函數基本上被忽略或像其他函數一樣處理。

+0

我想OP會詢問在每次該類的一個對象被實例化時是否重新創建主要方法,而不是在同一個作用域中具有多個聲明的主要方法。 – berry120 2011-01-21 00:00:41

+0

我認爲這可以解釋任何一種方式,並有兩個解釋是有用的。當然只是我的意見。 – duffymo 2011-01-21 00:06:07

+0

夠公平的,我同意這兩種解釋都是有用的。這只是我第一次讀它:-) – berry120 2011-01-21 00:08:32

3

不,您可以在項目中擁有任意數量的主要方法。由於您指定啓動程序時要使用哪一個,因此不會導致任何衝突。

6

它不會有額外的main-方法,因爲mainstatic。所以每堂課一次。

如果項目中有多個main-方法,您將指定在啓動應用程序時啓動哪一個方法。

10

主要方法是靜態的,這意味着它屬於類而不是對象。所以這個對象根本就沒有其他的主要方法。你可以調用對象實例的主要方法,但是如果你這樣做的話,它實際上只是調用TestClass.main()的另一種方法(並且包括我在內的很多人都不願意調用靜態方法無論如何都是對象的一個​​實例。)

如果您在同一個程序中引用多個主要方法,那麼這也不是問題。主類是簡單指定的,其主要方法是執行以啓動程序(在jar文件的情況下,這是清單文件中的主類屬性)。

4

後尋找一個Java包含多個main()方法的類或用普通的語言重載的main()方法,我想出了一個我自己的例子。請看看

public class MultipleMain{ 

    public static void main(String args[]){ 
     main(1); 
     main('c'); 
     main("MyString"); 
    } 

    public static void main(int i){ 
    System.out.println("Inside Overloaded main()"); 
    } 

    public static void main(char i){ 
    System.out.println("Inside Overloaded main()"); 
    } 
    public static void main(String str){ 
    System.out.println("Inside Overloaded main()"); 
    } 

}

我測試了JDK 1.7這個Java代碼和工程就像一個魅力!

你需要「public static void main(String args [])」來開始,然後你可以在這個main中調用重載的main方法,它應該可以工作。

任何意見和建議,高度讚賞。我只是一個願意發展我的Java技能的新手Java開發人員。

感謝, PK當你運行你的Java類它總是會簽名公共靜態無效的主要(字符串ARGS [])在類

0

。因此,假設如果您調用命令行參數,它將在該類中查找Signature方法,並且不會調用其他方法,直到您按類名顯式引用它爲止。

class MainMethod1{ 
public static void main(String[] ags){ 
    System.out.println("Hi main 1"); 
    testig2 y = new testig2(); 
//in this case MainMethod1 is invoked/....... 
// String[] a = new String[10]; 
// testig2.main(a); 
    } 

} 
class MainMethod2{ 
    public static void main(String[] ags){ 
    System.out.println("Hi main 2"); 
    } 
} 

但是當你從日食嘗試同樣它會問類進行編譯。意味着MainMethod1或Mainmethod2。所以如果te類有確切的簽名,他們可以作爲單獨的入口點來啓動應用程序。 回到你的問題,如果你通過改變參數,如果你主要的方法刪除簽名。 它將作爲正常方法

1

你只能有一個在一個類中的主要方法,但你可以調用一個主方法的另一個明確

class Expmain 
{ 
    public static void main(String[] ar) 
    { 
     System.out.println("main 1"); 
    } 
} 

class Expmain1 
{ 
    public static void main(String[] ar) 
    { 
     System.out.println("main 2"); 
     Expmain.main(ar); 
    } 
} 
0

這是所有關於JVM的執行引擎。請記住,你在cmd提示符下編寫了>java com.abc.MainClass

它解釋了一切。如果在這裏沒有找到main方法,它會拋出一個運行時錯誤:在MainClass類中找不到Main方法。 現在,如果在這裏找到主要方法,它將作爲程序計數器必須映射並開始執行指令時的第一個點。被引用的類隨後被加載,引用的方法可以使用內部創建的實例來調用。所以,main是特定於類的,但一個類只能有一個主要方法。 請注意,主要方法的簽名永遠不會改變。 您可以在同一類兩個重載的主要方法,如

public static void main(String[] args) {}

public static void main() {} //overloaded in same class.

在靜態綁定,原來主要是解決和執行引擎識別。

0

另一個需要考慮的問題是java文件中有兩個不同的類。

例如,你有兩個類的Java文件:

public class FirstClassMultiply { 

    public static void main (String args[]){ 
     System.out.println("Using FirstClassMultiply"); 
     FirstClassMultiply mult = new FirstClassMultiply(); 
     System.out.println("Multiple is :" + mult.multiply(2, 4)); 
    } 
    public static void main (int i){ 
     System.out.println("Using FirstClassMultiply with integer argument"); 
     FirstClassMultiply mult = new FirstClassMultiply(); 
     System.out.println("Multiply is :" + mult.multiply(2, 5)); 
    } 

    int multiply(int a, int b) { 
     return (a * b); 
    } 
} 

class SecondClass { 

    public static void main(String args[]) { 
     System.out.println("Using SecondClass"); 

     FirstClassMultiply mult = new FirstClassMultiply(); 
     System.out.println("Multiply is :" + mult.multiply(2, 3)); 

     FirstClassMultiply.main(null); 
     FirstClassMultiply.main(1); 
    } 
} 

javac FirstClassMultiply.java編譯它會生成兩個.class文件,第一個是FirstClassMultiply.class和第二個是SecondClass.class

而且爲了運行您需要爲生成的.class文件執行此操作:java FirstClassMultiplyjava SecondClass,而不是原始文件名文件。

請注意幾個附加分:

  1. 您將能夠運行SecondClass.class雖然它的類是不是在原來的文件中公開!
  2. FirstClassMultiply的主要方法 的overloading完全罰款,但是,在唯一入口點您PROG 將與String args[]參數的主要方法。
相關問題