オブジェクト指向の基礎応用問題
次のコードを実行したとき、出力結果として正しいものはどれですか? 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」が出力されます。