class A {
void meth(A a) { System.out.println("A a.meth() called"); }
void meth(D d) { System.out.println("A d.meth() called"); }
void meth(E e) { System.out.println("A e.meth() called"); }
}
class D {}
class E extends D {}
class B extends A {
void meth(A a) { System.out.println("B a.meth() called"); }
void meth(B b) { System.out.println("B b.meth() called"); }
void meth(D d) { System.out.println("B d.meth() called"); }
void meth(E e) { System.out.println("B e.meth() called"); }
}
public class OverldOverd {
public static void main (String[] args) {
B b = new B();
A a = b;
a.meth(a); // B a.meth() called
a.meth(b); // B a.meth() called /*! Why? !*/
}
}
私はこの行を理解しようとしています:Javaのオーバーロード&オーバーライド関数呼び出し
a.meth(b);
は、ここに私のアルゴリズムです:Aは、静的な型Aとダイナミック型Bを持っているので、私たちはクラスに階層を下りますB.また、引数の静的型、すなわち。 bはBなので、代わりに出力する必要があります:
B b.meth() called
明らかに私は間違っています。私はこれを理解しようとしています。誰かが私がどこが間違っているのか理解するのを助けることができる?私のアルゴリズムが間違っていたら私に知らせてください。前もって感謝します。