在实例化自己的类

时间:2015-05-21 04:48:43

标签: java compiler-construction static jvm main

编辑:澄清:

创建一个包含静态main的新类。在main方法中实例化同一个类。当JVM实例化它时,JVM在到达主方法代码行时会做什么?

(JVM如何知道"在while循环期间跳过"以下代码中的静态main()方法)

我问,因为我看不到将静态main放入你打算实例化的类中的任何好处,似乎只有将静态main放入"启动器&#似乎好多了? 34; class,仅为启动应用程序而构建..

对狗类感到困惑:

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++;
    }
}

}

2 个答案:

答案 0 :(得分: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()在这种情况下不执行的原因。 JVM一次调用main方法来启动程序,但是之后它仍然是类的常规静态方法,它不会超出它所调用的函数。

答案 1 :(得分:0)

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

我对主要方法被忽略的原因感到困惑&#34;误解了主要方法是如何被调用的 - 它在JVM 的启动过程中被显式调用,这就是JAVA约定--JVM是这样构建和设计的,这是一种专门的方法。

所以在我的例子中,main是一个方法,在main所属的类的每次实例化期间都没有被调用(因为在实例化过程中没有隐式调用方法),我的印象是每次都会以某种方式自动调用main。一个类是通过它是&#34; java主要方法&#34;来实例化的。 - 好像它有一个要被调用的钩子。关键在于掌握STATIC以及JVM如何加载Main方法而不首先实例化它的封闭类。这基本上是从JVM(包括本机)引导程序过程转换为更纯粹的#34;运行JAVA应用程序的面向对象功能。

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