親クラスのコンストラクタが先
出力はどれか。
public class Main {
public static void main(String[] args) {
new C();
}
}
class A {
A() { System.out.print("A"); }
}
class B extends A {
B() { System.out.print("B"); }
}
class C extends B {
C() { System.out.print("C"); }
}
- A
ABC - B
CBA - C
C - D コンパイルエラーになる
正解と解説を見る
正解: A
- A: new C() は C のコンストラクタの先頭で暗黙の super() を呼ぶので、A → B → C の順に出力されます。
- B: 親のコンストラクタが先に終わるので、C から逆順にはなりません。
- C: 子のコンストラクタは必ず親のコンストラクタを先に呼ぶので、A と B も出力されます。
- D: どのクラスにも引数なしのコンストラクタがあるので、暗黙の super() は問題なくコンパイルできます。
ポイント
- サブクラスのコンストラクタの先頭には、書かなくても
super();が自動で入ります。親から順に実行されます。