今回も問題を解いていきましょう。
問題
次のプログラムを実行した場合の出力はどれでしょうか?正しい選択肢を選んでください。
class Vehicle {
void start() {
System.out.println("Vehicle starting");
}
}
class Car extends Vehicle {
@Override
void start() {
System.out.println("Car starting");
}
}
class ElectricCar extends Car {
void charge() {
System.out.println("Car charging");
}
}
public class Main {
public static void main(String[] args) {
Vehicle myVehicle = new ElectricCar();
myVehicle.start();
}
}
選択肢
- A. Vehicle starting
- B. Car starting
- C. Car charging
- D. コンパイルエラー
- E. 実行時エラー
答えと解説
回答を見る
答え
B. Car starting
解説
解説のポイント:
- オーバーライドと継承
- オブジェクト型と実際のクラス型の違い
Javaにおける継承とメソッドのオーバーライドは、特にクラスのデザインにおいて重要な役割を果たします。
このコードでは、最上位のクラスVehicle
からCar
が継承され、さらにElectricCar
が継承されています。
オーバーライドされたメソッドstart()
は、実際のオブジェクトのクラスに基づいて実行され、myVehicle
がElectricCar
オブジェクトを参照しているため、中間クラスのCar
のstart()
メソッドが呼び出されます。
これは、ポリモーフィズムの原則により、オブジェクトの実際の型(この場合はElectricCar
)がメソッドの選択に影響を与えるためです。
基本説明
Javaでは、クラスは他のクラスを継承することができます。
これは、コードの再利用性を高めるための非常に強力な機能です。
継承では、サブクラスはスーパークラスのプロパティとメソッドを引き継ぐことができます。Javaでは、@Override
アノテーションを使用して、スーパークラスのメソッドをサブクラスでオーバーライドすることをすることができます。
このオーバーライドされたメソッドは、プログラムが実行されるときに、実際のオブジェクトのクラスに応じて呼び出されます。
誤答理由
A. Vehicle starting:この回答は、Vehicle
クラスのstart()
メソッドが呼び出された場合の出力です。
オーバーライドされたメソッドが存在する場合、実際のオブジェクトのクラスで定義されたメソッドが優先されるため不正解です。
C. Car charging:このメソッドcharge()
は、ElectricCar
クラスだけに存在します。
Vehicle
型の変数からは直接呼び出すことができません。
D. コンパイルエラー:コードに構文的な誤りはありません。
E. 実行時エラー:実行時にもエラーは発生しません。
つまずきポイント
初心者がつまずきやすいポイントとして、
オブジェクトの型とそれが指す実際のオブジェクトが異なる場合に、どちらのメソッドが呼び出されるかという点があります。
これは「ポリモーフィズム」というJavaの特徴的な性質に依存しています。
ポリモーフィズムは、違う型を実際のオブジェクト型に対応する形で扱うというもので、メソッド呼び出しに柔軟性を持たせます。
発展知識
ポリモーフィズムは、Javaおよびオブジェクト指向プログラミングの強力な機能であり、ソフトウェアの設計において役立ちます。
特に、インターフェースを使用することで異なる実装を持つクラス群を同じ方法で処理することが可能になります。
また、メソッドオーバーライドの他に、メソッドオーバーロードという概念もあり、同名メソッドに対する異なるパラメータセットを持たせることができます。
これらの概念を理解し、適切に使いこなすことで、より一層応用力の高いプログラミングが可能となります。