オーバーライドしたメソッドの呼び出し
出力はどれか。
public class Main {
public static void main(String[] args) {
Animal a = new Dog();
System.out.println(a.sound());
}
}
class Animal {
String sound() { return "..."; }
}
class Dog extends Animal {
String sound() { return "Woof"; }
}
- A
Woof - B
... - C コンパイルエラーになる
- D 実行時に例外が発生する
正解と解説を見る
正解: A
- A: 変数の型は Animal でも、実際のオブジェクトは Dog なので、オーバーライドした Dog の sound() が呼ばれます。
- B: インスタンスメソッドは実際のオブジェクトの型で選ばれるので、Animal の sound() は呼ばれません。
- C: sound() は Animal に宣言されているので、Animal 型の変数から呼べます。
- D: すべて正しく初期化されていて、例外になる処理はありません。
ポイント
- 変数の型が Animal でも、呼ばれるのは 実体 (Dog) のメソッド です。