java - 为什么Java main 方法是静态的?

标签 java static program-entry-point

Java main方法的方法签名是:

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

这个方法必须是静态的有什么原因吗?

最佳答案

这只是惯例。事实上,即使是 main() 的名称,以及传入的参数都是纯粹的约定。

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

基本上,java.exe 是一个 super 简单的 C 应用程序,它解析命令行,在 JVM 中创建一个新的字符串数组来保存这些参数,解析出您指定为包含 main() 的类名,使用 JNI 调用找到 main() 方法本身,然后调用 main() 方法,传入新创建的字符串数组作为参数。这与您在 Java 中使用反射时所做的非常非常相似——它只是使用了命名困惑的 native 函数调用。

编写自己的 java.exe 版本(源代码与 JDK 一起分发)并让它做一些完全不同的事情是完全合法的。事实上,这正是我们对所有基于 Java 的应用所做的。

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

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

关于java - 为什么Java main 方法是静态的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/146576/

相关文章:

Java:startingPath 为 "public static final"异常

java - 这是静态类合理性的正确想法吗

java - 如何使用开关盒返回主菜单

java - 如何从 war 中运行应用程序?

java - Osgi同步服务

java - 如何在 Internet Explorer 中运行 selenium rc 测试用例

Java特殊字符替换

c# - 配置管理器和静态类

java - 在java中, "public static void main"可以重命名或重构吗?

java - 在哪里存储用于单元测试的二进制文件