Java には 2 つのバインディング メソッドがあり、1 つは静的バインディングであり、早期バインディングとも呼ばれます。もう 1 つは動的バインディングであり、遅延バインディングとも呼ばれます。
プログラムバインディングの概念:
バインディングは、メソッド呼び出しと、そのメソッドが配置されているクラス (メソッド本体) との関連付けを指します。 Java の場合、バインディングは静的バインディングと動的バインディング、または早期バインディングと遅延バインディングに分けられます
静的バインディング (早期バインディング コンパイラー バインディング):
プログラム実行前のメソッド すでにバインドされており、今回はコンパイラーまたは他のリンカーによって実装されます。例: C. Java の場合、プログラムのコンパイル中のバインディングとして理解できます。特に、Java の Final、static、private、およびコンストラクター メソッドのみが早期バインディングです
動的バインディング (遅延バインディング ランタイム バインディング):
遅延バインディング: バインディング ベース実行時の特定のオブジェクトのタイプに応じて。
言語が遅延バインディングを実装する場合、実行時にオブジェクトの型を決定し、それぞれ適切なメソッドを呼び出す何らかのメカニズムも提供する必要があります。つまり、この時点ではコンパイラはまだオブジェクトの型を認識していませんが、メソッド呼び出しメカニズムはそれ自体で調査して、正しいメソッド本体を見つけることができます。言語が異なれば遅延バインディングの実装方法も異なります。次のように考えてください。それらはすべて、何らかの特別な種類の情報をオブジェクトに挿入する必要があります。
動的バインディングのプロセス:
仮想マシンはオブジェクトの実際の型のメソッドテーブルを抽出します
仮想マシンはメソッドシグネチャを検索します
メソッドを呼び出す
バインディング関連のまとめ:
3つの概念を理解した後、Javaは遅延バインディングに属することがわかりました。 Java では、ほとんどすべてのメソッドが実行時に動的にバインドされるメソッドはサブクラスまたは基本クラスに属します。ただし、静的メソッドと最終メソッドは継承できないため、コンパイル時に値が決定される特殊なメソッドもあります。特に注意すべき点は、プライベートに宣言されたメソッドとメンバー変数はサブクラスに継承できないことです。すべてのプライベート メソッドは暗黙的に Final として指定されます (このことから、メソッドを Final 型として宣言することは、メソッドが上書きされるのを防ぐためであることがわかります)。 Java で動的バインディングを効果的に無効にすることです)。 Java の遅延バインディングは JVM によって実装されます。明示的に宣言する必要はありませんが、C++ ではメソッドが遅延バインディングを持つことを明示的に宣言する必要があります。 Java のアップキャストまたはポリモーフィズムは動的バインディングを利用して実現されるため、動的バインディングを理解することはアップキャストとポリモーフィズムを意味します。
Java のメソッドの場合、事前にバインドされている Final、static、private、およびコンストラクター メソッドを除き、他のすべてのメソッドは動的にバインドされます。動的バインディングは通常、親クラスとサブクラスの変換宣言の下で発生します:
例: Parent p = new Children();
具体的なプロセスは次のとおりです:
1. コンパイラはオブジェクトの宣言をチェックします。型とメソッドの名前。 x.f(args) メソッドを呼び出し、x がクラス C のオブジェクトとして宣言されているとします。その場合、コンパイラーはクラス C 内の f という名前のすべてのメソッドと、クラス C
2 のスーパークラスから継承された f メソッドを列挙します。次に、コンパイラはメソッド呼び出しで提供されたパラメータの型をチェックします。 f という名前のすべてのメソッドの中に、呼び出しで指定されたパラメーターの型に最も一致するパラメーターの型がある場合、このメソッドは、プログラムの実行中に、「オーバーロード解決」と呼ばれます
3。動的バインディングを使用して呼び出される場合、仮想マシンは、x が指すオブジェクトの実際の型と一致するバージョンのメソッドを呼び出す必要があります。実際の型が D (C のサブクラス) であると仮定します。クラス D が f(String) を定義している場合、メソッドが呼び出されます。そうでない場合は、D のスーパークラスでメソッド f(String) が検索されます。
問題について考える:
タスクを完了するためのメソッドをメソッドユーザーに提供する方法。ユーザーに特別な要件があり、独自の方法をカスタマイズできる場合はどうすればよいでしょうか?関連する知識:
子クラスと親クラス、インターフェース、上方変換、動的バインディング特定のコード:
package com.chengxuyuanzhilu; public interface MyInterfaces { void doting(); } package com.chengxuyuanzhilu; public class Drink implements MyInterfaces { @Override public void doting() { System.out.println("我在喝水"); } } package com.chengxuyuanzhilu; public class Eat implements MyInterfaces { @Override public void doting() { System.out.println("我在吃东西"); } } package com.chengxuyuanzhilu; public class Run implements MyInterfaces { @Override public void doting() { System.out.println("我在奔跑"); } } package com.chengxuyuanzhilu; public class TestDynamicBind { public static void main(String[] args) { MyInterfaces my = null; my = new Eat(); bind(my); my = new Drink(); bind(my); my = new Run(); bind(my); } static void bind(MyInterfaces my){ my.doting(); } }
2. private、static、final で変更された変数またはメソッドを使用し、静的バインディングを使用します。仮想メソッド (サブクラスによってオーバーライドできるメソッド) は、ランタイム オブジェクトに基づいて動的にバインドされます。
3. 静的バインディングはクラス情報を使用して完了しますが、動的バインディングはオブジェクト情報を使用して完了する必要があります。
4. オーバーロードされたメソッドは静的バインディングを使用して完成され、オーバーライド メソッドは動的バインディングを使用して完成されます。
りー
以上がJava コード分析における静的バインディングと動的バインディングの概念と違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。