
✅ ポリモーフィズムとは
Javaでコードを書いていると、
if (obj instanceof Dog) { ... }
のように、型ごとに処理を分ける書き方がありますが、
「少し面倒だな…」と感じたことはないでしょうか?
実はこの書き方、
もっとシンプルに書くことができます。
それが「ポリモーフィズム」です。
💻 サンプルコード
Java Silverの図形の面積を求めるコードだと少しイメージしづらいため、 今回も犬モデルでポリモーフィズムを考えてみます。
abstract class Dog { abstract void action(); } class ShibaDog extends Dog { @Override void action() { System.out.println("しば犬が元気に走った!"); } } class CorgiDog extends Dog { @Override void action() { System.out.println("コーギーがしっぽを振った!"); } } class PoodleDog extends Dog { @Override void action() { System.out.println("プードルがくるっと回った!"); } } class ChihuahuaDog extends Dog { @Override void action() { System.out.println("チワワがぴょんっと跳ねた!"); } } public class Main { public static void main(String[] args) { Dog[] dogs = { new ShibaDog(), new CorgiDog(), new PoodleDog(), new ChihuahuaDog() }; for (Dog d : dogs) { d.action(); } } }
しば犬が元気に走った!
コーギーがしっぽを振った!
プードルがくるっと回った!
チワワがぴょんっと跳ねた!
同じ action() を呼び出しているのに、犬の種類によって動きが変わります。
🤔 なぜこうなるか?
すべての変数は Dog 型ですが、
実体はそれぞれ異なります。
整理すると、次のようになります👇
| 変数の型 | 実体 |
|---|---|
| Dog | ShibaDog |
| Dog | CorgiDog |
| Dog | PoodleDog |
| Dog | ChihuahuaDog |
👉 見た目は同じでも、中身は違います。
🟦 ポリモーフィズムの正体
同じメソッド呼び出しでも、
実体によって処理が変わる仕組み。
これがポリモーフィズム(多態性)です。
同じ d.action() なのに、
👉 犬によって動きが変わる。
これがポリモーフィズムの面白いところです。
⚖️ instanceofとの比較
もしポリモーフィズムを使わない場合、
if (d instanceof ShibaDog) { ... } else if (d instanceof CorgiDog) { ... }
クラスが増えるほど分岐が増え、コードが複雑になります。
しかしポリモーフィズムなら、
d.action(); だけで完結します。
🔍 ポリモーフィズムの良さ
- if文が不要
- クラスが増えてもコード変更なし
- 拡張に強い
オブジェクト指向の理想的な設計です。
💡 まとめ
- キャスト → 型を変える
- instanceof → 型を確認する
- ポリモーフィズム → 型を意識しない
👉 設計レベルが一段上がる考え方
🟨 最後に
オブジェクト指向では、
「何の型か?」ではなく 「何ができるか?」で考えます。
これまで「型」を意識してきましたが、
ポリモーフィズムでは、型ではなく「振る舞い」に注目します。
ポリモーフィズムは、 コードをシンプルにし、拡張しやすくするための重要な考え方です。
Java学習中の方の参考になれば幸いです 🙌