Javaのポリモーフィズム(多態性)とは?基本概念と具体例をわかりやすく解説
ポリモーフィズム(多態性)とは
ポリモーフィズム(多態性)とは、ひとつのオブジェクトが複数の形態(型)を持つことができる性質のことです。オブジェクト指向プログラミング(OOP)において最も一般的な活用場面は、親クラスの参照変数を使って子クラスのオブジェクトを参照するケースです。
すべてのJavaオブジェクトはポリモーフィック
複数のIS-Aテストに合格できるJavaオブジェクトは、ポリモーフィックであるとみなされます。Javaでは、あらゆるオブジェクトが「自分自身の型」に対するIS-Aテストと「Objectクラス」に対するIS-Aテストの両方に合格するため、すべてのJavaオブジェクトは本質的にポリモーフィックだと言えます。
参照変数の基本ルール
ここで重要なのは、オブジェクトへアクセスする唯一の方法は参照変数を通じることという点です。参照変数には次のようなルールがあります。
- 参照変数は1つの型しか持てず、一度宣言したら型を変更できない
- finalとして宣言されていなければ、別のオブジェクトへの再代入が可能
- 呼び出せるメソッドは、参照変数の型によって決まる
- 参照変数は、宣言された型のオブジェクト、またはそのサブタイプ(派生クラス)のオブジェクトを参照できる
- 参照変数はクラス型・インターフェース型のどちらでも宣言できる
具体例:Deerクラスで見るポリモーフィズム
それでは、具体的な例を見てみましょう。
public interface Vegetarian{}
public class Animal{}
public class Deer extends Animal implements Vegetarian{}
この例では、DeerクラスはAnimalクラスを継承しつつ、Vegetarianインターフェースも実装しているため、複数の型との関係を持ち、ポリモーフィックであるとみなされます。上記のコードについて、以下のことがすべて成り立ちます。
- Deer IS-A Animal(鹿は動物である)
- Deer IS-A Vegetarian(鹿は草食動物である)
- Deer IS-A Deer(鹿は鹿である)
- Deer IS-A Object(鹿はObjectである)
有効な参照変数の宣言
これらの参照変数の性質をDeerオブジェクトに適用すると、次の宣言はすべて有効になります。
Deer d = new Deer();
Animal a = d;
Vegetarian v = d;
Object o = d;
このとき、d、a、v、oという4つの参照変数はすべて、ヒープ上にある同じDeerオブジェクトを参照しています。それぞれの変数の型が異なるため、呼び出せるメソッドの範囲は変わりますが、指し示す実体はひとつです。
まとめ
ポリモーフィズムを活用することで、柔軟で拡張性の高いコードを書けるようになります。親クラスやインターフェース型の変数で子クラスのオブジェクトを扱えるため、メソッドの引数やコレクションなどで抽象的な型を利用でき、プログラムの保守性と再利用性が大きく向上します。Javaのオブジェクト指向設計を学ぶうえで、ぜひ押さえておきたい重要な概念です。
-
Javaで「this」に新しい参照を代入することは可能ですか?
Javaにおける「this」キーワードは、インスタンスメソッドやコンストラクタの中で現在のオブジェクトを参照するために使われる特別なキーワードです。これを利用することで、クラスのメンバーであるコンストラクタ、フィールド(変数)、メソッドなどを参照することができます。 「this」への参照の代入は可能か? 定義によれば、「this」はキーワードであり、現在のオブジェクト(そのコンストラクタやメソッドを実行中のオブジェクト)への参照として機能します。その値は固定されており、変更することはできません。つまり、「this」に新しい参照値を代入することはできません。 そもそも「this」は単なるキーワ
-
JavaオブジェクトをJSONに変換する方法(Jackson・Gsonの使い方)
このチュートリアルでは、JavaオブジェクトをJSON形式に変換する方法を、定番ライブラリであるJacksonとGsonの2つを使って解説します。 サンプルとして使用するのは、ごく標準的なPOJO(Plain Old Java Object)であるPersonクラスです。Personオブジェクトを作成したら、それぞれのライブラリを使ってJSONへ変換してみましょう。 Person.java import java.util.List; import java.util.Map; public class Person { String name; Integer age;