编辑:澄清一下:
创建一个包含 static main 的新类。在 main 方法中实例化同一个类。当 JVM 到达正在实例化的主方法代码行时会做什么?
(JVM如何知道在while循环中“跳过”下面代码中的静态main()方法)
我问这个问题是因为我看不到将 static main 放入您打算实例化的类中的任何好处,似乎只将 static main 放入“启动器”类中(专门为了启动而构建)要好得多申请..
让狗类感到困惑:
public class Dog {
private int height;
public static void main (String[] args) { // <---- What does the JVM do when it reaches here during the object instantiation?
int i = 0;
Dog [] dogArray = new Dog[20];
while (i < 20){
dogArray[i] = new Dog(); // Instantiate knew class
dogArray[i].height = i*10; //whatever
i++;
}
}
}
当然,创建两个类总是更好,在这种情况下:
public class Dog {
private int height;
getHeight{//etc...}
setHeight{//etc...}
}
public class launchApplication{
public static void main (String[] args) {
int i = 0;
Dog [] dogArray = new Dog[20];
while (i < 20){
dogArray[i] = new Dog(); // Instantiate knew class
dogArray[i].setHeight = i*10; //whatever
i++;
}
}
}
public class Test {
/**
* The constructor
*/
public Test() {
System.out.println("The is the constrcutor");
}
/**
* The main method
*
* @param args
*/
public static void main(String[] args) {
System.out.println("This is main");
new Test();
new Test();
new Test();
}
/**
* A static method
*/
public static void count() {
System.out.println("This is a static method");
}
/**
* A static block
*/
static {
System.out.println("This is the static block");
}
}
输出:
这是静态块
这是主要的
是构造函数
是构造函数
是构造函数
运行上面的代码,你会对此有更好的了解。
当您运行程序时,jvm 会调用
main
方法。为什么要在实例化 Test
类时调用它。
当你实例化一个类时,首先会执行静态块。这将是针对第一次实例化,而不是针对所有实例化。 (查看输出)。
然后构造函数将被调用。
如果查看输出,就会发现没有调用任何静态方法。静态方法只有在被调用时才会被调用。这就是为什么
count()
在这种情况下没有执行。 main
方法被JVM调用一次,以启动程序,但之后它仍然是类的常规静态方法,不会执行它所调用的util。
事实证明我正在寻找的答案(以及我试图提出的问题)实际上是 JVM 如何引导和调用 main。首先启动 JVM 的是本机代码,并使用 STATIC 调用 main 方法,以避免首先以某种方式(外部)创建对象,然后从该对象调用 main 方法。
我对为什么 main 方法被“忽略”的困惑是对 main 方法如何调用的误解 - 它是由 JVM 在启动期间显式调用的,这是 JAVA 约定 - JVM 是构建的而且这样设计,是一种专用的方法。
因此,在我的示例中,main 作为一个方法,在 main 所属的类的每次实例化期间都不会被调用(因为在实例化期间不会隐式调用方法),我的印象是,每当类出现时,main 都会以某种方式自动调用由于它是“java main 方法”而被实例化 - 就好像它有一个要调用的钩子一样。关键在于掌握 STATIC 以及 JVM 如何在不首先实例化其封闭类的情况下加载 Main 方法。这本质上是从 JVM(包括本机)引导过程过程到正在运行的 JAVA 应用程序的更“纯粹”的面向对象能力的转变。
希望这是有道理的,并希望它可以帮助某人澄清一些事情。