今回はJavaのクラス定義について学んでいきましょう。
問題
以下のコードスニペットを見て、出力される内容として正しいものを選んでください。
class Vehicle {
void startEngine() {
System.out.println("Vehicle engine started");
}
}
class Car extends Vehicle {
void startEngine() {
System.out.println("Car engine started");
}
}
public class TestDrive {
public static void main(String[] args) {
Vehicle myVehicle = new Car();
myVehicle.startEngine();
}
}
選択肢
- A. Vehicle engine started
- B. Car engine started
- C. コンパイルエラー
- D. 実行時エラー
答えと解説
回答を見る
答え
B. Car engine started
解説
この問題のポイントは、親クラスと子クラスのメソッドのオーバーライドについて学ぶことです。
- メソッドのオーバーライド
- 実行時のオブジェクト型の重要性
Javaでは、ポリモーフィズムを実現するために、親クラスの変数で子クラスのインスタンスを扱うことができます。この場合、実行されるメソッドは、インスタンスが指すクラスで定義されているものです。
上記のコードでは、Vehicle
型のmyVehicle
変数がCar
オブジェクトを保持しています。startEngine
メソッドの呼び出し時に、Car
クラスのメソッドが実行され、「Car engine started」が出力されます。
<strong>つまずきポイント: 多くの初学者は、変数の型を重視しすぎる傾向があります。Javaでは、変数が実際にどのクラスのインスタンスを参照しているかが重要です。変数の型自体はオブジェクトを保持するための場所を定義しているだけです。
発展知識: オーバーライドされたメソッドが呼ばれるのは、インスタンスが指すクラス型に基づきます。オーバーロード(引数が異なる同名のメソッドを定義)の場合はコンパイル時の基になるクラス型が重要であるため、オーバーライドとは異なる動作を理解する必要があります。