親クラスまたはインタフェースが定義されている参照変数は、オブジェクト実装クラスのサブクラスまたはインスタンスを指すことができ、そして処置の方法は、特定の方法は、それが参照されるオブジェクト変数のポイントを達成するために、実行時バインディングのみ動的呼び出し、メモリでありますそのオブジェクトの操作方法ではなく、定義された参照型変数方法。
オブジェクト指向プログラミング(でオブジェクト指向プログラミング、OOP)、多状態メカニズムは、間違いなくその最もユニークな機能であっても多状態プログラミングはOOP呼び出すことはできません使用していない、と言うことができます。一部の人が言う理由は、オブジェクト指向プログラミングとオブジェクト指向プログラミング言語の使用は、2つの異なるものです、です。
多型は、よりリラックスした下のそれにWikipediaの定義を厳密な定義はありません。
ほぼ普遍的オブジェクト指向プログラミングの文脈においてだけ多型と呼ばれるサブタイプの多型は、別のタイプのように使用されるように表示される一種、Aの能力、である、B.
サブタイプおよびサブタイプ
私は突然のタイプ(のすべてここで言及したいサブタイプ)の単語とサブクラス(サブクラス、差)である簡単に言えば、限り、クラスAがクラスBの継承を実現するために、キーワードの使用を拡張して、その後、私たちは、クラスAを言うことができますクラスBは、サブクラスのサブクラスである限り、相続の構文として、サブクラスの関係があり、文法的なレベルでの言葉です。
サブタイプではないだけで、継承構文を必要とサブクラス、より厳しい要件があり、親クラスのメソッド(オーバーライド)、その後、親クラスのオリジナルのセマンティクスを遵守しなければならない内容を書き換えを書き換えるのサブクラスがあり、それが呼び出されているかどうか尋ねるために同じ効果とアクションの後に親クラスの方向に実装する必要があります。
2の比較は、一点を強調するようなものです:唯一のサブクラスは、サブタイプの多型が理にかなっていることを確認してください。
第二に、多形性のメカニズム
2つの方法で、本質的多型:
図1に示すように、コンパイル時(静的多形としても知られる)多型
(動的多形としても知られている)2、ランタイム多型
オーバーロード(過負荷)コンパイル時の多型の例であり、コンパイル時の多型は、コンパイル時に決定された、呼び出しを決定するランタイム実行方法。
私たちは、通常、多型が実行されている参照の多型性を参照して、具体的な方法は、コンパイル時に呼び出す正確かわからないが、それを実行するかを決定するために遅れています。時には多型の方法は、遅延方式の理由として知られている理由です。
ウィキペディア多型の挙動は以下のように記述されています。
業界における多型の主な用途(オブジェクト指向プログラミング理論)メソッド、フィールド、または同じ名前のプロパティの呼び出しに応答する異なる種類に属するオブジェクトの能力は、適切なタイプ固有の動作に応じてそれぞれです。
以下の簡単な機構多型は、ランタイム(以下、多型と呼びます)。
ポリモーフィック通常2つの方法:
1、サブクラス(延び)親クラスを継承します
2、クラス実装インタフェース(実装)
どちらにしても、場所のコアはリライトするか、実行時の実行時に異なる効果を達成するための方法をインタフェースする親クラスのメソッドを実現することです。
多型を使用するには、オブジェクトを宣言するときのルールに従うべきである:常に親クラス型またはインタフェース型宣言を、実際の型を作成します。例えば、我々はArrayListオブジェクトを作成したいと、文は、この文のように使用する必要があります。
一覧リスト= newArrayList();代わりに
ArrayListのリスト= newArrayList()。また、通常、常にメソッドを定義する場合、例えば、この方法は、書き込まれるべき親クラス型またはインターフェイス型パラメータ好ましいすべきです。
publicvoidのdoSomething(一覧リスト)。代わりに
publicvoidのdoSomething(ArrayListのリスト)。1日の場合、私は私の要件を満たすことができないのArrayListの特性が、私はのLinkedListと交換できるようにしたいと思います、あなただけの新しいのArrayList()を置くための場所で作成された新しいオブジェクトに変更が必要です。この文の最大の利点は、構造の柔軟性があることですLinkedListのは、他のコードと変更されませんすることはできません。
プログラマ(プログラム)は、事前にオブジェクトの正確な型を知っている必要はありません、そのため正確な動作は、(これは遅延バインディングまたは動的バインディングと呼ばれている)、実行時に決定されます。
それは自動的にダイナミックバインディング(も遅延バインディングと呼ばれる)と呼ばれるメカニズムによって達成される実際のクラスのプログラムの実施に動的なアプローチを呼び出すための仮想機会は、このプロセスは、プログラマに対して透過的です。
多型の第三に、使用
私はデザインや建築の再利用と思い、さらに多型の最大の用途は、「デザインモードプログラミングを実現するためのプログラミング・インターフェースではなく、典型的な例を提唱では、」多型の完全な使用です。インタフェース定義関数定義およびコンポーネントは、実装に流れた後に残すことができる場合。インタフェースは、同時に複数の実装を有することができ、設計のながらも(LinkedListのが使用する正確に達成するために、そのようなArrayListの異なる特性に決定されるように)インターフェース実装の様々なを使用することができます。
4、ポリモーフィズムを実現
ここでは簡単に実行するために、仮想マシンの観点からは、多状態の原則の実装について説明どこJava仮想マシン(Java仮想マシン、JVM)の例として実装仕様。
JavaバイトコードのJVM実行では、型情報は、メソッド領域に格納され、通常はオブジェクトの速度、情報の種類ポインタの面積を増加させる方法を最適化するメソッドを呼び出し、テーブルエントリのレコードのそのような方法へのポインタポイント(この方法は、テーブルと呼ばれる)、テーブルは、対応する方法のそれぞれへのポインタです。
次のようにコンストラクタのテーブルには、次のとおりです。
Javaの単一継承するので、このクラスは、親クラスから継承することができますが、すべてのクラスが、彼らは、Objectクラスから継承されます。このクラスの親クラスに続いてオブジェクトクラスメソッドに格納された第1のテーブルの方法は、方法自体の最後のクラスです。ここで重要な分野は、サブクラスは親クラスを書き換える場合は、同じ名前のサブクラスとテーブルエントリを共有するスーパークラスメソッドとは、親クラスとして認識されているということです。
唯一の非プライベートなインスタンスメソッドが表示されることに注意してください、と静的メソッドがここに表示されていない、その理由は理解しやすいです:静的メソッドは、オブジェクトには何の関係もありません、メソッドは、インスタンスメソッドは、間接参照を必要とするのではなく、アドレスを直接参照することができます。
より詳細な話、静的メソッドは、唯一の方法はINVOKEVIRTUALとinvokeinterface命令はメソッドテーブルに表示されますと呼ばれ、プライベートメソッドとコンストラクタがinvokespecial命令によって呼び出され、仮想マシン命令がinvokestaticと呼ばれています。
上記プロセスに配向特性( - 親オブジェクト - サブクラス)ので、そのようにオフセットテーブル方式は、常に固定されています。例えば、任意のクラス、メソッドは常に一定値に等しいオフセットテーブル方式のため、すべてのサブクラスは、親クラスのメソッドテーブルを継承し、オフセット方法は、親クラスの合計で定義されています固定値です。
メソッドテーブルエントリで、上述したように対応する方法、マルチ開始状態のクラスへのポインタです。
クラスA、クラスB、次いでAのサブクラス及び方法B、書き換え方法()、表Bの方法であり、ポインタポインティング方法は、方法Bの方法エントリの方法であると仮定する。
JVMは、常にから保証しながら、Aがあるために、方法そのメソッド・テーブルのメソッドは、独自の方法ではなく、クラスのロードすでにクラスローダを保証され、その親(の方法を指します正しいタイプの情報へのオブジェクト参照点)。
オフセットポインタを結合させる方法は、固定されており、ポインタは常に、私たちは簡単にここで多型メカニズムを見つけることができます実際のドメインクラスのメソッドを指します。
メソッド呼び出しは、実際には、最初のシンボル参照の方法の完全な例が解決される必要があり、その結果、基準シンボルがオフセットテーブル方式として解釈されることです。ゾーンタイプオブジェクトのメソッドテーブルエントリ、クエリクラス、親クラスの型宣言は、正式に親クラスのメソッドを呼び出し、サブクラスのオブジェクト、仮想マシン法の実用的なクラスから、この時間を介して情報を取得するための仮想マシンの参照方法ここで使用される対応するポインタ(、「検索」を見つけるためのメソッドの名前のテーブルには、(親クラスが宣言、しかし実際には、ここに格納されている情報の種類、情報のサブクラスですが)以前に述べたように、実際には不向きです、オフセット法は、それのみ)オフセットポインタに応じて得ることができ、さらには実際のクラスの方法を対象とすることができ、固定されています。
私たちの物語は実際には、上記の手順は、内部使用のみの継承メカニズムの多形性のためで、終わっていない、ポリモーフィズム達成するための別の方法:インタフェースのコントラストを実装するには、さらに複雑で、Javaの単一継承保証理由クラス間の線形関係、さらには困難で正確にオフセットポインタ方法を得るために、そのように同時に、複数のインタフェースを実現することができます。したがって、JVMに、メソッド呼び出しの多型の例実際に2つの命令。
メソッド宣言したクラスを呼び出すためのINVOKEVIRTUAL指示。
メソッドを呼び出すためのinvokeinterface手順は、インタフェースを宣言しました。
メソッドを呼び出すときinvokeinterface命令、あなたは(もちろん、実際の実装は必ずしもそうではありません見つけるために、一つ一つ正直固定オフセットリコースしかしを使用することはできません、JVM仕様では、この一見、異なるJVMを達成するための方法を正確に指定されていません。実装は)検索効率を向上させるためにさまざまな最適化アルゴリズムを持つことができます。私たちは、ほとんど常にメソッド呼び出しのクラス参照より遅いインタフェース参照メソッドを呼び出して、パフォーマンスの面で、見ることができます。好適なデザインは、常に適切ではないとして、それはまた、もちろん、設計上の問題が探求するために、この資料の範囲内ではないが、どうやら特定の問題の具体的な分析はまだ良い選択肢とみなされ、クラスとインタフェースのインタフェース間で、教えてくれる。
個人的な意見:マルチステートマルチステート機構、静的(コンパイル時に多型)および動的多型(多型ランタイム)を含む、このような大型静的多型としては、動的な多型は、コンパイル時に呼び出すためにどの方法がわからない場合、それがでました実行時に決定。ダイナミックな多型の実装はサブクラスがクラスを継承し、親クラスがインタフェースを実装して構成されています。サブクラス(知らないと言うことではない)の複数の変換は、オブジェクトがサブクラスを対応する方法で実施されている場合、この実装は、JVMに関連しています。