在实例化自己的类时,编译器如何处理Main



编辑:澄清:

创建包含静态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应用程序的更"纯粹"的面向对象能力。

希望这是有意义的,并希望它可以帮助别人澄清一些事情。

相关内容

  • 没有找到相关文章

最新更新