Полиморфизм в Java (Статический и динамический)
⚡ Умное резюме
Полиморфизм в Java Это позволяет одному интерфейсу представлять множество форм, поэтому одно и то же имя метода будет вести себя по-разному в связанных классах. Это один из столпов объектно-ориентированного проектирования, способствующий гибкости, повторному использованию кода и чистому расширению устаревших банковских, медицинских и корпоративных систем.

Что такое полиморфизм Java?
Полиморфизм в Java Наследование возникает, когда один или несколько классов или объектов связаны друг с другом посредством наследования. Это способность объекта принимать множество форм. Наследование позволяет пользователям наследовать атрибуты и методы, а полиморфизм использует эти методы для выполнения различных задач. Цель — коммуникация, хотя подход может различаться.
Например, смартфон используется для общения. Способом общения может быть звонок, текстовое сообщение, сообщение с изображением или электронная почта. Цель общая — общение, но подход различен. Такое поведение и составляет суть. ПолиморфизмТеперь мы изучим полиморфизм в Java с примерами кода, диаграммами и пошаговыми объяснениями.
Нажмите здесь если видео недоступно
Зачем использовать полиморфизм в Java?
Полиморфизм в Java Этот подход используется, потому что он делает код гибким, многократно используемым и упрощает его сопровождение. Одна переменная-ссылка родительского типа может указывать на несколько дочерних объектов, поэтому один и тот же вызов адаптируется к любому предоставленному подклассу. Этот шаблон позволяет тестируемому коду оставаться неизменным, в то время как новое поведение добавляется через специализированные подклассы, именно поэтому такие фреймворки, как Spring и Jakarta EE, используют его.
Java Полиморфизм в ООП на примере
Рассмотрим один родительский класс с именем Аккаунт с функциями для внесения и снятия средств. Класс Account имеет два дочерних класса. Операции внесения и снятия средств одинаковы для сберегательных и расчетных счетов, поэтому унаследованные методы от класса Account будут работать.
Java Пример полиморфизма
Изменение требований к программному обеспечению
Произошло изменение в спецификации требований, что является распространенной практикой в индустрии программного обеспечения. Необходимо добавить функциональность для привилегированного банковского счета с возможностью овердрафта. Овердрафт — это услуга, позволяющая клиенту снять сумму, превышающую доступный баланс на счете. Метод снятия средств для привилегированного счета требует новой реализации, в то время как протестированный код для сберегательных и текущих счетов остается без изменений. Такая изоляция является преимуществом. OOPS.
Шаг 1) При вызове метода вывода средств для сберегательного счета выполняется метод, определенный в родительском классе Account.
Шаг 2) При вызове метода вывода средств для привилегированного счета (овердрафта) выполняется метод вывода средств, определенный в привилегированном классе. Эта диспетчеризация Полиморфизм в ООП.
Переопределение метода в Java
Переопределение метода — это процесс переопределения метода суперкласса внутри подкласса. Подкласс сохраняет те же самые свойства.tract, но предоставляет новую реализацию, которая выбирается при запуске программы.
Правила переопределения метода
- Сигнатура метода, то есть имя метода, список параметров и тип возвращаемого значения, должна точно совпадать.
- Переопределенный метод может расширить доступность, но не сузить её. Если метод является приватным в базовом классе, дочерний класс может сделать его публичным, но не наоборот.
Пример
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 executed doctorObj.treatPatient(); Surgeon surgeonObj = new Surgeon(); // treatPatient method in class Surgeon will be executed surgeonObj.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 } } |
Что такое динамический полиморфизм?
Динамический полиморфизм в объектно-ориентированном программировании — это механизм, позволяющий определять несколько методов с одинаковым именем и сигнатурой как в суперклассе, так и в подклассе. Вызов переопределенного метода разрешается во время выполнения посредством динамического связывания внутри JVM.
Пример динамического полиморфизма
Переменная-ссылка суперкласса может ссылаться на объект подкласса:
Doctor obj = new Surgeon();
Рассмотрим следующее утверждение:
obj.treatPatient();
Здесь используется эталонная переменная. об Объект принадлежит родительскому классу, но объект, на который он указывает, принадлежит дочернему классу, как показано на диаграмме полиморфизма.
Вызов obj.treatPatient() Выполнится метод treatPatient() подкласса Surgeon. Когда для вызова метода используется ссылка на базовый класс, JVM определяет, какой именно метод будет вызван, исходя из фактического объекта, на который указывает ссылка. Даже несмотря на это об Это ссылка на объект Doctor, она вызывает метод объекта Surgeon, поскольку указывает на объект Surgeon. Решение принимается во время выполнения программы, поэтому оно и называется так. Динамический полиморфизм или полиморфизм во время выполнения.
Разница между статическим и динамическим полиморфизмом
Статический полиморфизм в Java Динамический полиморфизм — это тип полиморфизма, при котором информация о вызове метода собирается во время компиляции, тогда как динамический полиморфизм — это тип полиморфизма, при котором информация о вызове метода собирается во время выполнения.
| Это связано с перегрузкой методов. | Это связано с переопределением методов. |
| Если таковые имеются, ошибки устраняются на этапе компиляции. Поскольку код не выполняется во время компиляции, имя является статическим.
например: 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 object Doctor obj = new Surgeon(); // method of child called obj.treatPatient(); |
Супер ключевое слово в Java
Что если метод treatPatient в классе Surgeon хочет выполнить функциональность, определенную в классе Doctor, а затем продемонстрировать собственное специфическое поведение? В этом случае используется ключевое слово super может использоваться для доступа к методам родительского класса из дочернего класса. Метод treatPatient в классе Surgeon может быть записан как:
treatPatient(){
super.treatPatient();
//add code specific to Surgeon
}
Ключевое слово super можно использовать для доступа к любому члену данных или методу суперкласса внутри подкласса. Далее мы узнаем о ключевом слове super. наследованиеи полиморфизм в Java с примерами программ.
Пример: Изучение наследования, полиморфизма и ключевого слова 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 Y public void m1(){ // overridden method System.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) Ошибка = ? Это происходит потому, что подкласс не может получить доступ к закрытым членам суперкласса.





