静的ポリモーフィズムと動的ポリモーフィズムの主な違いは、静的ポリモーフィズムがコンパイル時に解決されるポリモーフィズムの一種であるのに対し、動的ポリモーフィズムは実行時に解決されるポリモーフィズムの一種である点です。
オブジェクト指向は、プログラマが実世界のシナリオをオブジェクトとしてモデル化することを可能にする、人気のあるソフトウェアパラダイムである。
ポリモーフィズムは、OOPの主要な柱です。
これは、オブジェクトが異なる方法で実行する能力を指します。
ポリモーフィズムには、静的ポリモーフィズムと動的ポリモーフィズムがあります。
プログラマは、Javaを使ってポリモーフィズムの概念を実装することができます。
Javaにおける静的ポリモーフィズムとは何か
静的ポリモーフィズム(またはアーリーバインディング)とは、コンパイル時に解決されるポリモーフィズムの一種です。
メソッドオーバーローディングは静的ポリモーフィズムの一例です。
メソッドオーバーローディングでは、同じ名前で異なるパラメータを持つメソッドが存在します。
つまり、同じ名前のメソッドが存在するが、データ型や引数の数が異なる。
しかも、どのメソッドを呼び出すかは、コンパイル時に決定される。
プログラム例を以下に示す。
testクラスには、addという同じ名前のメソッドが2つある。
最初のaddメソッドは2つの整数を受け取り、それら2つの数値の和を返す。
同様に、2つ目のaddメソッドは3つの整数を受け取り、それら3つの数値の和を返します。
mainメソッドでは、Testクラスという型のオブジェクトが存在する。
そして、そのオブジェクトに対してaddメソッドを呼び出しています。
12行目では2つのパラメータを持つaddメソッドを呼び出し、13行目では3つのパラメータを持つaddメソッドを呼び出しています。
同様に、呼び出すメソッドは、コンパイル時に決定されます。
Javaにおける動的ポリモーフィズムとは何か
動的ポリモーフィズム(またはレイトバインディング)とは、実行時に解決されるポリモーフィズムの一種です。
メソッドオーバーライドは動的ポリモーフィズムの一例です。
メソッドオーバーライドでは、2つのクラスがあり、一方が親クラスで、もう一方が子クラスです。
しかし、どちらのクラスも同じメソッドを持っています。
さらに、子クラスのメソッドは親クラスのメソッドをオーバーライドします。
以下はその例です。
図2: クラスA
図3: クラスB
メインクラス
Aクラスはdisplayメソッドを持っており、Bクラスもdisplayメソッドを持っています。
mainメソッドでは、親クラスの参照に子クラスのオブジェクトが代入されます。
これは、実行時にどのメソッドを呼び出すかを決定するものです。
そして、そのオブジェクトを使ってdisplayメソッドが呼び出されます。
プログラマは、クラスBのdisplayメソッドが実行されることを確認することができます。
つまり、クラスAのdisplayメソッドがクラスBのdisplayメソッドにオーバーライドされているのです。
Javaにおける静的ポリモーフィズムと動的ポリモーフィズムの違い
定義
静的ポリモーフィズムは、コンパイル時にメソッドを呼び出すための情報を収集するタイプのポリモーフィズムであり、動的ポリモーフィズムは、実行時にメソッドを呼び出すための情報を収集するタイプのポリモーフィズムです。
したがって、これが静的ポリモーフィズムと動的ポリモーフィズムの大きな違いです。
同義語
静的ポリモーフィズムの同義語は static binding と early binding であり、動的ポリモーフィズムの同義語は dynamic binding と late binding です。
発生状況
静的ポリモーフィズムはコンパイル時に発生し、動的ポリモーフィズムは実行時に発生します。
従って、この点も静的ポリモーフィズムと動的ポリモーフィズムの違いとなります。
実行
また、静的ポリモーフィズムと動的ポリモーフィズムの重要な違いは、静的ポリモーフィズムでは実行速度が速く、動的ポリモーフィズムでは実行速度が遅いことである。
例
メソッドのオーバーロードは静的結合の例であり、メソッドのオーバーライドは動的結合の例です。
結論
全体として、ポリモーフィズムはオブジェクトが複数の振る舞いをする能力を記述する、OOPの柱です。
簡単に説明すると、ポリモーフィズムには静的ポリモーフィズムと動的ポリモーフィズムの2種類があります。
静的ポリモーフィズムと動的ポリモーフィズムの主な違いは、静的ポリモーフィズムはコンパイル時に解決されるポリモーフィズムの一種で、動的ポリモーフィズムは実行時に解決されるポリモーフィズムの一種であることです。