Java主方法的方法签名是:

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

为什么这个方法必须是静态的?


当前回答

任何应用程序的真正入口点都是静态方法。如果Java语言支持实例方法作为“入口点”,那么运行时将需要在内部将其作为静态方法实现,该方法构造对象的实例,然后调用实例方法。

有了这些,我将研究选择以下三个选项中的一个的基本原理:

我们今天看到的静态void main()。 在新构造的对象上调用的实例方法void main()。 使用类型的构造函数作为入口点(例如,如果入口类被称为Program,那么执行将有效地由新的Program()组成)。

分解:

静态无效主()

调用外围类的静态构造函数。 调用静态方法main()。

void main ()

调用外围类的静态构造函数。 通过有效调用new ClassName()构造外围类的实例。 调用实例方法main()。

新ClassName ()

调用外围类的静态构造函数。 构造类的实例(然后不做任何操作,只是返回)。

理由是:

这个我倒着讲。

请记住,Java的设计目标之一是强调(尽可能要求)良好的面向对象编程实践。在这种情况下,对象的构造函数初始化对象,但不应该对对象的行为负责。因此,给出new ClassName()入口点的规范会使新Java开发人员感到困惑,因为它强制每个应用程序上的“理想”构造函数设计出现异常。

通过将main()设置为实例方法,可以解决上述问题。但是,它要求规范列出入口类的构造函数的签名以及main()方法的签名,从而增加了复杂性。

总而言之,指定静态void main()将创建复杂度最低的规范,同时遵循将行为置于方法中的原则。考虑到实现main()方法本身构造类的实例并调用实例方法是多么简单,将main()指定为实例方法并没有真正的优势。

其他回答

这只是一种惯例,但可能比另一种更方便。使用静态主程序,调用Java程序所需要知道的只是类的名称和位置。如果它不是静态的,您还必须知道如何实例化该类,或者要求该类具有空构造函数。

c++、c#和Java中的主要方法是静态的。

这是因为它们可以被运行时引擎调用,而无需实例化任何对象,然后main主体中的代码将完成其余的工作。

Static表示该方法是类方法。并且调用时不需要任何类的对象。

如果主方法不是静态的,则需要从程序外部创建主类的对象。你想怎么做呢?

最近,类似的问题也出现在了程序员网站上。SE

为什么在Java和c#中使用静态主方法,而不是构造函数? 从主要或次要来源中寻找一个明确的答案,为什么(特别是)Java和c#决定将静态方法作为它们的入口点-而不是通过应用程序类的实例表示应用程序实例,入口点是一个适当的构造函数?

公认的答案是,

In Java, the reason of public static void main(String[] args) is that Gosling wanted the code written by someone experienced in C (not in Java) to be executed by someone used to running PostScript on NeWS   For C#, the reasoning is transitively similar so to speak. Language designers kept the program entry point syntax familiar for programmers coming from Java. As C# architect Anders Hejlsberg puts it, ...our approach with C# has simply been to offer an alternative... to Java programmers... ...