今回も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 = getVehicle("car");
myVehicle.start();
}
static Vehicle getVehicle(String type) {
if (type.equals("car")) {
return new Car();
} else {
return new Bike();
}
}
}
選択肢
- A. Vehicle is starting
- B. Car is starting
- C. Bike is starting
- D. コンパイルエラー
- E. 実行時エラー
答えと解説
回答を見る
答え
B. Car is starting
解説
解説のポイント:
- オーバーライドメソッドと動的バインディング
- if-else条件分岐とリターン値の選択
Javaでは、オブジェクトの型によってどのメソッドが実行されるかが決まります。これはポリモーフィズムという概念によるもので、オブジェクトが実際にどのクラスのインスタンスであるかに応じたメソッドが動的に選ばれます。このため、Vehicle
型の変数myVehicle
はCar
のオブジェクトを指すようになり、start()
メソッドを呼び出すとCar
クラスのオーバーライドされたメソッドが実行され、「Car is starting」と出力されます。
このコード例では、getVehicle
という静的メソッドが与えられた文字列に応じて異なるサブクラスのインスタンスを返しています。type
が”car”であればCar
インスタンスが、そうでなければBike
のインスタンスが返されます。例ではgetVehicle("car")
が呼ばれるため、Car
のメソッドが実行されます。
多くの初学者はVehicle
型の変数でCar
やBike
の実際のインスタンスを保持できることに混乱を覚えるかもしれません。しかし、これがJavaの多態性の持つ強力な一面です。このメカニズムを理解することでコードの再利用性と柔軟性が大いに向上します。