本日の問題に挑戦して、インタフェースの理解を深めましょう。
問題
次のプログラムがコンパイルされ、実行された場合の出力はどれになりますか?正しい選択肢を選んでください。
interface Sound {
void makeSound();
}
class Cat implements Sound {
public void makeSound() {
System.out.println("Meow");
}
}
class Tiger extends Cat {
public void makeSound() {
System.out.println("Roar");
}
}
public class MainClass {
public static void main(String[] args) {
Sound sound = new Tiger();
sound.makeSound();
}
}
選択肢
- A. Meow
- B. Roar
- C. コンパイルエラー
- D. 実行時エラー
答えと解説
回答を見る
答え
B. Roar
解説
基本説明:
この問題は、インタフェースとその実装クラスおよび、それを継承したサブクラスの働きを確認するものです。
インタフェースSound
が定義され、それをCat
クラスが実装しています。そしてCat
クラスをTiger
クラスが継承しています。
これにより、Tiger
クラスでもmakeSound
メソッドがオーバーライドされています。
ポイントとして、インタフェースを型として使っている場合でも、実際のオブジェクトがどのクラスのものかによってメソッドの動作が決まるという点が挙げられます。
誤答理由:
今回の選択肢の中で誤答が発生する理由として、親クラスであるCat
のmakeSound
が呼ばれると思い込むことが挙げられます。
実際には、ポリモーフィズムによりオーバーライドされたTiger
クラスのmakeSound
が呼ばれます。
つまずきポイント:
多くの人がつまずくポイントの一つは、インタフェース型の変数が実際にはインスタンスの型に基づいて動作することへの理解不足です。
これを理解するためには、ポリモーフィズムの概念をしっかりと把握する必要があります。ポリモーフィズムは、オブジェクト指向プログラミングの重要な概念であり、実際にどのメソッドが呼び出されるかは、オブジェクトの実際の型によって決まります。
発展知識:
Javaではインタフェースを使うことで、多様なクラスに共通の振る舞いを持たせることができます。
これは異なるクラスで共通の操作を表現したり、メソッドの実装を強制する際に非常に有用です。
また、オーバーライドの概念と組み合わせることでより柔軟な設計が可能になります。
多くのフレームワークやAPIは、このポリモーフィズムとインタフェースの特性を活用して、ユーザに柔軟性を提供しています。