バインディング時間は、静的と動的の2つのタイプに分類できます。静的バインディングと動的バインディングの違いは何ですか?
それをさらに説明するために、それぞれの簡単な例を挙げていただけますか?
最も一般的な用語では、静的バインディングは、参照がコンパイル時に解決されることを意味します。
Animal a = new Animal();
a.Roar(); // The compiler can resolve this method call statically.
動的バインディングは、実行時に参照が解決されることを意味します。
public void MakeSomeNoise(object a) {
// Things happen...
((Animal) a).Roar(); // You won't know if this works until runtime!
}
バインディングがいつ発生するかは、コンパイル時(静的)または実行時(動的)によって異なります。静的バインディングは、単純なクラスメソッドを呼び出すときに使用されます。クラス階層と仮想メソッドの処理を開始すると、コンパイラーはいわゆる [〜#〜] vtable [〜#〜] sの使用を開始します。その時点では、コンパイラーは呼び出すメソッドを正確に認識していないため、実行する正しいメソッドを見つけるためにランタイムまで待機する必要があります(これは [〜#〜] vtable [〜#〜]を介して行われます) )。これは動的バインディングと呼ばれます。
詳細と参照については、ウィキペディアの記事 仮想テーブル を参照してください。
Quoraユーザー「Monis Yousuf」のこの完璧な答えに出くわしました。彼はこれを完全に説明しています。他の人のためにここに置いています。
バインディングは主に、ポリモーフィズムに関連するオブジェクト指向プログラミングの概念です。
まず、Polymorphismが何であるかを理解します。本はそれが「1つの名前と複数のフォーム」を意味すると言います。真実ですが、抽象的すぎます。実際の例を見てみましょう。あなたは「医者」に行きます、医者は眼科医、耳鼻咽喉科医、脳神経外科医、ホメオパスなどかもしれません。
ここで、「医師」は名前であり、複数のタイプを持つ場合があります。それぞれが独自の機能を実行します。これは実生活におけるポリモーフィズムです。
関数のオーバーロード:この概念は静的バインディングを示しています。関数のオーバーロードは、大まかに定義できます。同じ名前でシグネチャが異なる2つ以上のメソッド(関数)(パラメーターの数、パラメーターの型、異なる戻り値の型を含む)は、オーバーロードされたメソッド(または関数)と呼ばれます。
長方形と円の面積を計算する必要があるとします。以下のコードを参照してください:
_class CalculateArea {
private static final double PI = 3.14;
/*
Method to return area of a rectangle
Area of rectangle = length X width
*/
double Area(double length, double width) {
return (length * width);
}
/*
Method to return area of circle
Area of circle = π * r * r
*/
double Area(double radius) {
return PI * radius * radius;
}
}
_
上記のコードには、パラメータが異なる2つのメソッド「Area」があります。このシナリオは、関数のオーバーロードと見なされます。
さて、本当の質問です:この静的バインディングはどうですか?
上記の関数をコードで呼び出すときは、渡すパラメーターを指定する必要があります。このシナリオでは、次のいずれかを渡します。
コンパイル時にJavaコンパイラは呼び出すWHICH関数を理解できるため、これはコンパイル時(または静的)バインディングです。
関数のオーバーライド:関数のオーバーライドは、継承で示される概念です。これは、おおまかに次のように定義できます。親クラスにメソッドが存在し、そのサブクラスにもSAMEシグネチャを持つ同じメソッドがある場合、関数オーバーライドと呼ばれます。 [もっとありますが、簡単にするために、私はこの定義を書いています]以下のコードで理解しやすくなります。
_class ParentClass {
int show() {
System.out.println("I am from parent class");
}
}
class ChildClass extends ParentClass{
int show() {
System.out.println("I am from child class");
}
}
class SomeOtherClass {
public static void main (String[] s) {
ParentClass obj = new ChildClass();
obj.show();
}
}
_
上記のコードでは、同じ署名(および名前)が親クラスと子クラスの両方に存在するため、メソッドshow()
がオーバーライドされています。
3番目のクラスSomeOtherClass
では、タイプParentClass
の参照変数(obj)がChildClassのオブジェクトを保持します。次に、メソッド_show(
_)が同じ参照変数(obj)から呼び出されます。
繰り返しますが、同じ質問:この動的バインディングはどうですか?
コンパイル時に、コンパイラーはReference変数がParentClass
型であることを確認し、メソッドshow()
がこのクラスに存在するかどうかを確認します。これをチェックしたら、コンパイルは成功です。
これで、プログラムが実行されると、オブジェクトがChildClass
であることがわかるため、ChildClass
のshow()
メソッドが実行されます。この決定はRUNTIMEに行われるため、Dynamic Binding(またはランタイムポリモーフィズム)と呼ばれます。
リンク 元の回答
静的バインディング:は、コンパイル時の型、メンバー、および操作を解決するプロセスです時間例:
Car car = new Car();
car.Drive();
この例では、コンパイラーは、Drive
オブジェクトでパラメーターのないcar
メソッドを探すことによってバインディングを実行します。その方法が見つからなかった場合! オプションのパラメーター をとるメソッドを検索し、そのメソッドが見つからなかった場合、そのメソッドを検索 base class of Car
し、そのメソッドが見つからなかった場合Car
タイプの 拡張メソッド を再度検索します。一致が見つからない場合は、コンパイルエラーが発生します。
この場合バインディングはコンパイラーによって行われ、バインディングはオブジェクトのタイプを静的に把握していることに依存します。これにより、静的バインディングになります。
動的バインディング:動的バインディングは、バインディング(型、メンバー、および操作を解決するプロセス)をコンパイル時からに延期しますruntime。例えば:
dynamic d = new Car();
d.Drive();
動的タイプは、d
のランタイムタイプがDrive
を持っていると予想することをコンパイラーに伝えますメソッド、しかしそれを証明することはできませんstatically。 d
は動的であるため、コンパイラーはDrive
のdへのバインディングをランタイムまで延期します。
動的バインディングは、コンパイル時に特定の関数、操作のメンバーが存在することがコンパイラーで認識されていなかった場合に役立ちます。これは通常、動的プログラミング言語、[〜#〜] com [〜#〜]、reflection。