Что такое динамический полиморфизм в ООП?

«Что такое динамический полиморфизм в ООП?» — вопрос из категории ООП, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Динамический полиморфизм (позднее связывание) — это механизм в объектно-ориентированном программировании, при котором конкретный метод, который будет вызван, определяется во время выполнения программы (runtime) на основе фактического типа объекта, а не типа ссылки.

Как это работает:

Механизм реализуется через переопределение методов (override) в иерархии наследования и виртуальные таблицы методов. JVM решает, какую реализацию метода вызвать.

Пример на Java:

class Animal {
    public void makeSound() {
        System.out.println("Some generic animal sound");
    }
}

class Dog extends Animal {
    @Override
    public void makeSound() { // Переопределение метода
        System.out.println("Bark!");
    }
}

class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Meow!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myAnimal; // Ссылка типа Animal

        myAnimal = new Dog(); // Объект типа Dog
        myAnimal.makeSound(); // Вывод: "Bark!" (вызван метод Dog)

        myAnimal = new Cat(); // Теперь объект типа Cat
        myAnimal.makeSound(); // Вывод: "Meow!" (вызван метод Cat)
    }
}

Ключевые моменты:

  • Основа: Наследование и переопределение методов.
  • Связывание: Позднее (динамическое) связывание — решение принимается JVM в runtime.
  • Аннотация @Override: Рекомендуется использовать для явного указания переопределения и проверки компилятором.
  • Противоположность — статический полиморфизм: Реализуется через перегрузку методов (overloading), где конкретный метод выбирается компилятором на этапе компиляции по сигнатуре.