据我了解,每次创建类实例时,实例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块运行。有人可以解释为什么这不会发生在这里吗?
答案 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);
}
}