ポリモーフィズム(多態性)とは、「同じ名前のメソッド(命令)でも、呼び出す対象(オブジェクト)によって異なる動作をする」という仕組みです。言い換えると、ひとつの命令でありながら、使う対象によって全く違う働きを実現できるという点が、ポリモーフィズムの大きな特徴です。

このページではオブジェクト指向プログラミングにおいて重要となる概念の1つ「ポリモーフィズム」について順を追って1からわかりやすく解説します。
ステップ1:基本の考え方
クラスとオブジェクト

- クラスは設計図。たとえば「動物」というクラスがあるとすると、その設計図から実際の「犬」「猫」などのオブジェクトが作られます。
参考 Javaのクラスとは?
継承とオーバーライド
- 継承により、あるクラス(親クラス)の機能を引き継ぎ、新たなクラス(子クラス)を作成できます。
- 子クラスは親クラスのメソッドをオーバーライド(上書き)して、固有の動作(例:犬は「ワンワン」、猫は「ニャーニャー」)を実現します。
具体例:動物クラスの場合
以下のコードは、親クラス Animal と、子クラス Dog(犬)、Cat(猫)の例です。(サンプルとしてJavaで示します。)
// 親クラス Animal class Animal { public void makeSound() { System.out.println("動物の鳴き声"); } } // 子クラス Dog(犬) class Dog extends Animal { @Override public void makeSound() { System.out.println("ワンワン"); } } // 子クラス Cat(猫) class Cat extends Animal { @Override public void makeSound() { System.out.println("ニャーニャー"); } }
上記の例では、Animal クラスの makeSound()
という同じメソッドが、実際にどのオブジェクトか(犬か猫か)によって異なる動作をします。たとえば:
Animal myAnimal = new Dog(); myAnimal.makeSound(); // 出力:ワンワン myAnimal = new Cat(); myAnimal.makeSound(); // 出力:ニャーニャー
より身近な例でイメージする

リモコンの「電源ボタン」を例にポリモーフィズムを語ってみると・・・
考えてみてください。リモコンの「電源ボタン」は、対象がテレビの場合はテレビをオン・オフし、エアコンの場合はエアコンを動かしたり止めたりします。同じ「電源オン」という命令なのに、機器ごとに全く違う働きをするのです。
これと同じように、プログラムでは同じメソッド(例:「鳴く」)が、オブジェクトごとに適切な動作(犬はワンワン、猫はニャーニャー)をするのがポリモーフィズムです。
ポリモーフィズムがなかったら…?
個別の対応が必要に
- 現実の場合:
もしリモコンの電源ボタンが、テレビとエアコンで同じ働きをしなかったら、機器ごとに別々のリモコンを用意しなければなりません。 - プログラムの場合:
ポリモーフィズムがなければ、各オブジェクト(動物)ごとに「これは犬だからワンワン」、「これは猫だからニャーニャー」と、都度条件分岐(if文など)で処理を分ける必要があり、コードは非常に複雑になってしまいます。
保守性や拡張性の低下
- 新しい種類の動物(例えば鳥や牛)を追加するたびに、どこでどう鳴くかを条件分岐で判断するロジックをすべて修正しなければならず、ミスも起きやすくなります。
- 呼び出し側も「どの動物か」を毎回確認しなければならず、プログラム全体のシンプルさや再利用性が大きく損なわれます。
ポリモーフィズムの利点
コードのシンプルさ
- 共通の命令で対応:
一度「鳴く」という命令を定義すれば、各動物は自分固有の実装を持つだけで済むため、呼び出し側は「どの動物か」を気にせずに単一の命令を使えます。
柔軟な拡張性
- 新しい要素の追加が容易:
新しい動物を追加する場合、その動物専用の「鳴く」メソッドを実装するだけで、既存のプログラム全体にスムーズに組み込むことができます。
保守性の向上
- 内部の実装変更が外部に影響しにくい:
呼び出し側は共通のインターフェース(命令)だけを意識するため、内部の実装が変わっても全体への影響が少なく、プログラムの保守がしやすくなります。
まとめ
ポリモーフィズムは、プログラミングにおける非常に重要な概念です。
- 同じ名前のメソッドが、対象によって異なる動作をすることで、コードがシンプルに保たれます。
- 新しいオブジェクトの追加や変更が容易となり、プログラム全体の拡張性や保守性が向上します。
- もしポリモーフィズムがなかったら、対象ごとの個別処理や複雑な条件分岐が必須となり、システム全体が扱いにくくなってしまいます。
このように、ポリモーフィズムを正しく理解して活用することで、初心者でもプロのエンジニアが目指す「洗練されたコード設計」に近づくことができます。
現実世界でリモコンひとつで複数の家電を操作するように、プログラムでもひとつの命令で多様な対象に対応できる仕組みは、とても魅力的で強力なのです。