JavaRush /Java Blog /Random-JA /Java の早期バインディングと後期バインディングの違い

Java の早期バインディングと後期バインディングの違い

Random-JA グループに公開済み
Java の初期 (静的)バインディングと後期 (動的)バインディング の違いを理解するには、まずバインディングとは何かを理解する必要があります。リンクとは、リンクとコードの間に接続があることを意味します。たとえば、参照する変数は、それが定義されているコードにバインドされます。同様に、呼び出されるメソッドは、それが定義されているコード内の場所にバインドされます。
Java の早期バインディングと後期バインディングの違い - 1
Java 言語には、早期バインディング (静的とも呼ばれます) と後期バインディング(それぞれ動的) という 2 つのタイプのメソッド バインディングがあります。Java でメソッドを呼び出すということは、コンパイル時またはプログラムが実行されてオブジェクトが作成される実行時のいずれかに、メソッドが特定のコードにバインドされることを意味します。名前が示すように、静的リンクはコンパイル時に行われるため、本質的により静的です。つまり、コードは、Java ソース コードをクラス ファイルにコンパイルした後にどのメソッドを呼び出すかを「認識」しています。これはプログラムのライフサイクルの初期段階を指すため、早期バインディングとも呼ばれます。一方、動的リンクは、プログラムが Java 仮想マシンによって実行された後、実行時に発生します。この場合、どのメソッドを呼び出すかは特定のオブジェクトによって決まります。オブジェクトは実行時に作成されるため、コンパイル時には情報を利用できません。これはプログラムのライフサイクルの後半で発生するため、Java では遅延バインディングと呼ばれます。
したがって、Java における静的バインディングと動的バインディングの基本的な違いは、前者は参照変数の型に基づいてコンパイル時に早い段階で発生し、後者は具象オブジェクトを使用して実行時に後で発生することです。
これをよりよく理解し、Java の面接でよく聞かれるこの質問に答えることができるように、さらにいくつかの違いを見てみましょう。

Java の早期バインディングと後期バインディング

Java の静的バインディングと動的バインディングには多くの違いがありますが、最も重要なのは、JVM が静的バインディングをどのように使用するかです。スコープ内に同じ名前のメソッドが複数ある場合に、JVM がどのメソッドを呼び出すかをどのように決定するのか疑問に思ったことはありますか? メソッドのオーバーロードまたはオーバーライドを使用したことがある場合は、Java では同じ名前の複数のメソッドを使用できることをご存知でしょう。Java の場合、JVM は静的バインディングと動的バインディングの両方を使用して、目的のメソッドを選択します。

Java での静的バインディングと動的バインディングの例

このプログラムでは、静的バインディングを使用すると、コンパイル時に仮想メソッドのバインドが発生しないことがわかります。これは、事前にバインドされる静的メソッドの場合と同様に、スーパークラスからメソッドを呼び出すことになるためです。サブクラスのメソッドが呼び出される場合、実行時に関数をバインドするために特定のオブジェクトが使用されるため、仮想関数をバインドするために動的バインディングが使用されます。
public class Main {
  public static void main(String[] args) {

    // Пример статического и динамического связывания в Java
    Insurance current = new CarInsurance();

    // Динамическое связывание на основе an object
    int premium = current.premium();

    // Статическое связывание на основе класса
    String category = current.category();

    System.out.println("premium : " + premium);
    System.out.println("category : " + category);
  }
}

class Insurance{
  public static final int LOW = 100;

  public int premium(){
    return LOW;
  }

  public static String category(){
    return "Insurance";
  }

}

class CarInsurance extends Insurance{
  public static final int HIGH = 200;

  public int premium(){
    return HIGH;
  }

  public static String category(){
    return "Car Insurance";
  }

}
Результаты выполнения:

premium : 200
category : Insurance
ご覧のとおり、メソッド呼び出しではpremium()サブクラスからのメソッドが実行され、メソッド呼び出しではcategory()スーパークラス メソッドが実行されます。これは、premium()- は遅延バインディングを使用して解決される仮想メソッドであるのに対し、category()- はクラス名によるコンパイル時の静的バインディングを使用して解決される静的メソッドであるためです。
Java について興味がありますか? Java 開発者グループに参加してください。

Java の早期バインディングと後期バインディングの違い

Java がメソッド呼び出しをバインドする方法と、静的バインディングと動的バインディングがどのように機能するかを理解したところで、Java の早期バインディングと後期バインディングの主な違いを要約してみましょう。
  1. 静的リンクはコンパイル時に発生し、動的リンクは実行時に発生します。

  2. 静的リンクはプログラムのライフサイクルの早い段階で発生するため、早期バインディングと呼ばれます。同様に、動的バインディングはプログラムの実行の後半で発生するため、遅延バインディングとも呼ばれます。

  3. 静的バインディングは Java 言語でオーバーロードされたメソッドを解決するために使用され、動的バインディングは Java 言語でオーバーライドされたメソッドを解決するために使用されます。

  4. 同様に、プライベート メソッド、静的メソッド、ターミナル メソッドはオーバーライドできないため、静的バインディングを使用して解決されますが、すべての仮想メソッドは動的バインディングを使用して解決されます。

  5. 静的バインディングの場合、使用されるのは具体的なオブジェクトではなく、型情報、つまり参照変数の型が目的のメソッドを見つけるために使用されます。一方、動的バインディングは、特定のオブジェクトを使用して Java で目的のメソッドを見つけます。
ここでは、Java の静的バインディングと動的バインディングの概念に基づいた良い演習を示します。「次のプログラムを実行すると何が出力されますか?」という質問に答えられますか?
Java の早期バインディングと後期バインディングの違い - 2
このプログラムは何を出力しますか? CollectionSetまたはHashSetJava の初期 (静的)バインディングと後期 (動的)バインディング の違いについて説明したかったのはこれだけです。これは、候補者の知識の深さをテストする非常に多くの機会を提供するため、Java 電話面接の最高の質問の 1 つです。privatestaticfinal メソッドは静的リンクを使用してバインドされるのに対し、仮想メソッドは動的リンクを使用してバインドされることに常に注意してください。同様に、静的バインディングの最良の例はメソッドのオーバーロードですが、オーバーライドは動的です。 ソース
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION