Вызов функции Java перегружен и переопределен

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

Очевидно, я не прав. Я пытаюсь понять это. Может ли кто-нибудь помочь мне понять, где я не прав? Если мой алгоритм неверен, дайте мне знать. Заранее спасибо.

1 ответ

Решение

Учебный класс A не имеет meth(B a)поэтому, когда вы добавляете этот метод в класс B это ничего не отменяет (даже не meth(A a) из класса A).

Когда вы компилируете a.meth(b) компилятор выбирает метод, который больше всего подходит для типа аргумента B. поскольку B extends Ameth(A a) выбран

Когда вы выполняете a.meth(b) полиморфизм (через динамическое связывание) вызовы meth(A a) от фактического типа объекта, который a держит, что в вашем случае B, Итак, вы видите B a.meth() called

Другие вопросы по тегам