クラスとメソッド応用問題

以下のコードをコンパイル・実行したとき、どのような動作が起きますか? class Base { int x = 5; Base() { this.display(); } void display() { System.out.println("Base: " + x); } } class Derived extends Base { int x = 15; @Override void display() { System.out.println("Derived: " + x); } } public class Main { public static void main(String[] args) { Derived d = new Derived(); } }

A."Base: 5" が出力される
✗ Base のコンストラクタが実行されますが、this.display() は動的ディスパッチにより Derived のメソッドが呼ばれます。
B."Derived: 15" が出力される
✗ Derived のメソッドが呼ばれることは正しいですが、フィールド x は Derived インスタンス作成時にまだ初期化されていないため、値は 0(デフォルト値)になります。実際には "Derived: 0" が出力されます。
C."Derived: 5" が出力される← 正解
✓ 正解です。Base のコンストラクタで this.display() を呼ぶと、Derived のオーバーライドメソッドが実行されます。しかし Derived の x はまだ初期化されていないため 0 となり、"Derived: 0" が出力されます。
D."Base: 15" が出力される
✗ display() メソッドはオーバーライドされているため、Base のメソッドは実行されません。

Oracle Certified Java Programmer, Bronze SE の問題一覧