为什么Java主要方法是静态的?

Java main()方法的方法签名是:

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

这种方法是否有静态的原因?


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

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

JVM应该调用new JavaClass(int)吗? 它应该通过什么样的x

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

有很多边缘情况和含糊不清的情况让JVM必须在入口点被调用之前实例化一个类。 这就是为什么main是静态的。

我不知道为什么main总是public


这只是惯例。 实际上,即使名称main()和传入的参数也是纯粹的约定。

在Windows上运行java.exe(或javaw.exe)时,实际发生的情况是几个Java本地接口(JNI)调用。 这些调用加载了真正是JVM的DLL(没错 - java.exe不是JVM)。 当我们必须在虚拟机世界和C,C ++等世界之间建立桥梁时,JNI是我们使用的工具。反过来也是如此 - 根本不可能(至少据我所知)实际上得到运行JVM而不使用JNI。

基本上,java.exe是一个超级简单的C应用程序,它解析命令行,在JVM中创建一个新的String数组来保存这些参数,解析出您指定为包含main()的类名称,使用JNI调用来查找main()方法本身,然后调用main()方法,传入新创建的字符串数组作为参数。 这非常类似于当您使用Java反射时所做的 - 它只是使用容易混淆的本机函数调用。

编写您自己的java.exe版本(源代码与JDK一起发布)并且使其完全不同,这对您来说是完全合法的。 事实上,这正是我们用所有基于Java的应用程序所做的。

我们每个Java应用都有自己的启动器。 我们主要是这样做的,因此我们可以得到我们自己的图标和进程名称,但是在其他情况下,我们希望除了常规的main()调用之外还需要做一些其他的事情来派上用场,例如,在一种情况下,我们正在做COM互操作性,我们实际上将一个COM句柄传递给main()而不是一个字符串数组)。

所以,多空:它是静态的原因是B / C,这很方便。 它被称为'main'的原因是因为它必须是某种东西,而main()是他们在C的旧时代所做的(在那些日子里,这个函数的名字很重要)。 我想java.exe可以让你只指定一个完全合格的主要方法名称,而不仅仅是类(java com.mycompany.Foo.someSpecialMain) - 但是这会让IDE更难以自动检测'可启动“课程。


C ++,C#和Java中的main()方法是静态的,因为它们可以被运行时引擎调用,而无需实例化父类的实例。

链接地址: http://www.djcxy.com/p/72163.html

上一篇: Why is the Java main method static?

下一篇: puts() not printing out string in main() but prints fine in function