ホームページ  >  記事  >  Java  >  Java の静的バインディングと動的バインディングを理解する

Java の静的バインディングと動的バインディングを理解する

高洛峰
高洛峰オリジナル
2016-12-26 16:07:521294ブラウズ

Java プログラムの実行には、コンパイルと実行 (解釈) の 2 つのステップが必要です。同時に、Java はオブジェクト指向プログラミング言語です。サブクラスと親クラスが同じメソッドを持ち、サブクラスが親クラスのメソッドをオーバーライドする場合、プログラムが実行時にメソッドを呼び出すとき、親クラスのメソッドを呼び出す必要がありますか、それともサブクラスのオーバーライドされたメソッドを呼び出す必要がありますか? Java を初めて学習するときに遭遇する問題は次のとおりです。ここではまず、どのメソッドを呼び出すか、または変数の操作をバインディングと呼ぶかを決定します。

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) を定義している場合、メソッドが呼び出されます。それ以外の場合は、メソッド f (String) が D のスーパークラスで検索されます。

問題について考える:

タスクを完了するためのメソッドをメソッドユーザーに提供する方法。ユーザーに特別な要件があり、独自の方法をカスタマイズできる場合はどうすればよいでしょうか?

関連する知識:

子クラスと親クラス、インターフェイス、上向き変換、動的バインディング

具体的なコード:

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();
  }
}

以上がこの記事の全内容です、皆様の学習にお役に立てれば幸いです。

Java の静的バインディングと動的バインディングの理解に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。