今回は、Javaプログラミングにおける抽象クラスの使用方法について学んでいきましょう。
問題
以下の抽象クラスとそのサブクラスに対するプログラムを実行したとき、出力はどれになりますか?
abstract class Vehicle {
abstract void start();
void stop() {
System.out.println("Vehicle stopped");
}
}
class Car extends Vehicle {
void start() {
System.out.println("Car started");
}
}
public class TestDrive {
public static void main(String[] args) {
Vehicle myCar = new Car();
myCar.start();
myCar.stop();
}
}
選択肢
- A. Vehicle stopped
- B. Car started & Vehicle stopped
- C. Car started
- D. コンパイルエラーが発生する
答えと解説
回答を見る
答え
B. Car started & Vehicle stopped
解説
基本説明:
この問題では、抽象クラスの使用やメソッドのオーバーライドを理解することが求められています。Javaでの抽象クラスとは、一部未完成のメソッド(抽象メソッド)を含むクラスで、実際のインスタンスは作成できません。このコードでは、抽象クラスであるVehicle
を継承したCar
クラスがstart
メソッドをオーバーライドしています。
誤答理由:
他の選択肢を見てみると、Aの「Vehicle stopped」は開始時の出力を含まず誤りです。Cの「Car started」はstop
メソッドが呼ばれていないため不完全です。Dはコンパイルエラーを示しますが、必要なメソッドが全て実装されているのでコンパイルエラーは発生しません。
つまずきポイント:
初心者には抽象クラスとその役割がイメージしづらいかもしれません。抽象クラスは”青写真”のようなもので、具体的な実装はサブクラスで行われることを意識してください。また、抽象クラスは直接インスタンス化できないため、サブクラスを用いて実行する必要があります。
発展知識:
抽象クラスとインターフェースの違いを知ることも重要です。インターフェースは契約を表し、抽象メソッドしか持てないのに対し、抽象クラスは既に実装されたメソッドも持てます。複雑な動作を伴う設計が必要な場合に抽象クラスを使用し、単に契約を定める場合にはインターフェースを使用するのが基本的なスタイルです。