Javaの勉強をしていると、「ポリモーフィズム(多態性)」という言葉が登場します。
初めて聞くと「なんだか難しそう…」と思ってしまいますが、
実はこれ、Javaでプログラムをすっきり整理し、効率よく動かすための重要な考え方なんです。
この記事では、**ポリモーフィズムとは何か?どんな場面で使うのか?どうやって使えばいいのか?**を、実際のJavaコードと図解を使って、わかりやすく解説します!
✅ この記事でわかること
- Javaにおけるポリモーフィズムの基本概念
- オーバーロードとオーバーライドの違い
- 実行時ポリモーフィズムの仕組み
- 多態性を使った実践的なコードの書き方
- よくあるエラーとその対処法
- 設計力を高めるためのポイント
🧠 ポリモーフィズム(多態性)とは?
一言で言えば…
**「同じ名前の操作でも、オブジェクトの種類によって違う動きをする仕組み」**です。
たとえば、「動物が鳴く」という操作があるとします。
犬なら「ワンワン」、猫なら「ニャー」、カエルなら「ゲロゲロ」と鳴きますよね?
これをJavaで表現したのが「ポリモーフィズム」です。
🔧 ポリモーフィズムの種類
種類 | 説明 | 実装方法 |
---|---|---|
コンパイル時ポリモーフィズム | 引数の違いでメソッドを使い分ける | メソッドのオーバーロード |
実行時ポリモーフィズム | オブジェクトの種類によって動作が変わる | メソッドのオーバーライド |
📘 メソッドのオーバーロード(Overload)
1 |
public class Calculator {<br> public int add(int a, int b) {<br> return a + b;<br> }<br> public double add(double a, double b) {<br> return a + b;<br> }<br>}<br> |
このように、同じ「add」という名前のメソッドでも、引数の型が違えば別の処理として扱えます。
🧪 メソッドのオーバーライド(Override)
1 |
class Animal {<br> public void speak() {<br> System.out.println("動物の鳴き声");<br> }<br>}<br><br>class Dog extends Animal {<br> @Override<br> public void speak() {<br> System.out.println("ワンワン!");<br> }<br>}<br> |
1 |
Animal a = new Dog();<br>a.speak(); // → ワンワン!<br> |
親クラスで定義した speak()
を、子クラスで「自分流」に上書きする。これが「オーバーライド」です。
🚀 実行時ポリモーフィズムを活用する例
抽象クラスと配列を使った例
1 |
abstract class Shape {<br> abstract double area();<br>}<br><br>class Circle extends Shape {<br> double r;<br> Circle(double r) { this.r = r; }<br> double area() { return Math.PI * r * r; }<br>}<br><br>class Rectangle extends Shape {<br> double w, h;<br> Rectangle(double w, double h) {<br> this.w = w; this.h = h;<br> }<br> double area() { return w * h; }<br>}<br> |
1 |
public class Main {<br> public static void main(String[] args) {<br> Shape[] shapes = {<br> new Circle(3),<br> new Rectangle(4, 5)<br> };<br> for (Shape s : shapes) {<br> System.out.println("面積:" + s.area());<br> }<br> }<br>}<br> |
結果:
1 2 3 |
コピーする編集する<code>面積:28.27 面積:20.0 |
このように、「Shape」という親クラスだけを意識してコードを書けるのがポリモーフィズムの魅力です。
🧱 インターフェースで実装する例
1 |
interface Greeter {<br> void greet();<br>}<br><br>class EnglishGreeter implements Greeter {<br> public void greet() {<br> System.out.println("Hello!");<br> }<br>}<br><br>class JapaneseGreeter implements Greeter {<br> public void greet() {<br> System.out.println("こんにちは!");<br> }<br>}<br> |
1 |
Greeter g1 = new EnglishGreeter();<br>Greeter g2 = new JapaneseGreeter();<br><br>g1.greet(); // → Hello!<br>g2.greet(); // → こんにちは!<br> |
🎯 ポリモーフィズムを使うメリット
- コードがすっきり:同じ名前のメソッドで管理しやすい
- メンテナンスが簡単:新しいクラス追加でも既存コードを変更しなくていい
- チーム開発でも役割分担がしやすい
- 現実世界のモデルに近い設計が可能
⚠️ ポリモーフィズムで注意すべきポイント
private
メソッドはオーバーライドできませんstatic
メソッドも多態性の対象外ですfinal
クラスやメソッドは拡張不可
📚 もっと深く学びたい人へ
「Javaの設計力」を高めたい方には、絶対にJavaプログラマーになりたい人へ。 をおすすめします。
- 抽象クラスとインターフェースの使い分け
- 実際の現場での活用法
- チーム開発でのベストプラクティス
まで、実践に役立つ内容がしっかり詰まっています。
🚀 レベルアップしたい人へ
「実際に使ってみたけどこれで合ってる?」「コードレビューが欲しい」
そんなときは、サイゼントアカデミー を活用しましょう。
- Java専門の現役講師がサポート
- 個別コード添削やレビュー対応
- 未経験からのエンジニア転職支援
も行っており、Java学習を本気で加速できます。
✅ まとめ:ポリモーフィズムはJavaの真骨頂!
用語 | 内容 |
---|---|
ポリモーフィズム | 同じ名前のメソッドが異なる動作をすること |
オーバーロード | 引数の違いで同名メソッドを複数定義 |
オーバーライド | 親クラスのメソッドを子クラスで上書き |
メリット | 拡張性、保守性、柔軟性が高い |
Javaを使う上で、ポリモーフィズムは「避けて通れない基本」であり、「使いこなすと設計が格段にレベルアップする武器」です。
まずは 絶対にJavaプログラマーになりたい人へ。 を読んで理解を深め、
次に サイゼントアカデミー で実践してみましょう!
コメント