今回も問題を解いてみましょう。この問題は、Javaのポリモーフィズムとキャストに関する基礎的な理解をテストします。
問題
以下のコードを実行した場合の出力として正しいものはどれでしょうか?正しい選択肢を選んでください。
class Vehicle {
void start() {
System.out.println("Starting vehicle");
}
}
class Car extends Vehicle {
@Override
void start() {
System.out.println("Starting car");
}
void honk() {
System.out.println("Car horn");
}
}
public class Main {
public static void main(String[] args) {
Vehicle myVehicle = new Car();
myVehicle.start();
//追加行
((Car) myVehicle).honk();
}
}
選択肢
- A. Starting vehicle
- B. Starting car
- C. Runtimeエラーが発生する
- D. Starting car
Car horn
答えと解説
回答を見る
答え
D. Starting car
Car horn
解説
基本説明:Javaのポリモーフィズムでは、Javaのオブジェクトは、そのオブジェクト型のメソッドが実行時に見つけられます。これは、オーバーライドされているメソッドの場合に特に注目されます。この問題では、Vehicle
型の変数myVehicle
にCar
オブジェクトが保存されています。start()
メソッドはCar
クラスでオーバーライドされているため、このメソッドが呼び出されたときに実行されるのは「Starting car」というオーバーライドされたメソッドです。
さらに注目するのは、キャストです。(Car) myVehicle
により、myVehicle
がCar
型に強制変換され、その後にhonk()
メソッドが呼び出されます。これはCar
型のみが持つメソッドですので、この実行が成功すると「Car horn」が出力されます。よって、答えは「Starting car」と「Car horn」が両方出力されるDが正しい選択肢です。
誤答理由:選択肢A「Starting vehicle」を選んだ場合、ポリモーフィズムのメカニズムを誤解している可能性があります。実際に実行されるのはオーバーライドされたメソッドです。また、Bを選んだ場合、キャストに伴うメソッド呼び出しを忘れているかもしれません。選択肢CであるRuntimeエラーは、このキャストが失敗すると予想した場合ですが、実際には成功するため起こりません。
つまずきポイント:多くの初心者はオーバーライドとポリモーフィズムの関係、特にオブジェクトの型と実際のインスタンス型の関係において混乱しがちです。また、キャストが必要とされる状況も理解が難しいポイントの一つです。キャストを正しく使用する状況を理解することは、ポリモーフィズムを活かすプログラミングにおいて重要です。
発展知識:ポリモーフィズムは、Javaプログラミングにおいて非常に強力でよく使用される概念です。ポリモーフィズムは、開発者が共通のインターフェースを介して異なるオブジェクトを操作し、継承関係にあるクラス間でコードの再利用と統一性を促進します。さらにキャストについては、安全性と可読性の観点からも注意が必要です。キャストを誤って行うとClassCastException
が発生しますので、型の一致を意識して実装する必要があります。