親に引数なしコンストラクタが無い
このコードを実行するとどうなるか。
public class Main {
public static void main(String[] args) {
new B();
System.out.println("ok");
}
}
class A {
A(int x) { }
}
class B extends A {
B() { }
}
- A
okと出力される - B 実行時に例外が発生する
- C コンパイルエラーになる
- D 何も出力されない
正解と解説を見る
正解: C
- A: B() の先頭には暗黙の super() が入りますが、A には引数なしのコンストラクタがありません。実行まで進まないので、何も出力されません。
- B: コンパイルの時点でエラーになるので、実行時の例外にはなりません。
- C: A は A(int) だけを持つので、B() に入る暗黙の super() が呼べずコンパイルエラーになります。super(1) のように明示する必要があります。
- D: コンパイルエラーなので実行できません。「何も出力されない」とは違います。
ポイント
- B のコンストラクタには自動で
super();が入りますが、A に引数なしのコンストラクタがありません。 B() { super(1); }のように明示的に呼ぶ必要があります。