静的割り当て:
class A{
}
class B extends A{
}
class C extends A{
}
public class test {
public void f(A a) {
System.out.println("this is A");
}
public void f(B b) {
System.out.println("this is B");
}
public void f(C c) {
System.out.println("this is C");
}
public static void main(String[] args) {
A b=new B();
A c=new C();
test t=new test();
t.f(b); //this is A
t.f(c); //this is A
}
}
**静的割り当て:**すべての静的割り当てと呼ばれる派遣バージョンのメソッドの実装をターゲットに静的な型に依存しています。
コンパイル時に、メソッドのオーバーロードの典型的な用途は、(変数の宣言された型に応じて、コンパイラによって実行される)が発生します。
静的割り当ては、コンパイル時に発生し、従って仮想マシンが実際に行われないことにより、割り当てられた静的なアクションを決定します。
ダイナミックディスパッチ:
class A{
public void f() {
System.out.println("this is A");
}
}
class B extends A{
public void f() {
System.out.println("this is B");
}
}
class C extends A{
public void f() {
System.out.println("this is C");
}
}
public class test {
public static void main(String[] args) {
A a=new A();
A b=new B();
A c=new C();
a.f();//this is A
b.f();//this is B
c.f();//this is C
}
}
動的割付:
実行時に呼び出される動的割当タイプの決意方法はディスパッチプロセスの実際のバージョンに従って行わ。代表的なアプリケーションが書き換えられ
class A{
public void f() {
System.out.println("this is A");
}
}
class B extends A{
public void f() {
System.out.println("this is B");
}
}
class C extends A{
public void f() {
System.out.println("this is C");
}
}
public class test {
public static void main(String[] args) {
A a=new A();
A b=new B();
A c=new C();
a.f();//this is A
b.f();//this is B
c.f();//this is C
}
}
動的なメソッドディスパッチは、メソッド・テーブル領域を確立することです。子クラスは親クラス、同じメソッドへの親クラスポイントのアドレスで、その後サブクラスvtableのエントリ、またはサブクラスのメソッドテーブルのアドレスを書き換えていない場合はサブクラスオーバーライド・エントリ・アドレスを指し示す方法として交換されます。