Javaのインタフェースに関する問題を解いてみましょう。インタフェースとその実装方法について理解を深めます。
問題
次のプログラムを実行した場合の出力はどれでしょうか?正しい選択肢を選んでください。
interface Vehicle {
void start();
}
class Car implements Vehicle {
public void start() {
System.out.println("Car started");
}
}
class Bike implements Vehicle {
public void start() {
System.out.println("Bike started");
}
}
public class Main {
public static void main(String[] args) {
Vehicle vehicle1 = new Car();
Vehicle vehicle2 = new Bike();
vehicle1.start();
vehicle2.start();
}
}
選択肢
- A. Car started Car started
- B. Car started Bike started
- C. Bike started Car started
- D. コンパイルエラー
- E. 実行時エラー
答えと解説
回答を見る
答え
B. Car started Bike started
解説
解説のポイント:
- インタフェースの実装
- 多態性(ポリモーフィズム)
まず、Vehicle
というインタフェースがあります。このインタフェースには、start()
というメソッドが定義されています。
Car
とBike
はVehicle
インタフェースを実装しており、それぞれstart()
メソッドをオーバーライドしています。このように、インタフェースを使うことで異なるクラスに共通のメソッド実装を保証できます。
プログラムの中でVehicle
型の変数vehicle1
にCar
オブジェクトが、vehicle2
にBike
オブジェクトが格納されています。これにより、それぞれのstart()
メソッドがそれぞれのオブジェクトに適した形で実行されます。
この設計により、vehicle1.start()
が呼ばれると「Car started」が出力され、vehicle2.start()
が呼ばれると「Bike started」が出力され、つまり選択肢Bが正解となります。
基本説明
インタフェースは、クラスがどのようなメソッドを持つべきかを規定する契約書のようなものです。インタフェースを実装することで、そのクラスはインタフェースで定義されたメソッドの実装を提供する必要があります。これは、異なるクラスが共通の動作を持つことを保証するためのJavaの仕組みです。
今回の問題では、Vehicle
というインタフェースがあり、これをCar
とBike
が実装しています。それぞれが独自にstart
メソッドを持つため、Vehicle
型の変数でも正しい実装が呼ばれます。
誤答理由
選択肢AやCのように同じオブジェクトが二回start
されることはありません。B以外を選ぶと、異なるインスタンスを同じものであると誤解している可能性があります。
また、選択肢DとEを選択すると、インタフェースの基本的な実装と多態性の理解に欠けている可能性があります。Javaのコンパイルにおけるポリモーフィズムの特性により、正しく実装されていればコンパイルも実行も正常に動作するはずです。
つまずきポイント
初学者がつまずきがちな点は、インタフェースの実装とそれを利用したポリモーフィズムです。インタフェースは「何をするか」を定義し、それをどのようにするかは実装するクラスに委ねます。この特性を理解するには、具体的なオブジェクトをインタフェース型の変数に入れ、そのメソッドを呼び出す体験が必要です。
最初はオブジェクトの具体的なクラスが何かわかりにくいかもしれませんが、Vehicle vehicle1 = new Car();
のように、インタフェース型の変数によってオブジェクトのメソッドを統一的に操作できることを確認すると良いです。
発展知識
インタフェースはJavaの多態性を利用した設計で、大規模なアプリケーションで各部分を疎結合に保つために用いられます。近年ではJava 8から導入されたデフォルトメソッドや静的メソッドによるインターフェースの進化も注目されます。
デフォルトメソッドを使うことで、インタフェース内でも具体的な実装を持たせることが可能になりました。これは、既存のインタフェースを実装するすべてのクラスに影響を与えずに、新しいメソッドを追加したいときに便利です。このように、Javaのインタフェースはただの契約を超えて柔軟な振る舞いを提供するオブジェクト指向設計の重要な要素になっています。