为什么o.super()inChild最终会调用Outer.Inner构造函数?这很简单:因为Child extends Outer.Inner, 和构造函数调用总是链接到层次结构中。
这是对您的代码段的轻微扩展以进行说明:
class Outer {
Outer() {
System.out.println("Outer");
}
void outerMethod() { }
class Inner {
Inner() {
System.out.println("OuterInner");
outerMethod();
}
String wealth;
}
}
class OuterChild extends Outer {
OuterChild() {
System.out.println("OuterChild");
}
}
public class OuterInnerChild extends Outer.Inner {
OuterInnerChild(Outer o) {
o.super();
System.out.println("OuterInnerChild");
this.wealth = "ONE MILLION DOLLAR!!!";
}
public static void main(String args[]) {
System.out.println(new OuterInnerChild(new Outer()).wealth);
new OuterChild();
}
}
这打印:
Outer
OuterInner
OuterInnerChild
ONE MILLION DOLLAR!!!
Outer
OuterChild
一些关键的观察:
- 因为
OuterInnerChild extends Outer.Inner,它继承wealth,就像正常的子类语义一样
- 就像正常的子类语义一样,
OuterInnerChild链的构造函数到构造函数Outer.Inner
- 因为
OuterChild extends Outer,它的构造函数链,即使没有显式调用
但是为什么编译器要求OuterInnerChild构造函数接受一个Outer o, 并被o.super()调用呢?
现在这是特定于内部类语义的:这样做是为了确保 的所有实例OuterInnerChild都有一个封闭的Outer实例Outer.Inner,即 的超类OuterInnerChild。否则,构造函数Outer.Inner将没有Outer要调用的封闭实例outerMethod()。