Полиморфизм времени выполнения в Java для доступа к переопределенному методу, который был снова переопределен
Благодаря Dynamic Method Dispatch, при создании объекта с использованием ссылки на суперкласс и вызове метода через этот объект, который был переопределен в подклассе, переопределенный метод в подклассе будет вызываться вместо исходного метода в суперклассе. Что произойдет, если переопределенный метод был снова переопределен в следующем подклассе?
Например, допустим, что A является родительским классом, B расширяет A, а C расширяет B. Скажем, метод void m1() был написан в A, а затем переопределен в B, а затем снова переопределен в C. Теперь, если мы создаем и объект следующим образом-
A obj = new B();
obj.m1();
какой метод будет вызван? Один в Б или тот в С?
1 ответ
Вы всегда можете попробовать это сами, но ответ очень прост: B
метод будет вызван.
class A {
public static void main(String a[]) {
A obj = new B();
obj.m();
}
void m() {
System.out.println("It's A");
}
}
class B extends A {
@Override
void m() {
System.out.println("It's B");
}
}
class C extends B {
@Override
void m() {
System.out.println("It's C");
}
}
Выполнение этой программы напечатает It's B
, Обратите внимание, что расположение main
не имеет значения.
Если подумать, должно быть ясно, что "C
метод будет называться"не может быть ответа; если это так, какой метод будет вызван после добавления другого class C2 extends B
переопределяющий метод void m()
?
В общем, если у вас есть obj.m(arguments)
и хочу узнать, какие m
будет выполнен с использованием следующих шагов:
- Определить тип времени выполнения
obj
(в этом случаеB
). - Загляните в соответствующий класс для метода
m(type of arguments)
, - Если такого метода нет, перейдите в суперкласс и повторите 2.