Что такое полиморфизм в Java?
Полиморфизм в Java возникает, когда есть один или несколько классов или объектов, связанных друг с другом наследованием. Другими словами, это способность объекта принимать разные формы. Наследование позволяет пользователям наследовать атрибуты и методы, а полиморфизм использует эти методы для выполнения различных задач. Итак, цель - общение, но подход другой.
Например, у вас есть смартфон для общения. Вы можете выбрать любой режим связи. Это может быть звонок, текстовое сообщение, графическое сообщение, электронная почта и т. Д. Итак, общая цель - общение, но их подход отличается. Это называется полиморфизмом.
В этом руководстве вы узнаете:
- Что такое полиморфизм?
- Полиморфизм Java в ООП на примере
- Переопределение метода
- Разница между перегрузкой и переопределением
- Что такое динамический полиморфизм?
- Супер ключевое слово
- Разница между статическим и динамическим полиморфизмом
Нажмите здесь, если видео недоступно
Полиморфизм Java в ООП на примере
У нас есть один родительский класс «Счет» с функцией пополнения и снятия. Счет имеет 2 дочерних класса . Операция ввода и вывода средств одинакова для сберегательного и текущего счетов. Таким образом, унаследованные методы от класса Account будут работать.Изменение требований к программному обеспечению
В спецификации требований внесены изменения, что является обычным явлением в индустрии программного обеспечения. Вы должны добавить функциональность привилегированного банковского счета с возможностью овердрафта.
В качестве фона, овердрафт - это средство, с помощью которого вы можете снять сумму, превышающую доступный остаток на вашем счете.
Итак, метод вывода для привилегированных необходимо реализовать заново. Но вы не меняете проверенный фрагмент кода в Сберегательном и контрольном счетах. Это преимущество OOPS
Шаг 1) Таким образом, когда вызывается "снятый" метод сохранения учетной записи, выполняется метод из родительского класса учетной записи.
Шаг 2) Но когда вызывается метод «Вывод средств» для привилегированной учетной записи (возможность овердрафта), выполняется метод вывода, определенный в привилегированном классе. Это полиморфизм.
Переопределение метода
Переопределение метода - это переопределение метода суперкласса в подклассе.
Правила переопределения метода
- Сигнатура метода, то есть имя метода, список параметров и тип возвращаемого значения, должны точно совпадать.
- Переопределенный метод может расширить доступ, но не сузить его, т.е. если он является закрытым в базовом классе, дочерний класс может сделать его общедоступным, но не наоборот.
Пример
class Doctor{public void treatPatient(){// treatPatient method}class Surgeon extends Doctor{public void treatPatient(){// treatPatient method}}Class run{public static void main (String args[]){Doctor doctorObj = new Doctor()// treatPatient method in class Doctor will be executeddoctorObj.treatPatient();Surgeon surgeonObj = new Surgeon();// treatPatient method in class Surgeon will be executedsurgeonObj.treatPatient();}}
Разница между перегрузкой и переопределением
Перегрузка метода | Переопределение метода |
---|---|
Перегрузка метода находится в одном классе, где несколько методов имеют одно и то же имя, но разные сигнатуры. |
Переопределение метода - это когда один из методов суперкласса переопределяется в подклассе. В этом случае сигнатура метода остается прежней. |
Бывший: void sum (int a , int b);void sum (int a , int b, int c);void sum (float a, double b); |
Бывший: class X{public int sum(){// some code}}class Y extends X{public int sum(){//overridden method//signature is same}} |
Что такое динамический полиморфизм?
Динамический полиморфизм - это механизм, с помощью которого можно определить несколько методов с одинаковым именем и сигнатурой в суперклассе и подклассе. Вызов замещенного метода разрешается во время выполнения.
Пример динамического полиморфизма:
Ссылочная переменная суперкласса может ссылаться на объект подкласса
Doctor obj = new Surgeon();
Рассмотрим заявление
obj.treatPatient();
Здесь ссылочная переменная «obj» относится к родительскому классу, но объект, на который она указывает, относится к дочернему классу (как показано на диаграмме).
obj.treatPatient () выполнит метод TreatPatient () подкласса - Surgeon
Если для вызова метода используется ссылка на базовый класс, то метод, который нужно вызвать, определяется JVM, в зависимости от объекта, на который указывает ссылка.
Например, хотя obj является ссылкой на Doctor, он вызывает метод Surgeon, поскольку он указывает на объект Surgeon.
Это решается во время выполнения и, следовательно, называется динамическим или динамическим полиморфизмом.
Супер ключевое слово
Что, если метод TreatPatient в классе Surgeon хочет выполнить функции, определенные в классе Doctor, а затем выполнить свои собственные определенные функции?
В этом случае ключевое слово
super
может использоваться для доступа к методам родительского класса из дочернего класса.Метод TreatPatient в классе Surgeon можно записать как:
treatPatient(){super.treatPatient();//add code specific to Surgeon}
Ключевое слово super может использоваться для доступа к любому элементу данных или методам суперкласса в подклассе.Пример: -Чтобы изучить наследование, полиморфизм и ключевое слово super
Шаг 1) Скопируйте следующий код в редактор
public class Test{public static void main(String args[]){X x= new X();Y y = new Y();y.m2();//x.m1();//y.m1();//x = y;// parent pointing to object of child//x.m1() ;//y.a=10;}}class X{private int a;int b;public void m1(){System.out.println("This is method m1 of class X");}}class Y extends X{int c; // new instance variable of class Ypublic void m1(){// overriden methodSystem.out.println("This is method m1 of class Y");}public void m2(){super.m1();System.out.println("This is method m2 of class Y");}}
Шаг 2) Сохраните, скомпилируйте и запустите код. Наблюдайте за выходом.
Шаг 3) Раскомментирует строки №6–9. Сохраните, скомпилируйте и запустите код. Наблюдайте за выходом.
Шаг 4) Раскомментируйте строку №10. Сохраните и скомпилируйте код.
Шаг 5) Ошибка =? Это связано с тем, что подкласс не может получить доступ к закрытым членам суперкласса.
Разница между статическим и динамическим полиморфизмом
Статический полиморфизм | Динамический полиморфизм |
---|---|
Это связано с перегрузкой метода. | Это относится к переопределению метода. |
Ошибки, если таковые имеются, устраняются во время компиляции. Поскольку код не выполняется во время компиляции, отсюда и название статическое. Бывший: void sum (int a , int b);void sum (float a, double b);int sum (int a, int b); //compiler gives error. |
В случае, если ссылочная переменная вызывает переопределенный метод, вызываемый метод определяется объектом, на который указывает ссылочная переменная. Это можно определить только во время выполнения, когда код находится в процессе выполнения, отсюда и название динамическое. Бывший: //reference of parent pointing to child objectDoctor obj = new Surgeon();// method of child calledobj.treatPatient(); |