Polymorphism in Java

Javaにおけるポリモーフィズムとは、1つの動作を異なる方法で実行することができる概念です。 ポリモーフィズムは、ギリシャ語のpolyとmorphsという2つの言葉に由来します。 ポリ」は「たくさん」、「モルフ」は「形」を意味します。

Javaのポリモーフィズムには、コンパイル時ポリモーフィズムとランタイムポリモーフィズムの2種類があります。

Javaでスタティックメソッドをオーバーロードすると、コンパイル時多相性の例となります。

Runtime Polymorphism in Java

Runtime PolymorphismまたはDynamic Method Dispatchは、オーバーライドされたメソッドへの呼び出しがコンパイル時ではなく実行時に解決されるプロセスです。

このプロセスでは、オーバーライドされたメソッドはスーパークラスの参照変数を通して呼び出されます。

まず、ランタイムポリモーフィズムの前にアップキャスティングを理解しましょう。

アップキャスティング

親クラスの参照変数が子クラスのオブジェクトを参照することをアップキャスティングといいます。 例:

Upcasting in Java

アップキャスティングには、クラス型やインターフェース型の参照変数を使用することができます。

ここで、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が金利を取得するメソッドを提供するクラスであるというシナリオを考えてみましょう。 しかし、金利は銀行によって異なる可能性があります。

Java Runtime Polymorphism example of 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:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です