今回は、オブジェクト指向プログラミングの基礎を強化する問題を解いていきましょう。
問題
次のプログラムを実行すると、どの出力になりますか?正しい選択肢を選んでください。
class Vehicle {
void move() {
System.out.println("Moving");
}
}
class Car extends Vehicle {
@Override
void move() {
System.out.println("Driving");
}
}
public class Main {
public static void main(String[] args) {
Vehicle myVehicle = new Car();
((Car) myVehicle).move();
}
}
選択肢
- A. Moving
- B. Driving
- C. コンパイルエラー
- D. 実行時エラー
答えと解説
回答を見る
答え
B. Driving
解説
解説のポイント:
- 参照型とオブジェクト型
- キャストによる型変換
- オーバーライドしたメソッドの呼び出し
- キャストの適用範囲と例外
このプログラムでは、オーバーライドしたメソッドの呼び出しに関する典型的な例を示しています。
ポイントは、参照型ではなく、実際のオブジェクトのクラスに依存するメソッドの動作です。
基本説明:
Javaでポリモーフィズムを使用する場合、スーパークラス型の参照変数にサブクラスのオブジェクトを持たせることができます。
この場合、オブジェクト自体はサブクラスの型(Car
)なので、オーバーライドされたメソッドが呼び出されます。
この問題のmyVehicle
はVehicle
型ですが、その実体はCar
です。
キャストを使ってCar
型に戻してからmove()
を呼ぶと、実際にはCar
のmove()
が呼ばれるため、「Driving」と表示されます。
誤答理由:
Aの「Moving」が選択されることがあるのは、オブジェクトのタイプと参照のタイプを混同した場合です。
また、キャストの理解が不足していると、CやDといった誤答になりがちです。
つまずきポイント:
キャストを用いるときの一般的なミスは、キャスト先の型が実際のオブジェクトの型と一致していないことです。
この場合は厳密に言えば、どちらもサブクラスであれば、キャストが可能でエラーは発生しません。
分からない場合は、明示的なキャストをしてからメソッド呼び出しを試すと理解しやすくなります。また、instanceof
演算子を使ってチェックすることも役立ちます。
発展知識:
ポリモーフィズムの重要なポイントは、コードの柔軟性と拡張性を高めることです。
例えば、変数がスーパークラス型であっても、プログラム実行時にサブクラスの異なるオブジェクトを代入して動作を変化させることができます。
さらに、これによりコードの再利用性が向上し、新しい種類のオブジェクトを追加する際に変更が最小限で済みます。
この技術を利用することで、拡張可能かつ保守しやすいシステム構築が可能です。