Что такое Полиморфизм?
Слово «полиморфизм» произошло от двух греческих слов: «Poly» означающего «многочисленный» и «Morph» — форма. Если перевести дословно – бесчисленное множество форм. Живые примеры этого явления можно встретить в земной коре, среди животных и рептилий, а также в других областях науки. Но речь сегодня не об этом, а об основной парадигме ООП, применяющейся во многих языках программирования.
Что такое полиморфизм в программировании?
Полиморфизм в ООП подразумевает собой особенность, при которой одно и то же действие выполняется разными способами. Или, проще говоря, такая концепция позволяет выполнять несколько реализаций одной и той же сущности.
Чаще всего она возникает при наличии другой парадигмы ООП — наследования, т. е. когда у нас существует множество классов, связанных друг с другом. Наследование позволяет одному классу приобретать свойства и атрибуты другого, а полиморфизм использует унаследованные свойства для выполнения различных задач.
Примеры из жизни
Чтобы лучше понять принцип парадигмы, попробуем объяснить это с помощью нескольких простых примеров.
Возьмем нас с вами или если совсем обобщенно — человека. Он, в зависимости от различных обстоятельств, может вести себя по-разному. Например, женщина может быть и матерью, и дочерью, и сестрой, и другом одновременно и в разных ситуациях ее действия будут радикально отличаться.
А еще в организме человека есть разные органы и у каждого из них есть своя функция: сердце отвечает за кровоток, легкие за дыхание, мозг за когнитивную деятельность. То есть, у нас есть стандартная функция, работающая по-разному в зависимости от органа тела. Теперь перейдем конкретно к Java.
Полиморфизм в Java
Что мы должны понимать про принцип действия рассматриваемой концепции? Ну во-первых, все то, что содержит или обрабатывает значения различных типов, когда идет компиляция или выполняется программа — является полиморфным, например:
- любая переменная, которой присваивается значение другого типа;
- любой объект, обладающий свойствами, изменяющими тип данных присвоенного ему значения;
- любая функция, принимающая аргументы различных типов.
Рассмотрим небольшой пример по реализации полиморфизма на Java:
У суперкласса под названием Forms
есть метод shapearea()
и классы-потомки Triang
и Circ
. Каждый из них имеет свой способ подсчета площади. С помощью рассматриваемой парадигмы потомки пользуются методом родителя shapearea()
, чтобы найти формулу для расчета своей площади.
Вывод:
Типы полиморфизма
Два варианта реализации полиморфизма в Java:
- Overloading – перегрузка метода
- Overriding – переопределение метода
При перегрузке метода мы в одном классе создаем нескольких методов с одинаковым названием, но разным функционалом, например:
Вывод:
При переопределении название метода дочернего класса мы ставим такое же, как и уже объявленного метода родительского класса, например:
Выведет:
Статический и динамический полиморфизм
При статическом варианте развития событий метод можно вызывать при компиляции кода, происходит это при помощи рассмотренной нами ранее концепции — перегрузки методов. Говоря проще, у них будет одинаковое название, но разная функциональная начинка (тип возвращаемых данных, свойств и т. д.). В таком случае Java позволяет пользователю свободно определять функциям идентичные названия, если они будут отличны по типу и параметрам, например:
Вывод программы:
При динамическом полиморфизме вызвать переопределеный метод можно при выполнении программы. Скопировать метод родительского класса и обозначить его в дочернем можно с помощью ссылочной переменной родительского класса, при этом вызванный метод будет определяться по объекту, на который она ссылается. Такую операцию еще называют Upcasting, например:
Создадим один родительский класс Звери
и три подкласса: травоядные
, плотоядные
и всеядные
. В этом случае классы-потомки расширили родителя и переопределили его метод eat()
.
Вывод:
Преимущества и недостатки полиморфизма
- Предоставляет возможность повторного использования кода. Реализованные классы можно многократно использовать повторно. Кроме того, это экономит много времени разработчику, ведь при этом появляется возможность поменять что-то в программе, не трогая исходный код.
- Одна переменная может использоваться для хранения нескольких значений данных. Значение переменной в дочернем классе, наследуемой от родительского, может быть изменено без изменения родительской переменной.
- Легче отлаживать код, когда его не так много.
Помимо преимуществ, у рассматриваемой парадигмы есть еще и несколько недостатков:
- Полиморфизм не так просто реализовать на деле.
- Такой подход снижает читаемость кода.
- Может вызывать серьезные проблемы с производительностью в режиме реального времени.
Мы надеемся, что у вас сложилось правильное общее представление о полиморфизме в Java и о том, как его использовать. С более подробной информации по теме можно ознакомиться на официальном сайте Oracle.
Комментарии