抽象クラスとその活用法について、理解を深めるための問題を解いてみましょう。
問題
次のプログラムを実行した場合、出力結果はどれになるでしょうか?正しい選択肢を選んでください。
abstract class Vehicle {
abstract void startEngine();
void displayVehicleType() {
System.out.println("Unknown Vehicle");
}
}
class Car extends Vehicle {
void startEngine() {
System.out.println("Car engine started");
}
@Override
void displayVehicleType() {
System.out.println("This is a Car");
}
}
public class Main {
public static void main(String[] args) {
Vehicle myVehicle = new Car();
myVehicle.startEngine();
myVehicle.displayVehicleType();
}
}
選択肢
- A. Car engine started
- B. This is a Car
- C. Unknown Vehicle
- D. Car engine started
This is a Car - E. コンパイルエラー
答えと解説
回答を見る
答え
D. Car engine started
This is a Car
解説
解説のポイント:
- 抽象クラスと抽象メソッド
- メソッドのオーバーライド
抽象クラスとは、抽象的な概念を持ち、直接インスタンス化できないクラスです。抽象メソッドを持つ場合は、サブクラスにおいて必ずそのメソッドが実装されなければなりません。
今回のプログラムでは、Vehicle
クラスは抽象クラスで、startEngine
という抽象メソッドを持っています。Vehicle
を継承したCar
クラスで、この抽象メソッドが具体的に実装されています。
メソッドdisplayVehicleType
もCar
クラスでオーバーライドされています。オーバーライドとは、親クラスのメソッドをサブクラスで上書きすることを指します。
このプログラムを実行すると、まずstartEngine
メソッドが呼ばれ、「Car engine started」が出力されます。続いて、オーバーライドされたdisplayVehicleType
が呼ばれ、「This is a Car」が表示されます。
このように、サブクラスでは基底クラスの抽象メソッドを具体化し、必要に応じてオーバーライドすることで、特定の動作を実現できます。
つまずきポイント:
抽象クラスの概念や、オーバーライドの理解がまだ不十分ですと、問題文にあるオーバーライドされたメソッドを見逃し、誤答に至る可能性があります。オーバーライドの判別は通常、@Overrideアノテーションを活用することでも明確に確認できます。
発展知識:
抽象クラスは抽象メソッドを持たなくても定義できますが、抽象メソッドを持つ場合は必ず抽象クラスである必要があります。また、Javaにはもう一つ「インターフェース」というものがあります。これも「抽象クラス」と同様に、一種のテンプレートですが、継承の方法や使い方に幾つかの違いがあります。インターフェースは複数の実装を持つことができ、記述だけでなく構造の設計の段階で大いに役立ちます。