Java Silver試験範囲のオーバーロード、オーバーライド、隠蔽についての理解を深める問題です。
問題
次のコードが正しくコンパイルされ、実行された場合の出力を選択肢から選んでください。
class Vehicle {
void honk() {
System.out.println("Vehicle is honking");
}
}
class Car extends Vehicle {
@Override
void honk() {
System.out.println("Car is honking");
}
void honk(int volume) {
System.out.println("Car is honking at volume: " + volume);
}
}
public class Main {
public static void main(String[] args) {
Vehicle myVehicle = new Car();
myVehicle.honk();
}
}
選択肢
- A. Vehicle is honking
- B. Car is honking
- C. Car is honking at volume: 0
- D. コンパイルエラー
- E. 実行時エラー
答えと解説
回答を見る
答え
B. Car is honking
解説
解説のポイント:
- メソッドのオーバーロードとオーバーライドの違い
- Javaのポリモーフィズムによる動作
この問題では、Javaにおけるメソッドのオーバーライドとオーバーロードの理解がキーとなります。
まず、オーバーライドとはスーパークラスのメソッドをサブクラスで再定義することです。今回、Car
クラスはVehicle
クラスのhonk
メソッドをオーバーライドしています。
一方、オーバーロードは同一クラス内で引数の型や数が異なるメソッドを同じ名前で定義することです。Car
クラスのhonk(int volume)
はオーバーロードの例です。
さて、Vehicle
型の変数myVehicle
はCar
オブジェクトを指しています。この場合、オーバーライドされたCar
クラスのhonk
メソッドが呼び出され、「Car is honking」と出力されます。
つまずきポイント:
- オーバーロードとオーバーライドの異なる概念を混同しないようにしましょう。
- 実行時のポリモーフィズムにより、参照型が持つメソッドではなく、実際のオブジェクトのメソッドが呼び出されることを理解しましょう。
発展知識:
- オーバーロードされたメソッドは静的な結合ですが、オーバーライドされたメソッドは動的結合です。これはJavaのポリモーフィズムの基本であり、オーバーライドされたメソッドは実際のオブジェクトインスタンスに基づいて決定されます。
- メソッドのオーバーライドには
@Override
アノテーションを使うとコンパイル時にエラーチェックが強化され、スーパークラスのメソッドを正確にオーバーライドしていることを保証できます。