Javaの静的および動的ディスパッチ割り当て

参考記事:HTTPS://blog.csdn.net/ns_code/article/details/17965867

 

パブリッククラスStaticDispatch {

静的抽象クラスHumnan {}

静的クラスマン} {Humnanを拡張します

静的クラス女性} {Humnanを拡張します

公共のボイドハロー(Humnan男){

System.out.println( "こんにちは、Humnan");

}

 

公共のボイドハロー(男男){

System.out.println( "こんにちは、マン");

}

 

公共のボイドハロー(女男){

System.out.println( "こんにちは、女");

}

 

パブリック静的無効メイン(文字列[] args){

Humnanの男=新マン();

Humnan女性=新しい女();

StaticDispatch派遣=新しいStaticDispatch();

dispatch.hello(男性);

dispatch.hello(女性)。

}

}

 

このコードの結果が実行されます。

こんにちは、Humnan  

こんにちは、Humnan

 

これは、静的な割り当てメカニズム

すべての発送方法のアクションバージョンの実装をターゲットに静的な型に依存して、静的な割り当てと呼ばれ、最も一般的なアプリケーションは、オーバーロードメソッド多型の静的割り当てです。静的割り当ては、コンパイル時に発生し、従って、作用の静的割り当てが実際に仮想マシンによって実行されていないかを決定します

人間の男=新マン();

静的タイプ、背中、「男」と呼ばれる上記のコード「ヒト」変数は、変数の実際の型と呼ばれます。静的タイプ自体が変更されない変数の静的な型を使用して、最終的な静的型がコンパイル時に知られているときに変化の静的な型のみ発生することを除いて、プログラム内のいくつかの変更で発生する可能性が実際のタイプ、実際変更のタイプの結果は、実行時に確認することができます。

ハロー()メソッドを呼び出すときに、呼び出し元のメソッドは、パラメータに渡されたデータの数とタイプ(データ症例の量がパラメータ法)に完全に依存して使用するためにオーバーロードバージョンディスパッチの前提の下です。(それはスタティック型の裁量で行われた場合、それはコンパイル時に決定されるので、しない仮想マシン)によって過負荷時にコードが意図的に同じ2つの静的タイプ、実数変数の異なるタイプ、可視コンパイラを定義します静的な型ではなく、決意するための基礎として、引数の実際の型。そして、コンパイル静的タイプは、パラメータの静的タイプに基づいて、使用するバージョンを過負荷にコンパイル相、javacコンパイラのかを決定して、知られています。これは、静的割り当ての最も典型的なアプリケーションであります

動的な割り当て

ダイナミックディスパッチや多型のもう一つの重要な症状 - オーバーライドメソッドは、非常に密接な関係を持っています。遷移が動的割り当ての例の良い実例である後サブクラスのオーバーライドメソッドは、呼び出し。これが一般的ですので、サンプルプログラムであって分析されることはありません。静的なタイプかどうかを判断するために、カバレッジ内の親クラスまたはサブクラスの判定実行方法では、ことは明らかである場合には、その後に関係なく上向きの移行を実施する方法、唯一の親クラスのメソッドを呼び出していないだろうが、現実はそれはによれば、異なるサブクラスの親クラスのインスタンスは、異なる方法がここで変数の種類に応じた方法の実際のバージョンを実行するためにディスパッチするため、明らかに、オーバーライドサブクラスと呼ばれます。ダウン実行されるプログラムの種類を決定するための実際の必要性を決定し、これは、プロセスの割当実行バージョンのタイプを決定する実際の方法に基づいて、実行時に動的ディスパッチと呼ばれています。

 分析方法

クラスファイルのコンパイルプロセスは、従来のコンパイラでのカップリング工程を含んでいない、すべてのメソッド呼び出しはシンボリック参照クラスではなく、メモリレイアウトのアドレスエントリの実際の操作方法よりも、内部に保存されたファイルがあります。この機能Javaはまた、署名された、ダイナミックリンクと呼ばれるクラスの動作中、特定の目的への直接参照の方法を決定することを可能にする、容量のより強力な動的な拡張をもたらすための方法の一部は、クラスローディング段階で初めて使用されるか、または引用さ直接参照に変換されたとき、この変換は、静的な解像度と呼ばれています。

    前提の上に成り立っ静的解像度:メソッド呼び出しのバージョンがあるが、それは不変であるプログラムが実際に実行する前に決定され、実行時にこのメソッドのバージョンを呼び出すことができます。言い換えれば、構文解析と呼ばれる、このようなメソッドを呼び出すと、コンパイラの時点で確定ターゲットを起動する必要があります。

    Java言語では、この方法は「不変上で実行することをコンパイラショー」に沿って外部からアクセスすることはできません直接前者のタイプに関連付けられている主に静的メソッドと2つのカテゴリに分類され、プライベートメソッド、、、両方の方法が必要ですそれらはクラスローディング段階で解決に適しているように、相続にそうでなければ不可能なことにより、他のバージョンを書き換えます。

   すなわち、4バイト命令のメソッド呼び出しの合計を提供するJava仮想マシン:

invokestatic:静的メソッドを呼び出します。
invokespecial:呼び出しインスタンスコンストラクタの<init>メソッド、およびprivateメソッドは、メソッドを継承しています。
INVOKEVIRTUAL:すべての仮想メソッドを呼び出します。
invokeinterface:コール・インタフェース・メソッドは、実行時にこのインタフェースのオブジェクトを決定します。
    限りメソッドが呼び出さinvokestaticとinvokespecialコマンドは、四つのカテゴリーには、それらはクラスにロードされる静的メソッド、プライベートメソッド、インスタンスコンストラクタとメソッド親クラスの条件に沿って、唯一の解決フェーズと呼ばれるバージョンで決定することができることができるよう分析方法のための直接参照シンボル参照。これらの方法は、対照的に、別の方法は(最終メソッドを除く)仮想メソッドと呼ばれている(この方法はさらに、最終的を含む)は、非仮想メソッドと呼ぶことができます。ここでは、INVOKEVIRTUALコマンドを使用して、最終的な呼び出し方法が、最終的に下の方法を説明する必要がありますが、カバーではない、それは可能性があるため、他の受信者の多状態の選択を送信する必要があり、他のバージョンではありませんので。Java言語仕様は明らかに、最終的な方法は、非仮想メソッドで示しています。
    解像度コールが静的プロセスである必要があり、それは完全にコンパイル時に決定され、シンボルが再び実行しない、クラスローディングの解決フェーズで決定される直接参照への参照を含むであろう完了を遅延。ディスパッチ呼は静的または動的であってもよい、(アプローチのパーセルパラメータとメソッドの呼び出し側がメソッドと呼ぶ)に応じた量は、単一および複数のディスパッチディスパッチに分けることができる割り当てられたケースの数に基づいていてもよいです。発送方法の二種類の組み合わせは、静的単一割り当て、複数のディスパッチ静的、動的単一割当て、動的ディスパッチ複数ディスパッチ状況の4種類を構成します。

おすすめ

転載: www.cnblogs.com/wangflower/p/12234006.html