親のコンストラクタからオーバーライドしたメソッドを呼ぶ
出力はどれか。
public class Main {
public static void main(String[] args) {
new B();
}
}
class A {
A() { show(); }
void show() { System.out.println("A"); }
}
class B extends A {
int x = 5;
void show() { System.out.println("B" + x); }
}
- A
B0 - B
B5 - C
A - D コンパイルエラーになる
正解と解説を見る
正解: A
- A: A() から呼ばれる show() は B のオーバーライドです。この時点では B のフィールド x = 5 がまだ設定されていないので、初期値の 0 で B0 になります。
- B: フィールドの初期化 (x = 5) は親のコンストラクタが終わった後に行われるので、まだ 5 ではありません。
- C: インスタンスメソッドは実際のオブジェクト (B) の型で選ばれるので、コンストラクタの中でも B の show() が呼ばれます。
- D: コンストラクタからオーバーライドされるメソッドを呼ぶことは、文法上は問題ありません。
ポイント
- 親のコンストラクタの中でも、オーバーライドされた B の show() が呼ばれます。
- その時点ではまだ B のフィールドの初期化 (
x = 5) が行われていないので、x は 0 です。