2012-07-18 63 views
67

我有點新,所以請耐心等待。我目前正在學習C#和Java,它們的一個相似之處在於主函數需要封裝在一個類中。例如多種主要功能

public class HelloWorld { 
    public static void main(String[] args) { 
     // Some Code 
    } 
} 

現在我明白,當你運行程序時,main通常是「入口點」。所以基本上,你的程序將在主函數的任何地方開始執行。但我相信在這兩種語言中,您可以在多個班級中擁有多個主要功能。所以當我編譯一個具有多個主函數的項目時,「入口點」在哪裏?編譯器如何知道從哪裏開始?

+13

每種語言的答案都不相同。 – 2012-07-18 22:42:23

回答

54

在.NET中,您可以定義哪些類包含編譯時要使用的Main方法。

http://msdn.microsoft.com/en-us/library/x3eht538.aspx

在Java中,如果你捆綁到一個罐子,你可以定義JAR的清單您的入口點。

http://docs.oracle.com/javase/tutorial/deployment/jar/appman.html

+9

我很驚訝這是最被投票回答的問題。至少對Java而言,來自Code-Guru和@CosmicComputer的答案似乎與大多數人更相關。我會說很少的開發者,除了少數航運「可執行」的罐子,曾經使用過清單方法。 – 2012-07-19 11:22:36

+3

@GeorgeHawkins在我看來,這是回答兩種語言問題的唯一答案,雖然對於_Java_,這可能不是最好的答案。 – 11684 2012-07-25 08:53:39

57

在Java中,計算機確定實際執行程序時的「入口點」,而不是編譯時。例如,從所述命令行

java MyClass 

搜索在MyClassmain()。所有其他main()函數都將被忽略。

如果您使用的是IDE,那麼您可以設置哪個類包含您要使用的main()函數。

+3

在Java中,它搜索'public static void main(String [] args)'。 – 2012-07-18 22:48:16

+7

@LuiggiMendoza是的,這是正確的。爲簡潔起見,我忽略了main()的完整簽名,因爲OP已經證明他知道它是什麼。 – 2012-07-18 22:50:52

+5

或者對於方法簽名'public static void main(String [])'或'public static void main(String ...)'*要非常精確。 – 2012-07-18 23:08:07

15

在C#中,您可以使用多個Main方法。

如果有多個Main方法,編譯器不知道使用哪個入口點,因此會顯示錯誤。

需要specify the Main method在編譯使用: 您可以指定用作在Visual Studio開發環境或通過CSC編譯器編譯器選項,方法。

+1

我不知道C#,但在Java中,這是不正確的。 Java編譯器不關心將使用哪個入口點;它會編譯所有這些。另一方面,運行時環境必須被告知要執行的入口點。 – 2012-07-18 22:52:54

+1

是啊...但這個答案是參考C#不是java – Anirudha 2012-07-18 22:56:20

+2

@代碼大師:答案是正確的C#,因爲程序集有一個編譯時指定的入口點 - 你*不*指定一個類名在執行時,只是程序集名稱。 – 2012-07-18 22:58:51

9

在C#中,使用/main:編譯器選項指定入口點。

考慮包含兩個main()功能如下代碼:

namespace Application { 
    class ClassOne { 
     static void main() { 
      // Code here 
     } 
    } 

    class ClassTwo { 
     static void main() { 
      // Code here 
     } 
    } 
} 

要使用ClassOne.main()作爲切入點,你會在編譯時指定下列內容:

csc /main:Application.ClassOne hello.cs 
12

的主類是一類特殊的只有一個原因:當您運行Java虛擬機時,該功能就是JVM調用的內容。它基本上和其他函數一樣,實際上你可以從另一個類調用一個類的主函數。

當您編譯多個類項目,你告訴JVM與您要使用的主類,像這樣運行的類:

java SomeClass 

,它會運行SomeClass的主要方法,假定SomeClass已編譯並且相應的已編譯文件位於您的類路徑中。 (這是你必須與你的特定操作系統一起工作的東西,但我認爲-cp選項指定一個類路徑相當平常)。所以這樣的:

java -cp /home/MyName Someclass 

將運行SomeClass的主要功能在目錄/ home/MYNAME

7

在Java中,正如其他人所指出的,當您運行java命令定義包含你的主要功能類。

但是你也可以建立一個可執行的jar文件,它可以使用java -jar my.jar運行。在這種情況下,您需要在jar中的文件夾META-INF中的名爲MANIFEST.MF的清單文件。在這個文件中,用下面的語句指定包含main函數的類:Main-Class: YourClass

4

的主要方法是靜態的,這意味着它屬於類而不是對象。所以這個對象根本就沒有其他的主要方法。它不會有一個額外的主方法,因爲main是靜態的。所以每堂課一次。

如果項目中有多個主方法,你將開始你的應用程序

+0

只是爲了澄清,一個類*可以有多個主要方法。例如,你可以使用'public static void main()'和'public static void main(String [])'。在Java中,運行時環境將查找後者簽名運行。 – 2012-07-19 14:30:46

2

事實上,當指定一個推出,在二進制文件,例如,在Windows PE格式和ELF格式的Linux或任何其他系統,二進制文件的頭文件將指定起始地址在哪裏,並且只能有一個。

哪一個應該是入口點?這取決於鏈接器。就像@SetFreeByTruth說的那樣,你可以用命令行參數來指定它。 許多鏈接程序都支持使用命令行參數指定入口點。例如,gnu的gld可以用參數-e指定入口點。

我不知道Java的行爲,因爲它是由Java虛擬機加載的。

-1

在Visual Studio中,選擇要作爲入口點的項目,右鍵單擊並設置爲啓動項目。

+0

這將是「啓動項目」,但這不是他們的意思。如果您在一個項目/程序集*中有多個潛在入口點*,則可以打開項目屬性並從應用程序窗格中的「啓動對象」下拉列表中進行選擇。 – dlatikay 2016-12-12 20:47:06