为什么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()
。