Java了解Java逻辑上的主要方法

主要方法是Java应用程序中最重要的方法,它将启动应用程序作为入口点。 在使用此方法之前发生的事情尚不清楚。 请有人帮助我理解/澄清在使用该方法之前发生的事情,根据方法签名纠正我的感知,如下所示:

  • JVM创建至少一个将访问main方法的Object。 此(假设)对象尝试根据API访问您的Java应用程序,这显然会将您绑定到已知方法签名public static void main (String[] args){}

    • public你不能限制JVM上的(假设的)单独对象访问你的对象,主要方法是单独完全看逻辑而不是API /签名吗?

    • static没有对象启动和运行来创建任何其他对象实例(除了假定的JVM之外)来实例化或创建对象。 静态修饰符意味着访问此方法的唯一可能性,因为它未绑定到实例,因此可以访问实例。 然而,这是逻辑,因为没有任何对象启动和运行(除了假定的JVM之外),还没有任何对象尚未实例化任何其他对象?

    • args跨语言和应用程序/可执行文件的标准,以提供自定义应用程序的能力?

这是接近和理解主要方法的正确和合理的方法吗?

你真正要问的并不完全清楚,但JVM规范第5.2节至少涵盖了其中的一部分:

Java虚拟机通过使用引导类加载器(第5.3.1节)创建一个初始类来启动,该类以依赖于实现的方式指定。 然后,Java虚拟机链接初始类,初始化它,并调用公共类方法void main(String [])。 调用此方法会驱动所有进一步的执行。 构成主方法的Java虚拟机指令的执行可以导致附加类和接口的链接(并因此创建),以及其他方法的调用。

在Java虚拟机的实现中,初始类可以作为命令行参数提供。 或者,该实现可以提供初始类,该类设置类加载器,该类加载器又加载应用程序。 初始类的其他选择是可能的,只要它们与前一段中给出的规范一致即可。

JLS第12.1节也有其他一些描述。

JVM直接调用main方法 – 它不需要创建新对象来执行此操作。 虽然main方法本身必须是公开的,但它声明的类却没有。 例如:

 public class Test { private static class EntryPoint { public static void main(String[] args) { System.out.println("Hi"); } } } 

然后执行:

 java 'Test$EntryPoint' 

按预期打印“Hi”。

除了通过特权reflection之外, Test类外部的代码都不能访问EntryPoint.main() – 或者JVM显然能够直接访问。

java首先启动它的核心 – java.lang,类加载器,系统属性,运行时等,然后查看它必须做什么。 在初始化JVM之前,该进程中没有“java”。 它只是一个本地进程,所以我认为在这种情况发生之前用Java术语思考是错误的。

现在JVM启动程序首先查看预主电源,按顺序调用它们(首先调用相应的静态块)然后查看main方法,如果有则调用类静态块; 最后调用main方法,将任何命令行参数传递给premain和main方法。

简单测试:

 public class Test { static{ System.out.println("Hi static 1"); } public static void main(String[] args) { System.out.println("Hi main"); } static{ System.out.println("Hi static 2 better to have 1 static block per class but you can have N "); } 

}

当您输入像java someClassName这样的命令时,就会发生流动的事情。 1.加载类someClassName并执行静态块(如果有的话)在类加载期间,将创建一个Object类,它将代表您的类。 2.它使用类名称(它不会创建您的类的任何对象)调用main方法,为什么main方法是静态的。

Demo.java说,文件Demo.java包含源代码

 public class Demo{ } 

当这个代码被编译为成功编译时

 $javac Demo.java 

但当它被执行时

 $java Demo 

然后它显示了一个特殊的错误

在类Demo中找不到的主要方法,请将main方法定义为:public static void main(String [] args)

所以编译器不负责检查是否存在main()方法。 JVM负责它。 JVM检查main()方法,原型为

 public static void main(Strings[] args) 
  1. 为什么JVM搜索main()方法? 是否可以将main()方法更改为任何其他方法main_hero()

JVM被指示从JVM内部查找main()方法。 是的,可以将main()方法更改为main_hero()方法,但在JVM中,您必须指示搜索main_hero()方法。

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

 JVM{ public static void main_hero(String[] args) } 
  1. 为何公开?

JVM安装在C或D驱动器中,因此可以在任何公共区域使用。

  1. 静电为什么?

main()方法与对象无关,因此如果没有现有对象,JVM也必须调用此方法。 main方法无法与对象相关。

  1. 为何无效?

JVM将调用main()方法,但是如果main()方法返回,JVM可以使用返回值做什么。 所以它意味着void