Javaにおけるポリモーフィズムとは、1つの動作を異なる方法で実行することができる概念です。 ポリモーフィズムは、ギリシャ語のpolyとmorphsという2つの言葉に由来します。 ポリ」は「たくさん」、「モルフ」は「形」を意味します。
Javaのポリモーフィズムには、コンパイル時ポリモーフィズムとランタイムポリモーフィズムの2種類があります。
Javaでスタティックメソッドをオーバーロードすると、コンパイル時多相性の例となります。
Runtime Polymorphism in Java
Runtime PolymorphismまたはDynamic Method Dispatchは、オーバーライドされたメソッドへの呼び出しがコンパイル時ではなく実行時に解決されるプロセスです。
このプロセスでは、オーバーライドされたメソッドはスーパークラスの参照変数を通して呼び出されます。
まず、ランタイムポリモーフィズムの前にアップキャスティングを理解しましょう。
アップキャスティング
親クラスの参照変数が子クラスのオブジェクトを参照することをアップキャスティングといいます。 例:
アップキャスティングには、クラス型やインターフェース型の参照変数を使用することができます。
ここで、Bクラスの関係は次のようになります。
B IS-A AB IS-A IB IS-A Object
ObjectはJavaのすべてのクラスのルートクラスなので、B IS-A Objectと書くことができます。
Example of Java Runtime Polymorphism
この例では、BikeとSplendorの2つのクラスを作成します。 SplendorクラスはBikeクラスを継承し、そのrun()メソッドをオーバーライドしています。 runメソッドの呼び出しには、Parentクラスの参照変数を使っています。
サブクラスのオブジェクトを参照し、サブクラスのメソッドが親クラスのメソッドをオーバーライドしているため、サブクラスのメソッドが実行時に呼び出されます。
メソッドの呼び出しはコンパイラではなくJVMによって決定されるため、これは実行時多相性と呼ばれます。
Test it Now
Output:
running safely with 60km.
Java実行時多相性の例。 Bank
Bankが金利を取得するメソッドを提供するクラスであるというシナリオを考えてみましょう。 しかし、金利は銀行によって異なる可能性があります。
Note: この例はメソッドのオーバーライドでも示されていますが、アップキャスティングはありませんでした。
Test it Now
Output:
SBI Rate of Interest: 8.4ICICI Rate of Interest: 7.3AXIS Rate of Interest: 9.7
Java Runtime Polymorphismの例。 Shape
Test it Now
Output:
drawing rectangle...drawing circle...drawing triangle...
Java Runtime Polymorphism Example: Animal
Test it Now
Output:
eating bread...eating rat...eating meat...
Java Runtime Polymorphism with Data Member
メソッドはオーバーライドされますが、データメンバーはオーバーライドされませんので、データメンバーによるランタイムポリモーフィズムは実現できません。 サブクラスのオブジェクトを参照する親クラスの参照変数を使ってデータメンバーにアクセスしています。 オーバーライドされていないデータメンバーにアクセスしているので、常に親クラスのデータメンバーにアクセスすることになります。
Rule: ランタイム ポリモーフィズムはデータ メンバでは実現できません。
Test it Now
Output: