なぜo.super()
inはコンストラクターChild
を呼び出すことになりますか?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()