今回も問題を解いていきましょう。
問題
次のプログラムを実行した場合の出力はどれでしょうか?正しい選択肢を選んでください。
interface Vehicle {
void move();
}
class Car implements Vehicle {
public void move() {
System.out.println("Car is moving");
}
}
class Bike implements Vehicle {
public void move() {
System.out.println("Bike is moving");
}
}
public class Main {
public static void main(String[] args) {
Vehicle vehicle = new Car();
vehicle.move();
}
}
選択肢
- A. 車が動いている
- B. バイクが動いている
- C. Car is moving
- D. Bike is moving
- E. コンパイルエラー
答えと解説
回答を見る
答え
C. Car is moving
解説
基本説明:
インタフェースとは、クラスの契約書のようなもので、クラスが実装すべきメソッドを定義します。インタフェースを使うことで、異なる型のオブジェクトを同様の方法で扱うことができます。
クラスCar
とBike
は、インタフェースVehicle
を実装しており、それぞれmove()
メソッドを実装しています。
メインメソッドでVehicle
型のvehicle
変数をCar
オブジェクトで初期化しているため、vehicle.move()
を呼び出すとCar
クラスのmove
メソッドが実行されます。
誤答理由:
- AやBは英語ではないため除外されます。
- Cが正解です。"Car is moving"は
Car
の実装によるものです。 - Dは誤りです。なぜなら、
Bike
オブジェクトではなくCar
オブジェクトがvehicle
変数に設定されているからです。 - Eは誤りです。正しいインタフェースの実装があるため、コンパイルエラーにはなりません。
つまずきポイント:
インタフェースの正しい実装を理解することが重要です。
また、ポリモーフィズムの理解が求められます。インタフェース型の変数でキャストされたオブジェクトがどのクラスなのかを確認する必要があります。
もし複数のクラスが同じインタフェースを実装している場合、特定のクラスのメソッドが呼び出されることを意識することが求められます。
発展知識:
Javaのインタフェースは単なる契約に過ぎませんが、Java 8以降ではデフォルトメソッドや静的メソッドを持つことができるようになりました。
デフォルトメソッドは、インタフェース内での実装が提供されるメソッドで、実装クラスでオーバーライドされなくても動作します。
さらに、複数のインタフェースを一つのクラスで実装することが可能です。この特性を利用して、柔軟で再利用可能なコードを書くことができます。