Что такое полиморфизм в java
Полиморфизм в Java
Полиморфизм в Java – это способность объекта принимать различные формы. Наиболее распространенное использование полиморфизма в ООП происходит, когда ссылка на родительский класс используется для ссылки на объект дочернего класса.
Любой объект Java, который может пройти более одного теста IS-A, считается полиморфным. В Java все объекты являются полиморфными, поскольку любой объект будет проходить тест IS-A для своего собственного типа и для класса Object.
Важно знать, что единственный возможный способ получить доступ к объекту – через ссылочную переменную. Ссылочная переменная может быть только одного типа. После объявления тип ссылочной переменной не может быть изменен.
Ссылочная переменная может быть переназначена другим объектам при условии, что она не объявлена как финальная. Тип ссылочной переменной будет определять методы, которые она может вызывать для объекта.
Ссылочная переменная может ссылаться на любой объект своего объявленного типа или любой подтип своего объявленного типа. Может быть объявлена как класс или тип интерфейса.
Пример 1
Давайте посмотрим на пример.
Теперь класс Deer считается полиморфным, поскольку он имеет несколько наследований. Следующее верно для приведенных выше примеров –
Когда мы применяем факты ссылочной переменной к ссылке на объект Deer, следующие объявления являются допустимыми:
Пример 2
Все ссылочные переменные d, a, v, o ссылаются на один и тот же объект Deer в куче.
Еще примеры полиморфизма
Например, у нас есть класс Animal, у которого есть метод sound(). Поскольку это универсальный класс, поэтому мы не можем дать ему такую реализацию, как: Мяу, Гав, Хрю-хрю и т. д. Мы должны были дать универсальное сообщение.
Теперь допустим, что мы два подкласса класса Animal: Horse и Cat, который расширяет(см. наследование) класс Animal. Мы можем предоставить реализацию тому же методу, например так:
Как вы можете видеть, хотя у нас было общее действие для всех подклассов sound(), но были разные способы сделать одно и то же действие. Это прекрасный пример полиморфизма(функция, которая позволяет нам выполнять одно действие разными способами).
Не имеет никакого смысла просто вызывать универсальный метод sound(), поскольку у каждого животного свой звук. Таким образом, мы можем сказать, что действие, которое выполняет этот метод, основано на типе объекта.
Другими словами, полиморфизм позволяет вам определять один интерфейс и иметь несколько реализаций. Как мы видели в приведенном выше примере, мы определили метод sound() и имеем несколько его реализаций в разных подклассах-2. Какой метод sound() будет вызван, определяется во время выполнения, поэтому приведенный выше пример является примером полиморфизма во время выполнения.
Пример
Пример времени выполнения: Animal.java
Пример времени компиляции
Перегрузка метода, с другой стороны, является примером полиморфизма во время компиляции.
Здесь метод demo() перегружен 3 раза: первый метод имеет 1 параметр int, второй метод имеет 2 параметра int, а третий – двойной параметр. Какой метод должен быть вызван, определяется аргументами, которые мы передаем при вызове методов. Это происходит во время выполнения время компиляции, поэтому этот тип полиморфизма известен как полиморфизм времени компиляции.
Средняя оценка / 5. Количество голосов:
Или поделись статьей
Видим, что вы не нашли ответ на свой вопрос.
Полиморфизм в Java – подробно с примерами
Полиморфизм в Java – это концепция ООП, в которой одно имя может иметь много форм.
Например, у вас есть смартфон для общения. Режим связи, который вы выбираете, может быть любым. Это может быть звонок, текстовое сообщение, графическое сообщение, почта и т. д. Итак, общая цель – общение, но у них другой подход. Это называется полиморфизмом.
Объяснение полиморфизма
У нас есть один родительский класс, «Счет» с функцией пополнения и снятия. Учетная запись имеет 2 дочерних класса.
Операции ввода и вывода одинаковы для Сберегательного и Чекового счетов. Таким образом, унаследованные методы из класса Account будут работать.
Изменение требований к программному обеспечению
В спецификации требований произошли изменения, что так часто встречается в индустрии программного обеспечения. Вы должны добавить функциональность привилегированного банковского счета с помощью овердрафта.
Овердрафт – это средство, с помощью которого вы можете снять сумму, превышающую доступный остаток на вашем счете.
Итак, метод вывода для привилегированных нужд должен быть реализован заново. Но вы не меняете проверенный кусок кода в Сберегательном и Чековом счете. Это преимущество ООП.
Шаг 1) Такой, что при вызове «изъятого» метода для сохранения учетной записи выполняется метод из класса родительской учетной записи.
Шаг 2) Но когда вызывается метод «Снять» для привилегированной учетной записи (средство овердрафта), выполняется метод вывода, определенный в привилегированном классе. Это полиморфизм.
Переопределение метода
Переопределение метода – переопределение метода суперкласса в подклассе.
Правила для переопределения метода
Разница между перегрузкой и переопределением
Перегрузка метода находится в одном классе, где несколько методов имеют одно и то же имя, но разные подписи.
Переопределение метода – это когда один из методов суперкласса переопределяется в подклассе. В этом случае подпись метода остается неизменной.
Что такое динамический полиморфизм?
Динамический полиморфизм – это механизм, с помощью которого можно определить несколько методов с одинаковыми именами и сигнатурами в суперклассе и подклассе. Вызов переопределенного метода разрешается во время выполнения.
Пример динамического полиморфизма
Ссылочная переменная суперкласса может ссылаться на объект подкласса.
Здесь ссылочная переменная “obj” относится к родительскому классу, но объект, на который она указывает, принадлежит к дочернему классу (как показано на диаграмме).
obj.treatPatient() выполнит метод TreatPatient() для подкласса – Surgeon
Если для вызова метода используется ссылка на базовый класс, то вызываемый метод определяется JVM в зависимости от объекта, на который указывает ссылка
Например, хотя obj является ссылкой на Doctor, он вызывает метод Surgeon, так как он указывает на объект Surgeon.
Это определяется во время выполнения и, следовательно, называется динамическим или динамическим полиморфизмом.
super ключевое слово
Что, если метод TreatPatient в классе Surgeon хочет выполнить функциональность, определенную в классе Doctor, а затем выполнить свою собственную специфическую функциональность? В этом случае ключевое слово super может использоваться для доступа к методам родительского класса из дочернего класса. Метод TreatPatient в классе Surgeon может быть записан как:
Ключевое слово super может использоваться для доступа к любому члену данных или методам суперкласса в подклассе.
Шаг 1) Скопируйте следующий код в редактор
Шаг 2) Сохранение, компиляция Запустите код. Соблюдайте вывод.
Шаг 3) Раскомментируйте строки № 6-9. Сохранить, скомпилировать Запустите код. Соблюдайте вывод.
Шаг 4) Раскомментируйте строку # 10. Сохраните и Скомпилируйте код.
Шаг 5) Ошибка =? Это потому, что подкласс не может получить доступ к закрытым членам суперкласса.
Разница между статическим и динамическим полиморфизмом
Ошибки, если таковые имеются, устраняются во время компиляции. Поскольку код не выполняется во время компиляции, отсюда и название static.
В случае, если ссылочная переменная вызывает переопределенный метод, вызываемый метод определяется объектом, на который указывает ваша ссылочная переменная. Это может быть определено только во время выполнения, когда код находится в процессе выполнения, поэтому имя динамическое.
Java Challengers #3: Полиморфизм и наследование
Мы продолжаем перевод серии статей с задачками по Java. Прошлый пост про строки вызвал на удивление бурную дискуссию. Надеемся, что мимо этой статьи вы тоже не пройдете мимо. И да — мы приглашаем теперь на юбилейный десятый поток нашего курса «Разработчик Java».
Согласно легендарному Венкату Субраманиам (Venkat Subramaniam) полиморфизм является самым важным понятием в объектно — ориентированном программировании. Полиморфизм — или способность объекта выполнять специализированные действия на основе его типа — это то, что делает Java — код гибким. Шаблоны проектирования, такие как Команда (Command), Наблюдатель (Observer), Декоратор (Decorator), Стратегия (Strategy), и многие другие, созданные бандой четырех (Gang Of Four), все используют ту или иную форму полиморфизма. Освоение этой концепции значительно улучшит вашу способность продумывать программные решения.
Вы можете взять исходный код для этой статьи и поэксперементировать здесь: https://github.com/rafadelnero/javaworld-challengers
Интерфейсы и наследование в полиморфизме
В этой статье мы сфокусируемся на связи между полиморфизмом и наследованием. Главное иметь в виду, что полиморфизм требует наследования или реализации интерфейса. Вы можете увидеть это на примере ниже с Дюком ( Duke ) и Джагги ( Juggy ):
Вывод этого кода будет таким:
Перегрузка (overloading) метода — это полиморфизм? Многие программисты путают отношение полиморфизма с переопределением методов (overriding) и перегрузкой методов (overloading). Фактически, только переопределение метода — это истинный полиморфизм. Перегрузка использует то же имя метода, но разные параметры. Полиморфизм — это широкий термин, поэтому всегда будут дискуссии на эту тему.
Какова цель полиморфизма
Большим преимуществом и целью использования полиморфизма является уменьшение связанности клиентского класса с реализацией. Вместо того чтобы хардкодить, клиентский класс получает реализацию зависимости для выполнения необходимого действия. Таким образом, клиентский класс знает минимум для выполнения своих действий, что является примером слабого связывания.
Чтобы лучше понять цель полиморфизма, взгляните на SweetCreator :
Аннотация @Override обязывает программиста использовать такую же сигнатуру метода, которая должна быть переопределена. Если метод не переопределен, будет ошибка компиляции.
Ковариантные возвращаемые типы при переопределении метода
Можно изменить тип возвращаемого значения переопределенного метода если это ковариантный тип. Ковариантный тип в основном является подклассом возвращаемого значения.
Полиморфизм в базовых классах Java
Рассмотрим пример кода, использующий Java Collections API без полиморфизма:
Отвратительный код, не так ли? Представьте себе, что вам нужно его сопровождать! Теперь рассмотрим тот же пример с полиморфизмом:
Вызов конкретных методов для полиморфного метода
Можно вызвать конкретные методы при полиморфном вызове метода, это происходит за счет гибкости. Вот пример:
Техника, которую мы используем здесь — это приведение типов (casting) или сознательное изменение типа объекта во время выполнения.
Обратите внимание, что вызов определенного метода возможен только при приведении более общего типа к более специфичному типу. Хорошей аналогией было бы сказать явно компилятору: «Эй, я знаю, что я здесь делаю, поэтому я собираюсь привести объект к определенному типу и буду использовать этот метод.»
Ключевое слово instanceof
Ключевое слово super
Решите задачку по полиморфизму
Давайте проверим, что вы узнали о полиморфизме и наследовании.
В этой задачке Вам дается несколько методов от Matt Groening’s The Simpsons, от вавам требуется разгадать, какой будет вывод для каждого класса. Для начала внимательно проанализируйте следующий код:
Как вы думаете? Каким будет результат? Не используйте IDE, чтобы выяснить это! Цель в том, чтобы улучшить ваши навыки анализа кода, поэтому постарайтесь решить самостоятельно.
Выберите ваш ответ (правильный ответ вы сможете найти в конце статьи).
A)
I love Sax!
D’oh
Simpson!
D’oh
B)
Sax 🙂
Eat my shorts!
I love Sax!
D’oh
Knock Homer down
C)
Sax 🙂
D’oh
Simpson!
Knock Homer down
D)
I love Sax!
Eat my shorts!
Simpson!
D’oh
Knock Homer down
Что случилось? Понимание полиморфизма
Для следующего вызова метода:
вывод будет «I love Sax!». Это потому, что мы передаём строку в метод и у класса Lisa есть такой метод.
Для следующего вызова:
Теперь смотрите, это немного сложнее:
В этом случае на выходе будет «Simpson!».
Распространенные ошибки с полиморфизмом
Распространенная ошибка думать, что можно вызвать конкретный метод без использования приведения типа.
Другой ошибкой является неуверенность в том, какой метод будет вызван при полиморфном создании экземпляра класса. Помните, что вызываемый метод является методом созданного экземпляра.
Также помните, что переопределение метода не является перегрузкой метода.
Невозможно переопределить метод, если параметры отличаются. Можно изменить тип возвращаемого значения переопределенного метода, если возвращаемый тип является подклассом.
Что нужно помнить о полиморфизме
Созданный экземпляр определяет, какой метод будет вызван при использовании полиморфизма.
Аннотация @Override обязывает программиста использовать переопределенный метод; в противном случае возникнет ошибка компилятора.
Полиморфизм может использоваться с обычными классами, абстрактными классами и интерфейсами.
Большинство шаблонов проектирования зависят от той или иной формы полиморфизма.
Единственный способ вызвать нужный ваш метод в полиморфном подклассе — это использовать приведение типов.
Можно создать мощную структуру кода, используя полиморфизм.
Экспериментируйте. Через это, вы сможете овладеть этой мощной концепцией!
Ответ
Как всегда приветствую ваши комментарии и вопросы. И ждём у Виталия на открытом уроке.
Что такое полиморфизм в Java
Что такое полиморфизм
Определение полиморфизма звучит устрашающе 🙂
Так о каких формах идет речь? Давайте сначала приведем примеры и покажем, как на практике проявляется полиморфизм, а потом снова вернемся к его определению.
Как проявляется полиморфизм
Дело в том, что если бы в Java не было принципа полиморфизма, компилятор бы интерпретировал это как ошибку:
Как видите, методы на картинке отличаются значениями, которые они принимают:
Однако, поскольку в Java используется принцип полиморфизма, компилятор не будет воспринимать это как ошибку, потому что такие методы будут считаться разными:
Теперь Вы можете понять, почему часто этот принцип описывают фразой:
Это предполагает, что мы можем заполнить одно название (один интерфейс), по которому мы сможем обращаться к нескольким методам.
Перегрузка методов
Переопределение методов родителя
Когда мы наследуем какой-либо класс, мы наследуем и все его методы. Но если нам хочется изменить какой-либо из методов, который мы наследуем, мы можем всего-навсего переопределить его. Мы не обязаны, например, создавать отдельный метод с похожим названием для наших нужд, а унаследованный метод будет «мертвым грузом» лежать в нашем классе.
Именно то, что мы можем создать в классе-наследнике класс с таким же названием, как и класс, который мы унаследовали от родителя, и называется переопределением.
Пример
Представим, что у нас есть такая структура:
Поэтому, в классах-наследниках мы переопределяем метод voice(), чтобы мы в консоли получали «Мяу», «Гав» и «Муу».
Так что же такое полиморфизм
Давайте снова посмотрим на определение, которое мы давали в начале статьи:
Выглядит понятнее, правда? Мы показали, как можно:
Надеемся, наша статья была Вам полезна. Записаться на наши курсы по Java можно у нас на сайте.
Полиморфизм в 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, потому что это создает больше путаницы.