Вы всегда можете попробовать сами, но ответ очень прост: будет вызван метод 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.