今回は、オブジェクト指向の要であるポリモーフィズムを題材にした問題です。
問題
以下のコードを実行した場合に出力される内容を選択してください。
class Vehicle {
void start() {
System.out.println("Vehicle starts");
}
}
class Car extends Vehicle {
@Override
void start() {
System.out.println("Car starts");
}
}
public class Main {
public static void main(String[] args) {
Vehicle vehicle = new Car();
vehicle.start();
}
}
選択肢
- A. Vehicle starts
- B. Car starts
- C. コンパイルエラー
- D. 実行時エラー
答えと解説
回答を見る
答え
B. Car starts
解説
この問題の中心となるのは、ポリモーフィズムとオーバーライドの概念です。
- 基本説明:
Javaでは、サブクラスがスーパークラスのメソッドをオーバーライドすることができます。
プログラムでは、Vehicle
型の変数vehicle
がCar
オブジェクトを参照しています。
このため、start()
メソッドを呼び出すと、実体であるCar
クラスのオーバーライドされたstart()
メソッドが実行され「Car starts」と出力されます。
- 誤答理由:
選択肢Aの「Vehicle starts」は誤りです。これはオーバーライドされない場合の出力です。
選択肢C,Dはコンパイルエラーや実行時エラーの選択肢ですが、問題のコードは正しい構文ですのでそれに該当しません。
- つまずきポイント:
初心者がつまずきやすいのは、変数の型と実体の型の違いです。
Vehicle
型の変数は常にVehicle
のメソッドを使うと思いがちですが、実体の型であるCar
のオーバーライドしたメソッドが呼び出されることを理解する必要があります。
- 発展知識:
Javaのポリモーフィズムについて深く理解を進めると、デザインパターンやインターフェースを効果的に利用するスキルも向上します。
例えば、次のような場合を考慮すると、ポリモーフィズムによってコードの柔軟性が高まります。
複数の型を統一して取り扱いたい場合など、設計思想としてのポリモーフィズムの採用は強力です。