Как ответить
Полиморфизм в ООП — это способность объектов разных классов отвечать на одни и те же вызовы методов по-своему. Простыми словами: один интерфейс — много реализаций.
Выделяют два основных вида:
- Статический (compile-time) полиморфизм — реализуется через перегрузку методов (overloading). Одно имя метода, разные параметры. Решение о том, какую версию вызвать, принимается на этапе компиляции.
- Динамический (runtime) полиморфизм — реализуется через переопределение методов (overriding) в наследниках. Решение о том, какой метод выполнить, принимается на этапе выполнения, когда известен реальный тип объекта.
Пример динамического полиморфизма на Java:
public class Animal {
public void sound() {
System.out.println("Animal makes sound");
}
}
public class Dog extends Animal {
@Override
public void sound() {
System.out.println("Bark");
}
}
public class Cat extends Animal {
@Override
public void sound() {
System.out.println("Meow");
}
}
// Использование
Animal[] animals = {new Dog(), new Cat()};
for (Animal a : animals) {
a.sound(); // Выведет 'Bark', затем 'Meow'
}
Это позволяет писать код, работающий с базовым типом (Animal), не завязываясь на конкретные наследники. Новые классы (например, Bird с переопределённым sound()) добавляются без изменения вызывающего кода — принцип открытости/закрытости.
Ключевая польза: упрощается расширение системы, уменьшается связанность модулей. instanceof и if-else по типам — антипаттерн; полиморфизм позволяет этого избежать.