70

我对此有点陌生,所以请耐心等待。我目前正在学习 C# 和 Java,它们的相似之处之一是 main 函数需要封装在一个类中。例如

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

现在我明白了 main 通常是运行程序时的“入口点”。所以基本上,你的程序将在 main 函数所在的任何地方开始执行。但我相信在这两种语言中,您都可以在多个类中拥有多个主要功能。那么当我编译一个具有多个主要功能的项目时,“入口点”在哪里呢?编译器如何知道从哪里开始?

4

10 回答 10

58

在 Java 中,计算机在您实际执行程序时确定“入口点”,而不是在您编译时。例如,从命令行

java MyClass

main()在 中搜索MyClass。所有其他main()功能都被忽略。

如果您使用的是 IDE,那么您可以设置哪个类包含main()您要使用的功能。

于 2012-07-18T22:42:19.947 回答
57

在 .NET 中,您可以定义哪个类包含您在编译时要使用的 Main 方法。

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

在 Java 中,如果您要捆绑到一个 jar,您可以在 jar 的清单中定义您的入口点。

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

于 2012-07-18T22:42:27.153 回答
18

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

如果有多个Main方法,编译器不知道要使用哪个入口点,因此会显示错误。

需要指定要在编译时使用的Main方法:您可以在 Visual Studio 开发环境中或通过 csc 编译器指定要用作编译器选项的方法。

于 2012-07-18T22:49:16.643 回答
12

主类是一个特殊的类,原因只有一个:当您运行 Java 虚拟机时,该函数就是 JVM 调用的函数。它本质上与任何其他函数一样,实际上您可以从另一个类调用一个类的主函数。

当你编译一个包含多个类的项目时,你告诉 JVM 使用你想要使用的主类来运行这个类,如下所示:

java SomeClass

它将运行 SomeClass 的 main 方法,假设 SomeClass 已编译并且适当的编译文件在您的类路径中。(这是您必须使用特定操作系统解决的问题,但我认为 -cp 选项指定类路径是相当常见的)。所以这:

java -cp /home/MyName Someclass

将运行目录 /home/MyName 中的 SomeClass 的主要功能

于 2012-07-18T22:59:38.347 回答
10

/main:在 C# 中,您使用编译器选项指定入口点。

考虑以下包含两个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
于 2012-07-18T22:51:08.650 回答
7

正如其他人指出的那样,在 Java 中,您在运行java命令时定义包含 main 函数的类。

但是您也可以构建一个可执行的 jar,它可以使用java -jar my.jar. 在这种情况下,您需要一个在 jarMANIFEST.MF文件夹中调用的清单文件。META-INF在此文件中,您使用以下语句指定包含主函数的类:Main-Class: YourClass.

于 2012-07-18T23:11:16.937 回答
7

对于多个主函数入口点可以声明为:

在 Visual Studio 开发环境中设置此编译器选项

打开项目的属性页面。

单击应用程序属性页。

修改启动对象属性。

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

于 2012-07-19T02:26:57.607 回答
4

主要方法是静态的,这意味着它属于类而不是对象。所以对象内部根本不会有另一个主要方法。它不会有额外的 main 方法,因为 main 是静态的。所以每堂课一次。

如果您的项目中有多个主方法,您将在启动应用程序时指定要启动的主方法

于 2012-07-19T05:18:50.030 回答
2

事实上,在二进制文件中,例如windows中的PE格式和Linux或其他任何系统中的ELF格式,二进制文件的头部都会指定起始地址在哪里,并且只能有一个。

哪一个应该是切入点?这取决于链接器。就像@SetFreeByTruth 所说,您可以使用命令行参数指定它。许多链接器支持使用命令行参数指定入口点。例如,gnu 的gld 可以用参数-e 指定入口点。

我不知道 Java 的行为,因为它是由 Java 虚拟机加载的。

于 2012-07-25T03:56:23.093 回答
-1

在 Visual Studio 中,选择要作为入口点的项目,右键单击并设置为启动项目。

于 2016-12-12T20:40:44.400 回答