まず、抽象クラスを作成します。抽象クラスは直接インスタンス化することはできませんが、他のクラスの基礎となる共通の特性やメソッドを定義することができます。例えば、動物を表す抽象クラスAnimalを以下のように定義します。
abstract class Animal {
public abstract void makeSound();
}
次に、抽象クラスを継承する具象クラスを作成します。具象クラスは抽象クラスのメソッドを実装し、インスタンス化することができます。例えば、犬を表す具象クラスDogを以下のように定義します。
class Dog extends Animal {
public void makeSound() {
System.out.println("ワンワン!");
}
}
同様に、別の具象クラスCatも作成します。
class Cat extends Animal {
public void makeSound() {
System.out.println("ニャーニャー!");
}
}
これで、抽象クラスAnimalを基底とする配列を作成し、異なる具象クラスのインスタンスを格納することができます。
Animal[] animals = new Animal[2];
animals[0] = new Dog();
animals[1] = new Cat();
配列animalsの各要素はAnimal型でありながら、実際にはDogやCatのインスタンスを参照しています。これがポリモーフィズムの力です。
配列の要素にアクセスする際には、ポリモーフィズムにより各要素の実際の型に基づいて適切なメソッドが呼び出されます。例えば、以下のようにmakeSoundメソッドを呼び出すことができます。
for (Animal animal : animals) {
animal.makeSound();
}
上記のコードでは、配列animalsの要素がDogとCatのインスタンスであるため、それぞれのクラスでオーバーライドされたmakeSoundメソッドが呼び出されます。
抽象クラスとポリモーフィズムを使用することで、柔軟なコードを記述することができます。抽象クラスを使用することで、異なる具象クラスの共通の特性や振る舞いを抽象化し、統一的に扱うことができます。ポリモーフィズムを使用することで、異なる具象クラスのインスタンスをまとめて扱うことができます。
このように、Javaでは抽象クラスとポリモーフィズムを組み合わせることで、効果的なコードを記述することができます。