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

问题描述 投票:0回答:2

编辑:澄清一下:

创建一个包含 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++;
    }
}

}

java static jvm program-entry-point
2个回答
2
投票
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。


0
投票

事实证明我正在寻找的答案(以及我试图提出的问题)实际上是 JVM 如何引导和调用 main。首先启动 JVM 的是本机代码,并使用 STATIC 调用 main 方法,以避免首先以某种方式(外部)创建对象,然后从该对象调用 main 方法。

我对为什么 main 方法被“忽略”的困惑是对 main 方法如何调用的误解 - 它是由 JVM 在启动期间显式调用的,这是 JAVA 约定 - JVM 是构建的而且这样设计,是一种专用的方法。

因此,在我的示例中,main 作为一个方法,在 main 所属的类的每次实例化期间都不会被调用(因为在实例化期间不会隐式调用方法),我的印象是,每当类出现时,main 都会以某种方式自动调用由于它是“java main 方法”而被实例化 - 就好像它有一个要调用的钩子一样。关键在于掌握 STATIC 以及 JVM 如何在不首先实例化其封闭类的情况下加载 Main 方法。这本质上是从 JVM(包括本机)引导过程过程到正在运行的 JAVA 应用程序的更“纯粹”的面向对象能力的转变。

希望这是有道理的,并希望它可以帮助某人澄清一些事情。

© www.soinside.com 2019 - 2024. All rights reserved.