オブジェクト指向の基礎応用問題

次のコードを実行したとき、出力結果として正しいものはどれですか? class Animal { String name = "Animal"; void speak() { System.out.println("..."); } } class Dog extends Animal { String name = "Dog"; @Override void speak() { System.out.println("Woof"); } } public class Main { public static void main(String[] args) { Animal a = new Dog(); System.out.println(a.name); a.speak(); } }

A.Dog Woof
✗ フィールドはポリモーフィズムの対象外です。参照型Animalのnameが参照されるためAnimalが出力されます。
B.Animal Woof← 正解
✓ 正解です。フィールドは参照型(Animal)のものが使われ、メソッドは実際のオブジェクト型(Dog)のものが呼ばれます。
C.Animal ...
✗ speakメソッドはDogでオーバーライドされているため、実行時型のDog#speakが呼ばれ「Woof」が出力されます。
D.Dog ...
✗ フィールドはポリモーフィズムの対象外のため「Animal」が出力され、speakは「Woof」が出力されます。

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