Использование полиморфизма в Java
Только изучаю Java, не будьте строги. Есть код
class Main {
public static void main(String[] args) {
A a = new B();
a.method(100);
}
}
class A {
public void method(Object obj) {
System.out.println("A");
}
}
class B extends A {
public void method(Integer obj) {
System.out.println("B");
}
}
При вызове a.method(100);я ожидал получить "B", т.к. a является объектом класса B. Но в результате получаю "A". Почему так?
Ответы (1 шт):
Смотрите, вы ждёте, что сработает диспетчеризация методов и вместо метода предка будет вызван метод потомка потому, что имеет место переопределение, и у вас по факту new создал экземпляр потомка.
Вы очень правильно мыслите, но тот, кто дал вам это задание, постарался вас подловить.
Здесь не происходит переопределения метода в потомке. Попробуйте добавить аннотацию и код не скомпилируется:
class B extends A {
@Override //Compilation error
public void method(Integer obj) {
System.out.println("B");
}
}
А значит никакой диспетчеризации и выполнения методов потомка вместо методов предка.
Эти методы имеют разную сигнатуру:
public void method(Object obj)
public void method(Integer obj)
А значит у вас обычная перегрузка, а не переопределение.
А раз метод не переопределён в потомке и у вас переменная типа предка, то и вызывается метод предка.