さあ、Javaの重要な概念であるポリモーフィズムとキャストについて学びましょう。
問題
次のコードを実行したときの出力として正しいものを選んでください。
class Vehicle {
void start() {
System.out.println("Starting Vehicle");
}
}
class Car extends Vehicle {
@Override
void start() {
System.out.println("Starting Car");
}
}
public class Main {
public static void main(String[] args) {
Vehicle myVehicle = new Car();
myVehicle.start();
}
}
選択肢
- A. Starting Vehicle
- B. Starting Car
- C. コンパイルエラー
- D. 実行時エラー
答えと解説
回答を見る
答え
B. Starting Car
解説
基本説明: この問題では、Javaの継承とポリモーフィズムの特徴を理解することが求められています。プログラムは親クラスの型の変数(myVehicle
)に子クラスのオブジェクト(Car
)を代入しています。Javaでは、親クラスの型の変数で子クラスのオブジェクトを保持することができ、この際には実際のオブジェクトのクラスのメソッドが呼び出されます。
誤答理由: プログラムの動作を誤って「A. Starting Vehicle」とする方が多いのは、変数の型に惑わされ、Car
クラスがオーバーライドしているメソッドが起動することを理解できていないためです。Javaでは、変数の型にかかわらず、実際のオブジェクトのクラスで定義されたメソッドが実行されます。
つまずきポイント: 実行時にポリモーフィズムによってどのメソッドが呼び出されるか判断がつかずに迷うかもしれません。また、キャストが必要ないのか混乱を招くことがあります。Javaの特徴として、オーバーライドされたメソッドはオブジェクトが実際に属しているクラスのものが呼び出されることをしっかり理解しましょう。
発展知識: ポリモーフィズムはJavaの強力な機能で、柔軟な設計を可能にします。例えば、コレクションやリストとして扱え、追加するオブジェクトに関連する様々なサブクラスの実装を追加する場合、基底クラスの参照で扱うことが一般的になります。これにより、一定基準の機能は変えず、それぞれのオブジェクト固有の動作を実現することが可能です。