Java - 新实例未运行新的Instance Init Block

时间:2012-02-24 19:03:48

标签: java instance block init

据我了解,每次创建类实例时,实例init块都会运行。当我尝试测试时,实例init块为前两个创建的实例运行,但不是第三个。

以下是代码:

class ModuleInit {
    ModuleInit (int x) { System.out.println("1-arg const"); }
    ModuleInit () { System.out.println("No-arg const"); }
    static { System.out.println("First static init"); }
    { System.out.println("1st instance init"); }
    { System.out.println("2nd instance init"); }
    static { System.out.println("2nd static init"); }

    public static void main(String[] args)
    {
        new ModuleInit();
        new ModuleInit(8);
    }
}

这是输出:

First static init
2nd static init
1st instance init
2nd instance init
No-arg const
1st instance init
2nd instance init
1-arg const
               <---Missing instance init for ModuleInt(int x)?

我认为当创建带有int arg的新类实例(ModuleInit(8))时,应该有另一个实例init块运行。有人可以解释为什么这不会发生在这里吗?

1 个答案:

答案 0 :(得分:3)

实例初始化块作为构造函数中的第一行运行(即,在调用super()this()之后,无论是隐式的还是声明的),因此它们在构造函数打印出来之前运行它的一行:

First static init
2nd static init
1st instance init
2nd instance init
No-arg const
1st instance init  <---- They are right here...
2nd instance init  <---- They are right here...
1-arg const

此代码等同于:

class Module4 {
    Module4 (int x) { 
        System.out.println("1st instance init");
        System.out.println("2nd instance init");
        System.out.println("1-arg const"); 
    }
    Module4 () { 
        System.out.println("1st instance init");
        System.out.println("2nd instance init");            
        System.out.println("No-arg const"); 
    }
    static { System.out.println("First static init"); }
    //{ System.out.println("1st instance init"); }
    //{ System.out.println("2nd instance init"); }
    static { System.out.println("2nd static init"); }

    public static void main(String[] args)
    {
        new ModuleInit();
        new ModuleInit(8);
    }
}