今回も問題を解いていきましょう。
問題
次のインタフェースとクラスに関するプログラムを実行した場合の出力はどれでしょうか?正しい選択肢を選んでください。
interface SoundMaker {
void makeSound();
}
class Animal implements SoundMaker {
public void makeSound() {
System.out.println("Animal sound");
}
}
class Cat extends Animal {
public void makeSound() {
System.out.println("Meow");
}
}
public class Main {
public static void main(String[] args) {
SoundMaker myCat = new Cat();
myCat.makeSound();
}
}
選択肢
- A. Animal sound
- B. Meow
- C. コンパイルエラー
- D. 実行時エラー
答えと解説
回答を見る
答え
B. Meow
解説
解説のポイント:
- インタフェースと実装クラス
- オブジェクト型とインスタンス型の剥離
まず、インタフェースという概念について説明します。インタフェースは、クラスに「このようなメソッドを必ず実装してください」と契約を交わすためのテンプレートのようなものです。
このプログラムでは、SoundMaker
というインタフェースを作成し、その中にmakeSound
というメソッドを定義しています。Animal
クラスはこのインタフェースを実装しているため、必ずmakeSound
メソッドを持たないといけません。この方法により、Animal
がSoundMaker
インタフェースを「契約」し、その契約に基づく行動(=メソッドの実装)が保証されます。
さらに、このプログラムではCat
クラスがAnimal
クラスを継承し、makeSound
メソッドをオーバーライドしています。このオーバーライドが効果を発揮するのは、変数がSoundMaker
型であってもオブジェクトがCat
型であるためです。Polymorphism
(多態性)という概念によって、実際のオブジェクト型(Cat
)のメソッドが実行されます。
Javaでのポリモーフィズムの面白さは、インタフェースやスーパークラス型の変数が、実際にはサブクラス型のインスタンスを指す点にあります。これが抽象と具象の剥離を可能にし、オブジェクト指向プログラミングの強力な特性の一つとなります。このようにオーバーライドされたメソッドのみが実行されることにより、正解はB. Meowとなるのです。
つまずきポイントと発展知識
この問題でつまずくポイントとしては、インタフェースの理解が挙げられます。多くの場合、インタフェースという概念が初めて登場する際には、クラスと何が違うのか戸惑うことがあるでしょう。
また、Javaにおけるポリモーフィズムの仕組みについても、変数型とインスタンス型が異なるケースに慣れないかもしれません。このような部分はしっかりと理解しておくことで、後々登場するデザインパターンなどの高度な話題にもついていきやすくなるでしょう。
発展知識として、Javaでは多重実装が可能であるという点も理解しておくと良いでしょう。これは、1つのクラスが複数のインタフェースを実装できる性質で、異なるインタフェースの契約を一度に満たせることから、コードの再利用性と拡張性に大きく寄与します。
また、Javaの標準ライブラリにも多くのインタフェースが存在し、それを活用することでオブジェクトの使いやすさやコードの一貫性を維持することができます。