// Vehicle クラスの定義
class Vehicle {
// start メソッド
public void start() {
System.out.println("Vehicle is starting");
}
}
// Car クラスの定義(Vehicle クラスを拡張)
class Car extends Vehicle {
// start メソッドをオーバーライド
@Override
public void start() {
System.out.println("Car is starting");
}
}
// メインクラス
public class Main {
public static void main(String[] args) {
// Vehicle クラスのオブジェクトを作成
Vehicle vehicle = new Vehicle();
// Vehicle クラスの start メソッドを呼び出す
vehicle.start();
// Car クラスのオブジェクトを作成
Car car = new Car();
// Car クラスの start メソッドを呼び出す(オーバーライドされたバージョンが呼ばれる)
car.start();
}
}
この例では、Vehicle
クラスが基本的な start
メソッドを提供し、Car
クラスがこのメソッドをオーバーライドして独自の挙動を追加しています。メインクラスでは、Vehicle
クラスと Car
クラスのそれぞれのオブジェクトを作成し、start
メソッドを呼び出しています。これにより、ポリモーフィズムの概念が確認できます。
実行結果
Vehicle is starting
Car is starting
Vehicle
クラスのオブジェクトvehicle
を作成し、そのstart
メソッドを呼び出すと、”Vehicle is starting” と表示されます。Car
クラスのオブジェクトcar
を作成し、そのstart
メソッドを呼び出すと、”Car is starting” と表示されます。Car
クラスでstart
メソッドがオーバーライドされているため、Vehicle
クラスのバージョンではなく、Car
クラスのバージョンが呼ばれます。
ポリモーフィズム
「ポリモーフィズム」は、オブジェクト指向プログラミングにおいて重要な概念であり、同じ名前のメソッドや操作を異なるクラスで共有することができる性質を指します。これにより、異なるクラスのオブジェクトを同一のインターフェースを介して扱うことが可能になります。以下に「ポリモーフィズム」についての主なポイントを解説します。
- 多態性の概念:
- ポリモーフィズムは、「多態性」とも呼ばれます。これは、同じメソッドや操作が異なるオブジェクトに対して異なる動作をする能力を指します。つまり、同じ名前のメソッドを持つ異なるクラスのオブジェクトを同じように扱えるという柔軟性を提供します。
- オーバーライドと動的メソッドディスパッチ:
- ポリモーフィズムは主にオーバーライド(override)と動的メソッドディスパッチ(dynamic method dispatch)に基づいています。サブクラスが親クラスのメソッドを再定義することで、実行時に正しいメソッドが呼び出されるようになります。
- 共通のインターフェース:
- ポリモーフィズムを実現するためには、異なるクラスが共通のインターフェース(または抽象クラス)を共有することが一般的です。これにより、クラスは同じ名前のメソッドを持ち、異なるクラスのオブジェクトを同じように扱えます。
- クラスの階層構造:
- ポリモーフィズムは通常、クラスの階層構造(継承関係)を利用しています。サブクラスが親クラスを拡張し、親クラスで定義されたメソッドをオーバーライドすることで、ポリモーフィズムを実現します。
- アップキャストとダウンキャスト:
- アップキャスト(upcasting)は、サブクラスのオブジェクトを親クラスの型に変換することを指します。ダウンキャスト(downcasting)はその逆で、親クラスのオブジェクトをサブクラスの型に変換することを指します。ポリモーフィズムにおいては、アップキャストが一般的に使用されます。
- 実行時の型とコンパイル時の型:
- ポリモーフィズムでは、オブジェクトの実際の型(実行時の型)と変数の型(コンパイル時の型)という2つの型があります。実行時には実際の型に基づいて適切なメソッドが呼び出されます。
ポリモーフィズムは、柔軟で拡張可能なコードを構築する上で非常に有用です。異なるクラスのオブジェクトを共通のインターフェースを通じて操作することで、コードの再利用性が向上し、保守性が向上します。