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)
- 为什么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) }
- 为何公开?
JVM安装在C或D驱动器中,因此可以在任何公共区域使用。
- 静电为什么?
main()
方法与对象无关,因此如果没有现有对象,JVM也必须调用此方法。 main
方法无法与对象相关。
- 为何无效?
JVM将调用main()
方法,但是如果main()
方法返回,JVM可以使用返回值做什么。 所以它意味着void
。