Использование полиморфизма в 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)

А значит у вас обычная перегрузка, а не переопределение.

А раз метод не переопределён в потомке и у вас переменная типа предка, то и вызывается метод предка.

→ Ссылка