为啥 main 应该出现在 Java 类中? [复制]

Posted

技术标签:

【中文标题】为啥 main 应该出现在 Java 类中? [复制]【英文标题】:Why should main be present in a Java class? [duplicate]为什么 main 应该出现在 Java 类中? [复制] 【发布时间】:2013-08-28 13:43:17 【问题描述】:

我们为什么要声明main 方法?我知道main 方法是类的起点。但是为什么我们只应该将它声明为public static void main(String args[])

为什么我们不能将它声明为public static void test(String args[])main 是关键字吗? JVM 如何知道它将是起点?

【问题讨论】:

应用程序必须从某个地方开始,是吗?自从时间的黎明(1972 年?)main 一直是要走的路,为什么要在 java 中更改它? @sanbhat 这个问题措辞不明确,我会编辑。问题似乎是关于为什么该方法被命名为main,而不是为什么它需要是静态的。 这不是关键字。 “JVM 怎么知道它是起点?” --> 通过阅读它的名字“main” @chrylis OP 询问为什么名称为main,在我上面提到的问题中似乎是answered @sanbhat 对不起,在第二个答案中错过了。 【参考方案1】:

JVM 必须以某种方式知道程序的起点在哪里。设计者选择标记的方式是调用入口方法main,因为在 C 语言中使用相同的名称(当时大多数程序员都熟悉),这是有道理的。这个名字没有什么特别神奇的地方,他们只需要选择一些东西,这是一个实际的选择。

【讨论】:

【参考方案2】:

当一个程序开始时,它必须从某个地方开始。嗯,这就是main 方法。


为什么是静态的?

当JVM调用main方法时,被调用的类不存在对象。所以它必须有 static 方法才能从类中允许它。

为什么要公开?

JVM调用main方法运行项目范围外的方法。

为什么无效?

想一想,一旦main方法结束,并不代表程序结束。如果它产生一个新线程,则可能是这些线程仍在运行。

【讨论】:

据我所知,问题是关于名称 main 而不是签名的其余部分。【参考方案3】:

您的类中可以有许多方法,它们可以是公共的和静态的。 JVM如何决定哪个方法是启动程序。为了避免歧义,Java 语言为 JVM 执行的方法确定了一个特定的标准。这个标准说“一个自我可执行的类应该有一个具有以下签名的方法:

public static void main(String[] arg)   

这是该标准如何帮助 JVM

Public : 它允许 JVM 访问和执行你的类的方法 static : 该方法可以只通过类名执行(不创建对象) void :不返回任何内容(JVM 对您的方法不期望任何内容) main :为了使您的类能够自我执行,JVM 会查找此方法名称,并且您的程序的生命周期从该方法的第一条语句到该方法的最后一条语句都是有效的。一旦执行此方法的最后一条语句,您的程序就会终止并且 JVM 实例会终止。此名称标准还有助于 JVM 找到特定的入口点。如果 JVM 允许任何名称,那么它将是多个入口点,并且 JVM 会感到困惑。所以他们决定了一个入口点并将其命名为 main 。

【讨论】:

【参考方案4】:

为什么要声明 main 方法?我知道 main 方法是类的起点。但是为什么我们只能声明为public static void main(String args[])

基本上,因为它是这样定义的。 (他们决定使用“main”而不是其他名称的原因是“main”是用于 C 或 C++ 程序入口点的名称。)


为什么我们不能声明为 public static void test(String args[])?

因为这样 JVM 将无法找到入口点。假设,假设入口点方法可以是任何东西。现在考虑这个例子:

public class Test 
    public static void foo(String[] args)  ... 

    public static void bar(String[] args)  ... 

...还有这个命令行...

$ java Test

调用哪个方法? foo 方法? bar 方法?


这是主要的关键词吗?

没有。它只是一个众所周知的方法名。就核心 Java 语言而言,main 方法只是具有特定签名的方法。实际上,您可以在具有不同签名的同一类中拥有其他 main 方法。


JVM 如何知道它将是起点?

因为规定JVM使用main方法作为起点。


为什么 main 应该出现在 Java 类中?

嗯...您不必在每个类中都有main 方法...或者实际上任何类...如果您有其他方式来启动使用不同约定的JVM 条目观点。但除此之外,如果您希望您的应用程序可运行,您至少需要一个具有合适的main 方法的类。

【讨论】:

【参考方案5】:

It is static - 编译器无需创建对象即可进入方法 void - java 是平台无关的。因此,如果它返回一些东西,它可能会因平台而异

public - 用于访问

main() 是必需的,以便编译器可以进入您的应用程序。顾名思义,就是应该先执行的main方法。

【讨论】:

【参考方案6】:

JVM 遵循规范并以 JLS 的形式与开发人员共享该规范。 JVM 在其规范中提到以下形式的 main 方法是任何独立 java 应用程序的起点:

public static void main(String args[])

根据规格:

因此,作为开发人员,我们应该遵守 JVM 规范,以便 JVM 能够理解我们正在尝试做什么。

如果我的回答不是描述性的或无法理解的,请遵循规范:

Java 虚拟机通过调用 main 方法开始执行 一些指定的类,传递给它一个参数,这是一个 字符串数组

阅读更多:

http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html

【讨论】:

【参考方案7】:

您可以在没有 main 方法的情况下编译任何 Java 类,但如果没有 ma​​in() 方法,独立应用程序将无法运行。

主方法是定义为在应用程序启动时调用的方法。没有它,就没有地方开始运行。

【讨论】:

以上是关于为啥 main 应该出现在 Java 类中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在java中,有main方法的类叫啥类,没有main方法的类叫啥类

java中为啥要把main方法定义为一个static方法

为啥c#中的main方法总是放在类中而不是c++中

Flutter,BlocProvider 应该在 main 方法中吗?

java运行程序找不到main方法

为啥出现Exception in thread "main"