今回は継承に関する問題に挑戦してみましょう。
問題
次のコードを実行した際の出力結果を選択肢から選んでください。コードには継承とオーバーライドが含まれています。
class Vehicle {
void startEngine() {
System.out.println("Engine of Vehicle started");
}
}
class Car extends Vehicle {
@Override
void startEngine() {
System.out.println("Engine of Car started");
}
}
public class Main {
public static void main(String[] args) {
Vehicle vehicle = new Car();
vehicle.startEngine();
}
}
選択肢
- A. Engine of Vehicle started
- B. Engine of Car started
- C. コンパイルエラー
- D. 実行時エラー
答えと解説
回答を見る
答え
B. Engine of Car started
解説
基本説明:
Javaにおける継承は、既存のクラス(スーパークラス)の機能を引き継いで新しいクラス(サブクラス)を作ることを指します。
サブクラスはスーパークラスのメソッドをそのまま使うことも、新たにオーバーライドして独自の実装を持たせることも可能です。
オーバーライドというのは、スーパークラスのメソッドをサブクラスで上書きすることを指し、見た目は同じメソッド名でも中身を変えることができます。
誤答理由:
選択肢Aの「Engine of Vehicle started」を選んでしまう方は、おそらく継承とオーバーライドの理解をもう一度深める必要があります。
実際に動作するのは、オブジェクトの実型が持つメソッドであり、今回の場合はCarクラスのstartEngine()
メソッドを呼び出します。
つまずきポイント:
Javaはポリモーフィズムをサポートしており、スーパークラス型の変数にサブクラスのインスタンスを代入できます。
変数の型に依存するのではなく、オブジェクトの実際の型に基づいてメソッド呼び出しが行われます。
このため、実際にはCarインスタンスの持つstartEngine()
のメソッドが呼び出されます。
発展知識:
ポリモーフィズムの利点は、コードの柔軟性と拡張性を高める点にあります。
例えば、新しいタイプのVehicle(例:Truckクラス)を追加しても、既存のコードにはほとんど変更を加えずに対応できるようになります。
これにより、プログラムの保守性が向上し、コードの再利用が進むため、より堅牢なシステムを構築することが可能です。