// 抽象クラス Vehicle の定義
abstract class Vehicle {
// 抽象メソッド startEngine() の宣言
public abstract void startEngine();
}
// 具象クラス Car の定義
class Car extends Vehicle {
// startEngine() メソッドの実装
@Override
public void startEngine() {
System.out.println("Car engine started.");
}
}
// 具象クラス Motorcycle の定義
class Motorcycle extends Vehicle {
// startEngine() メソッドの実装
@Override
public void startEngine() {
System.out.println("Motorcycle engine started.");
}
}
// メインクラス
public class Main {
public static void main(String[] args) {
// Vehicle クラスをインスタンス化しようとするとエラーが発生する
// Vehicle myVehicle = new Vehicle(); // これはエラー
// 代わりに具象クラスを使用する
Vehicle myCar = new Car();
Vehicle myMotorcycle = new Motorcycle();
// 具象クラスの startEngine() メソッドを呼び出す
myCar.startEngine();
myMotorcycle.startEngine();
}
}
エラーの考察:
Vehicle
クラスは抽象クラスであり、そのため直接インスタンス化することはできません。このため、Vehicle myVehicle = new Vehicle();
のようなコードがエラーとなります。- 抽象クラスは、その具象クラスを通じて利用されることが意図されています。そのため、
Vehicle
クラスをインスタンス化する際には、具象クラス(Car
またはMotorcycle
)を使用する必要があります。
この例では、Vehicle
クラスを直接インスタンス化することができない点に注意してください。
抽象クラスのインスタンス化の制約
抽象クラスのインスタンス化にはいくつかの制約があります。以下に、それらの制約について解説します。
抽象クラスは直接インスタンス化できない:
抽象クラスは具体的な実装を持たない抽象メソッドを含むことができます。そのため、抽象クラス自体には直接インスタンスを生成することはできません。
例: Animal myAnimal = new Animal();(Animal が抽象クラスである場合)はエラーとなります。
具象クラスを介した利用が必要:
抽象クラスの利用は、具象クラスを介して行われる必要があります。具象クラスは抽象クラスを継承し、抽象メソッドをオーバーライドして具体的な実装を提供します。
例:
Animal myAnimal = new Dog(); // これは有効
Animal invalidAnimal = new Animal(); // これはエラー
ポリモーフィズムを利用:
抽象クラスを利用する主な目的は、ポリモーフィズムを実現することです。抽象クラス型の変数に具象クラスのインスタンスを代入することで、共通のインターフェースを提供し、異なる具象クラスのオブジェクトを統一的に扱えるようになります。
Animal myAnimal = new Dog(); // 具象クラスを介して抽象クラスを利用
抽象クラスの目的:
抽象クラスは、共通の機能やインターフェースを提供し、その具象サブクラスに共通の基盤を提供するために使用されます。直接インスタンス化できない制約は、抽象クラスが具象的なオブジェクトを生成するのではなく、その機能を継承するサブクラスを通じて利用されるべきであることを示しています。
これらの制約により、抽象クラスを適切に利用し、オブジェクト指向プログラミングの基本原則である継承やポリモーフィズムを実現することが期待されます。