что такое полиморфизм java
24. Java – Полиморфизм
Полиморфизм – способность объекта принимать множество различных форм. Наиболее распространенное использование полиморфизма в ООП происходит, когда ссылка на родительский класс используется для ссылки на объект дочернего класса. Постараемся разобраться с понятием полиморфизма в Java простыми словами, так сказать для чайников.
Любой объект в Java, который может пройти более одного теста IS-A считается полиморфным. В Java все объекты полиморфны, так как любой объект пройдёт тест IS-A для своего собственного типа и для класса Object.
Важно знать, что получить доступ к объекту можно только через ссылочную переменную. Ссылочная переменная может быть только одного типа. Будучи объявленной, тип ссылочной переменной изменить нельзя.
Ссылочную переменную можно переназначить к другим объектам, которые не объявлены как final. Тип ссылочной переменной определяет методы, которые она может вызвать на объекте.
Ссылочная переменная может обратиться к любому объекту своего объявленного типа или любому подтипу своего объявленного типа. Ссылочную переменную можно объявить как класс или тип интерфейса.
Содержание
Пример 1
Рассмотрим пример наследования полиморфизм в Java.
Теперь класс Deer (Олень) считается полиморфным, так как он имеет множественное наследование. Следующие утверждения верны для примера выше:
Когда мы применяем факты ссылочной переменной к ссылке на объект Deer (Олень), следующие утверждения верны:
Пример 2
Все переменные (d, a, v, o) ссылаются к тому же объекту Deer (Олень).
Виртуальные методы
В этом разделе рассмотрим, как поведение переопределённых методов в Java позволяет воспользоваться преимуществами полиморфизма при оформлении классов.
Мы уже рассмотрели переопредение методов, где дочерний класс может переопределить метод своего «родителя». Переопределённый метод же скрыт в родительском классе и не вызван, пока дочерний класс не использует ключевое слово super во время переопределения метода.
Пример
Теперь предположим, что мы наследуем класс Employee следующим образом:
Теперь, внимательно изучите программу и попытайтесь предугадать её вывод:
После запуска программы будет выдан такой результат:
Итак, мы создали два объекта Salary. Один использует ссылку Salary, то есть s, а другой использует ссылку Employee, то есть e.
Во время вызова s.mailCheck(), компилятор видит mailCheck() в классе Salary во время компиляции, а JVM вызывает mailCheck() в классе Salary при запуске программы.
mailCheck() в e совсем другое, потому что e является ссылкой Employee. Когда компилятор видит e.mailCheck(), компилятор видит метод mailCheck() в классе Employee.
Во время компиляции был использован mailCheck() в Employee, чтобы проверить это утверждение. Однако во время запуска программы JVM вызывает mailCheck() в классе Salary.
Это поведение называется вызовом виртуальных методов, а эти методы называются виртуальными. Переопределённый метод вызывается во время запуска программы вне зависимости от того, какой тип данных был использован в исходном коде во время компиляции.
Полиморфизм в Java
Полиморфизм является одним из основных понятий парадигмы УПС. Значение полиморфизма заключается в том, что он встречается в нескольких различных формах. 1. Что
Полиморфизм является одним из основных понятий парадигмы УПС. Значение полиморфизма заключается в том, что он встречается в нескольких различных формах.
1. Что такое полиморфизм?
Полиморфизм-это способность выполнять разные действия в разных сценариях. Иногда полиморфизм основан на входных параметрах функции. Полиморфизм может присутствовать и в случае наследования. Функции ведут себя по-разному в зависимости от фактической реализации.
2. Полиморфизм Пример Из Реальной Жизни
3. Полиморфизм в Java
Java поддерживает полиморфизм, и его можно разделить на два типа.
4. Полиморфизм времени компиляции
Когда компилятор может определить фактическую функцию, это называется полиморфизмом во время компиляции. Существует два типа полиморфизма во время компиляции.
4.1) Перегрузка метода
Вот простой пример перегрузки методов в Java.
Если вы ищете перегрузку методов в классах JDK, вы найдете их много в строковых и примитивных классах-оболочках. Например, методы String valueOf (), методы целочисленного синтаксического анализа() и т. Д.
Перегрузка метода в строковом классе Java
4.2) Перегрузка Оператора
Java не позволяет нам переопределять операторы. Однако оператор сложения (+) перегружен для строковых объектов. Когда оператор сложения используется со строковыми объектами, он объединяет их и возвращает новый строковый объект.
5. Полиморфизм во время выполнения
Вот пример полиморфизма времени выполнения в Java.
Метод delivery() переопределен в классах Разносчика пиццы и Почтальона. Компилятор не может определить, вернет ли get Delivery Boy() Разносчика пиццы или Почтальона. Таким образом, разрешение метода происходит во время выполнения.
Если вы запустите программу, вывод будет варьироваться между “Доставка писем” и “Доставка пиццы”.
6. Заключение
Философия Java всегда заключалась в том, чтобы использовать лучшие возможности объектно-ориентированного программирования. Вот почему функция перегрузки операторов была удалена в Java, потому что это создает больше путаницы.
Что такое полиморфизм java
Основная цель использования данной концепции — это уменьшение сложности компонентов программы за счет скрытия от программиста, использующего эти компоненты, ненужных ему подробностей. Это позволяет реализовать более сложную логику поверх предоставленной абстракции, не вдаваясь в подробности ее реализации.
Приготовление кофе с помощью кофемашины является хорошим примером абстракции. Все, что нам надо знать, что бы ей пользоваться: как налить воды, засыпать кофейные зерна, включить и выбрать вид кофе, который хотим получить. А, как машина будет варить кофе — нам знать не нужно.
В данном примере кофемашина представляет собой абстракцию, которая от нас скрывает все подробности варки кофе. Нам лишь остается просто взаимодействовать с простым интерфейсом, который не требует от нас каких-либо знаний о внутренней реализации машины.
Этот же подход можно использовать и в объектно-ориентированных языках программирования, таких как Java.
Полиморфизм предоставляет возможность единообразно обрабатывать объекты с различной реализацией при условии наличия у них общего интерфейса или класса. По-простому: способность вызывать нужные методы у объектов, имеющие разные типы (но находящиеся в одной иерархии). При этом происходит автоматический выбор нужного метода в зависимости от типа объекта.
Рассмотрим примеры полиморфизма в Java: переопределение и перегрузка методов.
В случае с переопределением метода, дочерний класс, используя концепцию полиморфизма, может изменить (переопределить) поведение метода родительского класса. Это позволяет программисту по разному использовать один и тот же метод, определяя поведение из контекста вызова (вызывается метод из класса предка или класса наследника).
В случае же с перегрузкой, метод может проявлять различное поведение в зависимости от того, какие аргументы он принимает. В данном случае контекст вызова определяется набором параметров метода.
Краткое руководство по полиморфизму в Java
Слово «полиморфизм» буквально означает «состояние множества форм» или «способность принимать разные формы». Применительно к объектно-ориентированным языкам программирования, таким как Java, он описывает способность языка обрабатывать объекты различных типов и классов через единый унифицированный интерфейс.
Полиморфизм в Java имеет два типа: полиморфизм времени компиляции (статическое связывание) и полиморфизм времени выполнения (динамическое связывание). Перегрузка метода является примером статического полиморфизма, а переопределение метода — примером динамического полиморфизма.
Важным примером полиморфизма является то, как родительский класс ссылается на объект дочернего класса. Фактически, любой объект, который удовлетворяет более чем одной взаимосвязи IS-A, является полиморфным по своей природе.
Например, давайте рассмотрим класс Animal Cat Animal Итак, любой кот — это животное. Здесь Cat Animal
Примечание. Также допустимо говорить, что каждый объект в Java является полиморфным по своей природе, поскольку каждый из них проходит тест IS-A для себя, а также для класса Object
Статический полиморфизм:
В Java статический полиморфизм достигается за счет перегрузки методов. Перегрузка метода означает, что в классе есть несколько методов, имеющих одинаковое имя, но разные типы / порядок / количество параметров.
В приведенном выше примере есть четыре версии методов add Первый метод принимает два параметра, а второй — три. Для третьего и четвертого способов происходит изменение порядка параметров. Компилятор просматривает сигнатуру метода и решает, какой метод вызвать для конкретного вызова метода во время компиляции.
Полиморфизм на Яве
Откройте для себя полиморфизм на Java.
Полиморфизм на Яве
1. Обзор
Все языки объектно-ориентированного программирования (OOP) должны проявлять четыре основные характеристики: абстракция, инкапсуляция, наследование и полиморфизм.
2. Статический полиморфизм
Например, наша ТекстФиле класс в приложении файлового менеджера может иметь три метода с одинаковой подписью читать () метод:
Во время компиляции кода компилятор проверяет, что все вызовы читать метод соответствует по крайней мере одному из трех методов, определенных выше.
3. Динамический полиморфизм
В гипотетическом приложении файлового менеджера давайте определим родительский класс для всех файлов, называемых ОбщиеФиле :
Мы также можем реализовать ImageFile класс, который расширяет ОбщиеФиле но переопределяет getFileInfo() метод и приложения более подробную информацию:
Вышеупомяпная конструкция аналогична методу переопределения. Мы можем подтвердить это, ссылаясь на getFileInfo() метод по:
Как и ожидалось, genericFile.getFileInfo () запускает getFileInfo() метод ImageFile класс, как поменьше на выходе ниже:
4. Другие полиморфные характеристики на Java
В дополнение к этим двум основным типам полиморфизма в Java, есть и другие характеристики в языке программирования Java, которые демонстрируют полиморфизм. Давайте обсудим некоторые из этих характеристик.
4.1. Принуждение
Полиморфное принуждение имеет дело с неявной конверсией типа, выполненной компилятором для предотвращения ошибок типа. Типичный пример виден в интегративной и струнной конкатеации:
4.2. Перегрузка оператора
Перегрузка оператора или метода относится к полиморфной характеристике одного и того же символа или оператора, имеющих различные значения (формы) в зависимости от контекста.
Например, символ плюс может быть использован как для математического добавления, так и для Струнные конкатенация. В любом случае интерпретацию символа определяет только контекст (т.е. типы аргументов).
4.3. Полиморфные параметры
Параметрический полиморфизм позволяет ассоциировать название параметра или метода в классе с различными типами. У нас есть типичный пример ниже, где мы определяем содержание в качестве Струнные а затем в качестве Интегер :
Важно также отметить, что объявление полиморфных параметров может привести к проблеме, известной как переменная скрытие где локавная декларация параметра всегда перекрывает глобальную декларацию другого параметра с тем же именем.
Для решения этой проблемы часто рекомендуется использовать глобальные ссылки, такие как этот ключевое слово, чтобы указать на глобальные переменные в локальном контексте.
4.4. Полиморфные подтипы
Полиморфный подтип удобно позволяет нам назначить несколько подтипов к типу и ожидать, что все вызовы на типе, чтобы вызвать доступные определения в подтипе.
Например, если у нас есть коллекция ОбщиеФиле s и мы ссылаемся на getInfo () метод на каждом из них, мы можем ожидать, что выход будет отличаться в зависимости от подтипа, из которого каждый элемент в коллекции был получен:
Чтобы решить проблему не в состоянии вызвать подтип-специфических методов при upcasting к супертипу, мы можем сделать вниз наследования от супертипа к подтипу. Это делается:
5. Проблемы с полиморфизмом
Давайте посмотрим на некоторые двусмысленности в полиморфизме, которые потенциально могут привести к ошибкам времени выполнения, если не должным образом проверены.
5.1. Идентификация типа во время downcasting
Напомним, что ранее мы потеряли доступ к некоторым подтип-специфическим методам после выполнения upcast. Хотя мы смогли решить это с downcast, это не гарантирует фактической проверки типа.
Например, если мы выполняем upcast и последующее вниз:
Следовательно, если мы попытаемся вызвать getHeight() метод на imageFile класса, мы получаем ClassCastException как ОбщиеФиле не определяет getHeight() метод:
Чтобы решить эту проблему, JVM выполняет проверку типа Run-Time (RTTI). Мы также можем попытаться точно идентифицировать тип с помощью instanceof ключевое слово так же, как это:
Вышесказанного помогает избежать ClassCastException исключение во время выполнения. Другой вариант, который может быть использован, это упаковка литых в попробуйте и поймать блокировать и ловить ClassCastException.
Следует отметить, что Проверка RTTI стоит дорого из-за времени и ресурсов, необходимых для эффективной проверки правильности типа. Кроме того, частое использование instanceof ключевое слово почти всегда подразумевает плохой дизайн.
5.2. Хрупкая проблема базового класса
Рассмотрим декларацию суперкласса под названием ОбщиеФиле и его подкласс ТекстФиле :
Когда мы изменяем ОбщиеФиле класс:
Мы отмечаем, что вышеупомяпная модификация ТекстФиле в бесконечной рекурсии в writeContent () метод, который в конечном итоге приводит к переполнению стека.
Для решения хрупкой проблемы базового класса мы можем использовать окончательный ключевое слово, чтобы предотвратить подклассы от переопределения writeContent () метод. Правильная документация также может помочь. И последнее, но не менее то, что состав, как правило, следует предпочтительным, чем наследство.
6. Заключение
В этой статье мы обсудили основополагающие концепции полиморфизма, сосредоточив внимание как на преимуществах, так и на недостатках.