在 The Java Tutorials - Initializing Fields中,有关于实例初始化块(Instance Initializer)的描述:
Java 编译器将初始化程序块复制到每个构造函数中。因此,这种方法可用于在多个构造函数之间共享代码块。
如果释义正确,则为以下代码:</p>
public class ConstructorTest {
public static void main(String[] args) {
Child c = new Child();
}
}
class Parent {
Parent() {
System.out.println("Parent non-argument Constructor");
}
}
class Child extends Parent {
{
System.out.println("Child Instance Initialization Block");
}
Child() {
this(2);
System.out.println("Child no-argument Constructor");
}
Child(int i) {
this(10, i);
System.out.println("Child 1-argument Constructor");
}
Child(int i, int j) {
System.out.println("Child 2-argument Constructor");
}
}
输出应该是:</p>
Parent non-parm Constructor
Child Instance Initialization Block
Child 2-argument Constructor
Child Instance Initialization Block
Child 1-argument Constructor
Child Instance Initialization Block
Child no-argument Constructor
但实际输出的是:</p>
Parent non-argument Constructor
Child Instance Initialization Block
Child 2-argument Constructor
Child 1-argument Constructor
Child no-argument Constructor
是我误解了那句话的意思,还是描述不够准确?</p>
还有一个关于显式构造函数调用的疑问:
基于两个基础:</p>
- 如果存在,另一个构造函数的调用必须是构造函数的第一行。
- 在一个构造函数内部,使用 this() 调用另一个构造函数,使用 super() 直接调用超类对应的构造函数。
MEANS 在子类的构造函数中使用 this() 是否会隐式删除对超类的无参数构造函数的默认调用?
谢谢回复。