Ответ
Динамический полиморфизм (позднее связывание) — это механизм в объектно-ориентированном программировании, при котором конкретный метод, который будет вызван, определяется во время выполнения программы (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), где конкретный метод выбирается компилятором на этапе компиляции по сигнатуре.