-3
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? !*/
    }
}

私はこの行を理解しようとしています:

a.meth(b);

これが私のアルゴリズムです: a には静的型 A と動的型 B があるので、階層を下ってクラス B に移動します。また、引数の静的型、つまり. b は B であるため、出力は次のようになります。

B b.meth() called

明らかに私は間違っています。私はこれを理解しようとしています。誰かが私が間違っている場所を理解するのを手伝ってくれますか? 私のアルゴリズムが間違っている場合はお知らせください。前もって感謝します。

4

1 に答える 1