Java 速習チュートリアル

Java ポリモーフィズム

1. Java ポリモーフィズムとは

ポリモーフィズム(Polymorphism)とは「多くの形態(多態性)」を意味し、継承(Inheritance)によって互いに関連付けられた多くのクラスが存在する場合に発生する概念です。

前章で学んだ通り、「継承」は別のクラスから属性やメソッドを引き継ぐことを可能にします。一方でポリモーフィズムは、それらのメソッドを使用して異なるタスクを実行するために利用されます。これにより、単一のアクションを異なる方法で実行できるようになります。

たとえば、animalSound() というメソッドを持つ Animal というスーパークラスを考えてみましょう。Animal のサブクラスには「ブタ」「ネコ」「イヌ」「鳥」などが考えられますが、これらはそれぞれ独自の鳴き声(鳴き声の実装)を持っています(ブタは「ブーブー」、ネコは「ニャー」など)。

2. ポリモーフィズムの実装例

「継承」の章で触れたように、クラスを継承するには extends キーワードを使用します。

以下の例では、各サブクラスが animalSound() メソッドを独自の挙動で上書き(オーバーライド)しています。

class Animal {
  public void animalSound() {
    System.out.println("動物が音を出します");
  }
}

class Pig extends Animal {
  public void animalSound() {
    System.out.println("ブタが鳴きます:ウィーウィー");
  }
}

class Dog extends Animal {
  public void animalSound() {
    System.out.println("イヌが鳴きます:バウワウ");
  }
}

これで、PigDog のオブジェクトを作成し、それぞれのオブジェクトに対して animalSound() メソッドを呼び出す準備が整いました。

実行例:

class Animal {
  public void animalSound() {
    System.out.println("動物が音を出します");
  }
}

class Pig extends Animal {
  public void animalSound() {
    System.out.println("ブタが鳴きます:ウィーウィー");
  }
}

class Dog extends Animal {
  public void animalSound() {
    System.out.println("イヌが鳴きます:バウワウ");
  }
}

class Main {
  public static void main(String[] args) {
    Animal myAnimal = new Animal();  // Animalオブジェクトを作成
    Animal myPig = new Pig();        // Pigオブジェクトを作成
    Animal myDog = new Dog();        // Dogオブジェクトを作成

    myAnimal.animalSound();
    myPig.animalSound();
    myDog.animalSound();
  }
}

3. なぜ「継承」と「ポリモーフィズム」を使用するのか?

  • コードの再利用性: 新しいクラスを作成する際、既存クラスの属性やメソッドを再利用できるため、開発効率が大幅に向上します。
  • 柔軟なプログラム設計: スーパークラスの型でオブジェクトを扱うことができ、実行時に具体的なサブクラスの挙動を呼び出せるため、プログラムの拡張性が高まります。