Продолжаем изучать основные принципы ООП. Сегодня разберём что такое Полиморфизм и как его применять.
📗Что такое полиморфизм?
Полиморфизм — это принцип объектно-ориентированного программирования, который позволяет разным объектам выполнять одни и те же действия, независимо от их внутренней структуры. Само слово происходит от греческого “многообразие”.
Это как кнопка на пульте управления — одна и та же кнопка «Включить» работает по-разному для телевизора, кондиционера и стиральной машины, но вы нажимаете её одинаково.
В программировании это работает так: например, у нас есть две сущности — картинка и видео. Обеих можно отправить в сообщение, но делают они это по-разному. Вместо создания отдельных методов “отправить картинку” и “отправить видео”, мы используем один полиморфный метод “отправить”, который работает с обоими типами.
📗Типы полиморфизма
Динамический (переопределение методов)
Это возможность объекта вызывать переопределенные методы в зависимости от его фактического типа, а не типа ссылки.
Реализуется через наследование и переопределение методов.
Важные моменты:
Переопределение метода требует:
- Наследования от базового класса
 - Использования ключевого слова override (в некоторых языках)
 - Сохранения сигнатуры метода
 
При переопределении метода:
- Нельзя уменьшить уровень доступа
 - Можно расширить checked исключения
 - Можно добавить новые неchecked исключения
 
Методы, которые нельзя переопределить:
- static методы
 - final методы
 - private методы
 - Конструкторы
 
Например мы можем создать отдельный класс с животными. Животное может издавать какие то звуки (так как мы не знаем пока какое у нас животное). А когда создадим отдельный класс с конкретным животным, то сможем явно указать какой звук издаёт, к примеру Собака.
Мы используем аннотацию @override, она как раз указывает на то, что этот метод уже есть и мы его сейчас переделываем (переопределяем).
Мы как бы создаём копию класса Animal, но объект у нас Dog.
Animal myAnimal = new Dog();
myAnimal.sound(); // Выведет "Гав-гав!"
И используем метод из класса Animal, а не из класса Dog.
Зачем нам всё это нужно спросите вы?
Каких проблем избегаем?
- Дублирование кода
Без переопределения пришлось бы копировать общую логику в каждый подкласс. - Хрупкость архитектуры
Изменения в родительском классе ломают все зависимые подклассы. - Сложность поддержки
Добавление новых типов требует модификации всех мест, где используются проверки типов. - Нарушение инкапсуляции
Внешний код начинает зависеть от внутренней реализации подклассов. 
Переопределение — must have!
✅ Упрощает взаимодействие с разнородными объектами через общий интерфейс
✅ Делает код гибким для будущих расширений
✅ Уменьшает связность между компонентами системы
✅ Повышает надежность через строгую проверку типов (аннотация @Override)
✅ Соответствует принципам SOLID и ООП
Статический полиморфизм (перегрузка методов)
Это возможность иметь несколько методов с одним именем, но разными параметрами.
Реализуется через перегрузку методов.
Мы также используем один метод, но можем менять параметры и типы параметров в это методе. По факту это разные методы, но называются то они одинаково, что не вызовет путаницы. Особенно помогает, когда у вас множество подобных методов и вы сидите придумываете им разные названия, так как они отличаются по параметрам.
Простой пример:
Как мультитул — один инструмент, но разные функции: ножницы режут, отвертка закручивает, но все они в одном корпусе.
📗5 главных преимуществ
- Гибкость кода — можно добавлять новые классы, не меняя существующий код
 - Упрощение логики — работа с объектами через общий интерфейс
 - Сокращение дублирования — общие методы выносятся в базовые классы
 - Расширяемость — легко добавлять новую функциональность
 - Удобство тестирования — можно использовать mock-объекты
 
📗Подводные камни (на чём чаще всего «ловятся»)
- Попытка переопределить статический метод
 
- Переопределение private методов
 
Если у вас есть вопросы или вы просто хотите стать частью команды тестировщиков, то переходи в ТГ канал, где можем пообщаться с единомышленниками и найти много интересных и полезных знаний!Также если вам нужна индивидуальная консультация, менторство и помощь в создании проекта пишите в ТГ канал!