Java主方法的方法签名是:

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

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


当前回答

Main()是静态的,因为;在应用程序生命周期的这一点上,应用程序堆栈本质上是过程化的,因为还没有实例化对象。

这是一个干净的石板。您的应用程序此时正在运行,即使没有声明任何对象(请记住,有过程性和OO编码模式)。作为开发人员,通过创建对象的实例并依赖于在其中编译的代码,将应用程序转换为面向对象的解决方案。

面向对象的优点有几百万个显而易见的理由。然而,大多数VB开发人员在代码中经常使用“goto”这样的关键字的日子已经一去不复返了。“goto”是VB中的一个过程命令,它被OO对应的方法调用所取代。

您还可以将静态入口点(main)视为纯粹的自由。如果Java足够不同,可以实例化一个对象,并在运行时只向你呈现该实例,那么你就别无选择,只能编写一个过程化应用程序。对于Java来说,这听起来可能难以想象,但可能有许多场景都需要过程化方法。

这可能是一个非常晦涩的回答。记住,“类”只是一个相互关联的代码的集合。“实例”是这个类的一个孤立的、活生生的、自主的代。

其他回答

该方法是静态的,否则就会产生歧义:应该调用哪个构造函数?特别是如果你的类是这样的:

public class JavaClass{
  protected JavaClass(int x){}
  public void main(String[] args){
  }
}

JVM是否应该调用新的JavaClass(int)?x应该通过什么?

如果不是,JVM是否应该实例化JavaClass而不运行任何构造函数方法?我认为不应该这样,因为那样会使你的整个类出现特殊情况——有时你有一个没有初始化的实例,你必须在每个可能被调用的方法中检查它。

在调用入口点之前,JVM必须实例化一个类,这有太多的边缘情况和模糊性,因此没有意义。这就是为什么main是静态的。

我不知道为什么main总是被标记为public。

这只是一种惯例。JVM当然可以处理非静态的主方法,如果这是惯例的话。毕竟,您可以在类上定义静态初始化器,并在到达main()方法之前实例化无数对象。

使用Java命令运行Java虚拟机(JVM)时,

java ClassName argument1 argument2 ...

当您执行您的应用程序时,您指定它的类名作为java命令的参数,如上所述

JVM尝试调用您指定的类的主方法

-在这一点上,类的对象还没有被创建。 将main声明为静态允许JVM在不创建的情况下调用main 类的实例。

让我们回到命令

ClassName是JVM的命令行参数,它告诉JVM要执行哪个类。在ClassName之后,您还可以指定一个字符串列表(由空格分隔)作为JVM将传递给应用程序的命令行参数。-这些参数可以用来指定运行应用程序的选项(例如文件名)-这就是为什么在main中有一个名为String[] args的参数

参考资料:Java™如何编程(早期对象),第十版

让我用更简单的方式来解释这些事情:

public static void main(String args[])

除了applet,所有Java应用程序都从main()开始执行。

关键字public是一个访问修饰符,允许从类外部调用成员。

使用Static是因为它允许调用main()而不必实例化该类的特定实例。

Void表示main()不返回任何值。

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