親の型の配列
出力はどれか。
public class Main {
public static void main(String[] args) {
Animal[] list = {new Dog(), new Cat(), new Animal()};
for (Animal a : list) {
System.out.print(a.name() + " ");
}
}
}
class Animal {
String name() { return "animal"; }
}
class Dog extends Animal {
String name() { return "dog"; }
}
class Cat extends Animal {
String name() { return "cat"; }
}
- A
dog cat animal - B
animal animal animal - C コンパイルエラーになる
- D
dog cat
正解と解説を見る
正解: A
- A: 配列の各要素の実体 (Dog・Cat・Animal) のメソッドが呼ばれるので、dog cat animal です。
- B: 変数の型は Animal でも、オーバーライドしたメソッドは実体の型で選ばれます。
- C: Animal[] に Dog や Cat (子クラス) を入れることはできます。
- D: 3つ目の要素 new Animal() も出力されるので、animal も表示されます。
ポイント
- 親の型の配列にサブクラスのインスタンスを入れられます。呼ばれるのはそれぞれの実体のメソッドです。
「参照型のキャストとポリモーフィックなメソッド呼び出し」をこのサイトで解く (記録・間違えた問題の解き直し・AI教師への質問)