Найти в Дзене

Java Введение. Полиморфизм. Часть 13.

Оглавление

Продолжаем изучать основные принципы ООП. Сегодня разберём что такое Полиморфизм и как его применять.

📗Что такое полиморфизм?

Полиморфизм — это принцип объектно-ориентированного программирования, который позволяет разным объектам выполнять одни и те же действия, независимо от их внутренней структуры. Само слово происходит от греческого “многообразие”.

Это как кнопка на пульте управления — одна и та же кнопка «Включить» работает по-разному для телевизора, кондиционера и стиральной машины, но вы нажимаете её одинаково.

В программировании это работает так: например, у нас есть две сущности — картинка и видео. Обеих можно отправить в сообщение, но делают они это по-разному. Вместо создания отдельных методов “отправить картинку” и “отправить видео”, мы используем один полиморфный метод “отправить”, который работает с обоими типами.

📗Типы полиморфизма

Динамический (переопределение методов)

Это возможность объекта вызывать переопределенные методы в зависимости от его фактического типа, а не типа ссылки.

Реализуется через наследование и переопределение методов.

Важные моменты:

Переопределение метода требует:

  1. Наследования от базового класса
  2. Использования ключевого слова override (в некоторых языках)
  3. Сохранения сигнатуры метода

При переопределении метода:

  1. Нельзя уменьшить уровень доступа
  2. Можно расширить checked исключения
  3. Можно добавить новые неchecked исключения

Методы, которые нельзя переопределить:

  1. static методы
  2. final методы
  3. private методы
  4. Конструкторы

Например мы можем создать отдельный класс с животными. Животное может издавать какие то звуки (так как мы не знаем пока какое у нас животное). А когда создадим отдельный класс с конкретным животным, то сможем явно указать какой звук издаёт, к примеру Собака.

-2

Мы используем аннотацию @override, она как раз указывает на то, что этот метод уже есть и мы его сейчас переделываем (переопределяем).

Мы как бы создаём копию класса Animal, но объект у нас Dog.

Animal myAnimal = new Dog();
myAnimal.sound(); // Выведет "Гав-гав!"

И используем метод из класса Animal, а не из класса Dog.

Зачем нам всё это нужно спросите вы?

Каких проблем избегаем?

  1. Дублирование кода
    Без переопределения пришлось бы копировать общую логику в каждый подкласс.
  2. Хрупкость архитектуры
    Изменения в родительском классе ломают все зависимые подклассы.
  3. Сложность поддержки
    Добавление новых типов требует модификации всех мест, где используются проверки типов.
  4. Нарушение инкапсуляции
    Внешний код начинает зависеть от внутренней реализации подклассов.

Переопределение — must have!

Упрощает взаимодействие с разнородными объектами через общий интерфейс
Делает код гибким для будущих расширений
Уменьшает связность между компонентами системы
Повышает надежность через строгую проверку типов (аннотация @Override)
Соответствует принципам SOLID и ООП

Статический полиморфизм (перегрузка методов)

Это возможность иметь несколько методов с одним именем, но разными параметрами.

Реализуется через перегрузку методов.

Мы также используем один метод, но можем менять параметры и типы параметров в это методе. По факту это разные методы, но называются то они одинаково, что не вызовет путаницы. Особенно помогает, когда у вас множество подобных методов и вы сидите придумываете им разные названия, так как они отличаются по параметрам.

-3

Простой пример:
Как мультитул — один инструмент, но разные функции: ножницы режут, отвертка закручивает, но все они в одном корпусе.

📗5 главных преимуществ

  1. Гибкость кода — можно добавлять новые классы, не меняя существующий код
  2. Упрощение логики — работа с объектами через общий интерфейс
  3. Сокращение дублирования — общие методы выносятся в базовые классы
  4. Расширяемость — легко добавлять новую функциональность
  5. Удобство тестирования — можно использовать mock-объекты

📗Подводные камни (на чём чаще всего «ловятся»)

  • Попытка переопределить статический метод
-4
  • Переопределение private методов
-5

Если у вас есть вопросы или вы просто хотите стать частью команды тестировщиков, то переходи в ТГ канал, где можем пообщаться с единомышленниками и найти много интересных и полезных знаний!Также если вам нужна индивидуальная консультация, менторство и помощь в создании проекта пишите в ТГ канал!

Обучение тестированию