Ответ
В контексте Java можно выделить четыре основных вида полиморфизма:
-
Полиморфизм подтипов (наследование/интерфейсы) Наиболее важный вид. Объект подкласса может рассматриваться как объект суперкласса или интерфейса.
interface Animal { void makeSound(); } class Dog implements Animal { public void makeSound() { System.out.println("Woof!"); } } // Полиморфное использование: Animal myAnimal = new Dog(); // Ссылка типа Animal, объект типа Dog myAnimal.makeSound(); // Вызовется Dog.makeSound() -> "Woof!"Почему? Позволяет писать общий код, работающий с абстракциями (
Animal), а не с конкретными реализациями (Dog,Cat). -
Ad-hoc полиморфизм (перегрузка методов) Несколько методов с одним именем, но разными параметрами в одном классе.
class Printer { void print(int x) { ... } void print(String s) { ... } // Перегрузка (overloading) } -
Параметрический полиморфизм (дженерики) Классы, интерфейсы и методы, которые работают с параметризованными типами.
List<String> stringList = new ArrayList<>(); List<Integer> integerList = new ArrayList<>(); // Один класс List для разных типов -
Полиморфизм приведения (coercion) Неявное автоматическое преобразование одного типа в другой (например,
intвdouble).double result = 5 + 2.5; // int 5 неявно приводится к double
На практике полиморфизм подтипов — краеугольный камень ООП, обеспечивающий расширяемость и соблюдение принципа открытости/закрытости (Open/Closed Principle).