今回もJavaのポリモーフィズムの理解を深める問題に挑戦しましょう。
問題
以下のプログラムを実行した場合の出力はどうなるでしょうか?正しい選択肢を選んでください。
class Vehicle {
void start() {
System.out.println("Vehicle is starting");
}
}
class Car extends Vehicle {
@Override
void start() {
System.out.println("Car is starting");
}
}
class Bike extends Vehicle {
@Override
void start() {
System.out.println("Bike is starting");
}
}
public class Main {
public static void main(String[] args) {
Vehicle myVehicle = new Car();
myVehicle.start();
myVehicle = new Bike();
myVehicle.start();
}
}
選択肢
- A. Vehicle is starting
- B. Car is starting
- C. Car is starting
Bike is starting - D. Bike is starting
- E. コンパイルエラー
- F. 実行時エラー
答えと解説
回答を見る
答え
C. Car is starting
Bike is starting
解説
解説のポイント:
- オーバーライドの概念
- 参照型のキャストとインスタンスの関係
- 実行時のメソッド選択
Javaのポリモーフィズムは、スーパークラスの参照を持ちつつ、サブクラスのメソッドを動的に呼び出す機能です。
プログラム内でVehicle
型の変数myVehicle
は、まずCar
オブジェクトを参照しているため、start
メソッドを呼び出すとCar
クラスのstart
メソッドが実行され、「Car is starting」と出力されます。
次に、myVehicle
はBike
オブジェクトを参照するようassignされます。
このため、同じstart
メソッドの呼び出しであっても、今度はBike
クラスのstart
が実行され、「Bike is starting」と表示されます。
このように、実際にnew
で生成されたオブジェクトがどのクラスに属しているかによって実行されるメソッドが決定されます。