我只是想知道我们的主要方法实际上是从哪里调用的。就像在 Eclipse 中一样,当我们将它作为应用程序运行时,它会自动被调用。但是,如果我编写另一个具有相同签名但名称不同的方法,它不会被调用
6 回答
从文档中Java Virtual Machine
:
描述
java 工具启动 Java 应用程序。它通过启动 Java 运行时环境、加载指定的类并调用该类的 main 方法来做到这一点。方法声明必须如下所示:
公共静态无效主(字符串参数 [])
该方法必须声明为 public 和 static,它不能返回任何值,并且它必须接受一个 String 数组作为参数。默认情况下,第一个非选项参数是要调用的类的名称。应使用完全限定的类名。如果指定了 -jar 选项,则第一个非选项参数是包含应用程序的类和资源文件的 JAR 归档的名称,启动类由 Main-Class 清单头指示。
Java 运行时在三组位置搜索启动类和其他使用的类:引导类路径、已安装的扩展和用户类路径。
类名或 JAR 文件名之后的非选项参数传递给主函数。
javaw 命令与 java 相同,只是 javaw 没有关联的控制台窗口。当您不希望出现命令提示符窗口时,请使用 javaw。但是,如果由于某种原因启动失败,javaw 启动器将显示一个包含错误信息的对话框。
它在Java 语言规范 12.1中指定:
“Java 虚拟机通过调用某个指定类的 main 方法开始执行,并传递给它一个参数,该参数是一个字符串数组”
它由 JVM 自动调用,由JVMS指定(第 5.2 节。Java 虚拟机启动):
Java 虚拟机通过使用引导类加载器(第 5.3.1 节)创建一个初始类来启动,该类以依赖于实现的方式指定。Java 虚拟机然后链接初始类,对其进行初始化,并调用公共类方法
void main(String[])
。
因此,main()
很特别。JVM 不会自动调用具有相同签名但名称不同的不同方法。
main 方法是程序的入口点。它在程序启动时由 JVM 调用一次。
对于 *.jar 文件,您可以通过提供in来设置主类(即main()
要调用的类)。在命令行调用中,您只需执行. 您可以在您选择的 IDE 中设置这些(例如,在 IntelliJ Idea 中,它是“运行”菜单中“编辑配置”中的主类条目。我猜在 Eclipse 或 NetBeans 中,类似的东西。Main-Class: classname
manifest
java Main_class_name
当您执行 java 类时第 1 步:类文件被加载到 JVM
第 2 步:JVM 读取字节码
第 3 步:JVM 搜索所有关键字
第 4 步:JVM 搜索静态块
第 5 步:JVM 搜索异步块
第 6 步:JVM 创建一个 HASH MAP,其中 key 是优先级
第7步:根据优先级JVM从上到下执行静态块,从上到下异步块
第 8 步:在此 JVM 搜索带有声明的方法之后
public static void main (String args[])
并执行它
所以回答你的问题,当一个类被执行时,JVM调用main方法