変数の型に無いメソッドを呼ぶ
このコードを実行するとどうなるか。
public class Main {
public static void main(String[] args) {
Animal a = new Dog();
a.fetch();
}
}
class Animal {
}
class Dog extends Animal {
void fetch() { System.out.println("fetch"); }
}
- A
fetchと出力される - B 実行時に例外が発生する
- C コンパイルエラーになる
- D 何も出力されない
正解と解説を見る
正解: C
- A: 呼べるメソッドは変数の型で決まります。Animal に fetch() がないので、コンパイルエラーです。実行まで進まないので、何も出力されません。
- B: コンパイルの時点でエラーになるので、実行時の例外にはなりません。
- C: 変数 a の型は Animal で、Animal には fetch() がないのでコンパイルエラーになります。中身が Dog でも呼べません。
- D: コンパイルエラーなので実行できません。
ポイント
- 呼べるメソッドは 変数の型 (Animal) で決まります。Animal に fetch が無いのでコンパイルエラーです。
((Dog) a).fetch();とキャストすれば呼べます。
「参照型のキャストとポリモーフィックなメソッド呼び出し」をこのサイトで解く (記録・間違えた問題の解き直し・AI教師への質問)