编辑:澄清:
创建包含静态main的新类。在main方法中实例化同一个类。当JVM到达实例化主方法的代码行时,它会做什么?
(JVM如何知道在while循环期间"跳过"以下代码中的静态main()方法)
我问这个问题是因为我看不出把静态main放到你想要实例化的类中有什么好处,似乎把静态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");
}
}
输出:这是静态块
This is main
是构造函数
是构造函数
是构造函数
运行上面的代码,你会对这个有更好的了解。
main
方法在运行程序时由jvm调用。为什么要在实例化Test
类时调用它?
当你实例化一个类时,首先执行静态块。它只适用于第一次实例化,而不是所有实例化。(查看输出).
然后调用构造函数
如果查看输出,就会发现没有调用静态方法。静态方法只有在被调用时才会被调用。这就是为什么count()
在这种情况下没有执行。main
方法被JVM调用一次,启动程序,但之后它仍然是类的一个常规静态方法,直到它被调用才会执行。
事实证明,我正在寻找的答案(以及我试图问的问题)实际上是JVM如何引导和调用main。本机代码首先启动JVM,并使用STATIC调用main方法,以避免必须以某种方式(外部)先创建对象,然后从该对象调用main方法。
我对为什么main方法被"忽略"的困惑是对main方法如何被调用的误解——它是由JVM 在启动期间显式调用的,这是JAVA的约定——JVM就是这样构建和设计的,它是一个专用的方法。
所以在我的例子中,main作为一个方法,在main所属的类的每次实例化期间不会被调用(因为方法在实例化期间不会被隐式调用),我的印象是,每当一个类被实例化时,main就会被自动调用,因为它是"java主方法"——就好像它有一个钩子要调用。关键在于掌握STATIC以及JVM如何加载Main方法而不首先实例化它的外围类。这本质上是从JVM(包括本机)引导过程过程过渡到运行中的JAVA应用程序的更"纯粹"的面向对象能力。
希望这是有意义的,并希望它可以帮助别人澄清一些事情。