Какие виды полиморфизма существуют в программировании (на примере Java)?

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

Ответ

В контексте Java можно выделить четыре основных вида полиморфизма:

  1. Полиморфизм подтипов (наследование/интерфейсы) Наиболее важный вид. Объект подкласса может рассматриваться как объект суперкласса или интерфейса.

    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).

  2. Ad-hoc полиморфизм (перегрузка методов) Несколько методов с одним именем, но разными параметрами в одном классе.

    class Printer {
        void print(int x) { ... }
        void print(String s) { ... } // Перегрузка (overloading)
    }
  3. Параметрический полиморфизм (дженерики) Классы, интерфейсы и методы, которые работают с параметризованными типами.

    List<String> stringList = new ArrayList<>();
    List<Integer> integerList = new ArrayList<>(); // Один класс List для разных типов
  4. Полиморфизм приведения (coercion) Неявное автоматическое преобразование одного типа в другой (например, int в double).

    double result = 5 + 2.5; // int 5 неявно приводится к double

На практике полиморфизм подтипов — краеугольный камень ООП, обеспечивающий расширяемость и соблюдение принципа открытости/закрытости (Open/Closed Principle).