为什么 Java main 方法是静态的?
Java 方法的方法签名为:main
public static void main(String[] args) {
...
}
此方法必须是静态的,这是有原因的吗?
Java 方法的方法签名为:main
public static void main(String[] args) {
...
}
此方法必须是静态的,这是有原因的吗?
这只是惯例。事实上,即使是 main() 这个名字,以及传入的参数也纯粹是约定俗成的。
当你在Windows上运行java.exe(或javaw.exe)时,真正发生的是几个Java Native Interface(JNI)调用。这些调用加载真正的JVM的DLL(没错 - java.exe不是JVM)。JNI是我们在必须桥接虚拟机世界以及C,C++等世界时使用的工具。反之亦然 - 在不使用JNI的情况下,不可能(至少据我所知)实际运行JVM。
基本上,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更难自动检测项目中的“可启动”类。
该方法是静态的,因为否则会出现歧义:应该调用哪个构造函数?特别是如果你的类看起来像这样:
public class JavaClass{
protected JavaClass(int x){}
public void main(String[] args){
}
}
JVM 应该调用吗?它应该通过什么?new JavaClass(int)
x
如果不是,JVM 是否应该在不运行任何构造函数方法的情况下进行实例化?我认为这不应该,因为这会特殊地解决整个类的情况 - 有时你有一个尚未初始化的实例,你必须在可以调用的每个方法中检查它。JavaClass
有太多的边缘情况和歧义,以至于JVM必须在调用入口点之前实例化类。这就是为什么是静态的。main
我不知道为什么总是被标记。main
public