Вызов функции 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 A
meth(A a)
выбран
Когда вы выполняете a.meth(b)
полиморфизм (через динамическое связывание) вызовы meth(A a)
от фактического типа объекта, который a
держит, что в вашем случае B
, Итак, вы видите B a.meth() called