今回のテーマに沿って、Javaの抽象クラスについて理解を深める問題を解いていきましょう。
問題
次のプログラムは正しくコンパイルされています。実行した場合に出力される結果を選んでください。
abstract class Vehicle {
abstract void startEngine();
void stopEngine() {
System.out.println("Engine stopped");
}
}
class Car extends Vehicle {
@Override
void startEngine() {
System.out.println("Car engine started");
}
}
public class Main {
public static void main(String[] args) {
Vehicle myVehicle = new Car();
myVehicle.startEngine();
myVehicle.stopEngine();
}
}
選択肢
- A. Car engine started Engine stopped
- B. Engine stopped Car engine started
- C. コンパイルエラー
- D. 実行時エラー
答えと解説
回答を見る
答え
A. Car engine started Engine stopped
解説
解説のポイント:
- 抽象クラスとは
- オーバーライドの理解
- インスタンス化の流れ
抽象クラスは、少なくとも1つの抽象メソッドを含むクラスであり、オブジェクトとして直接インスタンス化することは出来ません。しかし、抽象メソッドを持つことで、継承先で具体的な実装を提供させることを強制できます。
このコードでは、Vehicle
クラスはstartEngine
という抽象メソッドを持ち、stopEngine
という通常のメソッドがあります。Car
クラスがVehicle
を継承し、startEngine
をオーバーライドすることで、具体的な処理を提供しています。
メソッドの呼び出しについてはインスタンスの実際のクラスによるものであり、Vehicle
型の変数myVehicle
を通じてCar
クラスのメソッドが実行されます。このため、myVehicle.startEngine()
はCar
の実装を実行し、「Car engine started」が出力されます。その後stopEngine
はVehicle
のメソッドが呼び出され「Engine stopped」が続きます。