私はかなり話題に結合について混乱しています。我々は結合静的に知っているように、基準の種類は結合ではなく、それが参照しているオブジェクトと動的に結合を決定するためにチェックされ、参照が指しているオブジェクトのタイプを考慮しています。
class A
{
void show()
{
System.out.println("From A");
}
}
class B extends A
{
void show()
{
System.out.println("From B");
}
}
class Main
{
public static void main(String[] quora)
{
A a1 = new A();
A a2 = new B();
a1.show(); //line 1
a2.show(); //line 2
}
}
上記の例では、我々は、コンパイル時に、両方のライン1を参照することができ、LINE2、静的結合によって治療され、(基準の型がAであるため)、それらがAクラスのメソッドのショーにリンクします。しかし、実行時に、呼び出しが解決され、LINE1リンクAクラスのメソッドのショーに()とBクラスのメソッドへのLINE2リンクつまり、オブジェクトの種類や、私たちは、動的バインディングを言うことができます。さ
だから私の主な目的は、以下のことを知ることです。
ダイナミックは常に静的に結合した後の結果を結合されていますか?または私は何かを間違って理解していますか?
それが本当なら、それはすべてのメソッドを動的に実行時にリンクされていると言うこと本当ですか?
我々はそれを一般化することはできますか?
基本的に、あなたがメソッドを呼び出すたびに、コンパイラは把握している過負荷をタイプして、メソッドに渡す引数に基づいて、コールに。これは、スタティックバインディングです。その後、実行時に、ランタイムは把握します実装の呼び出しに(すでにこの時点で決定される)、過負荷のを。
考えてみましょう:
class A
{
void f(Object o)
{
System.out.println("From A");
}
}
class B extends A
{
void f(Object o)
{
System.out.println("From B (Object)");
}
void f(String s)
{
System.out.println("From B (String)");
}
}
あなたがやる:
A a = new B();
a.f("");
何が起こるのですか?コンパイル時に、コンパイラがオーバーロードを選択しているf(Object)
原因の種類にa
あることA
(から選択する唯一の方法があります!)。以来続いて、実行時に、a
実際のインスタンスを参照するB
、B
のの実装f(Object)
オーバーロードは、印刷、呼び出されますFrom B (Object)
。私が見た一つの誤解は、出力があることを期待していますFrom B (String)
。コンパイラは、上のこの過負荷の存在を知らないので、これは間違っていますa
。
ダイナミックは常に静的に結合した後の結果を結合されていますか?
我々は上記のコードの結果からわかるように、答えはイエスです。スタティックバインディングは、前者が常に最初に起こるので、動的バインディングは、実行時に起こる、コンパイル時に起こります。
それが本当なら、それはすべてのメソッドを動的に実行時にリンクされていると言うこと本当ですか?
私はあなたがうまくいけば、上記の詳細な説明はすでにこれを答えているだろう、これで何を意味するかわかりません。
どんなに、静的には、すべてのメソッド呼び出しのための結合結合して、ダイナミックさつもりはいつも何があるのか?
非常にいくつかの選択肢があるのではい、時にはこれらの2つのプロセスは、非常に迅速にかかわらず行くことができます。あなたは上のメソッドを呼び出しているクラスがfinalクラスであるとき、あなたはおそらく、あなたの操作を行い、動的バインディングに「選択」を行う必要はありませんか?