Полиморфизъм в 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 } } |
Какво е динамичен полиморфизъм?
Динамичният полиморфизъм в обектно-ориентираните програми (OOP) е механизмът, чрез който множество методи могат да бъдат дефинирани с едно и също име и сигнатура в суперкласа и подкласа. Извикването на презаписан метод се разрешава по време на изпълнение чрез динамично обвързване вътре в JVM.
Пример за динамичен полиморфизъм
Референтна променлива на суперкласа може да се отнася до обект на подклас:
Doctor obj = new Surgeon();
Обмислете твърдението:
obj.treatPatient();
Тук референтната променлива OBJ е от родителския клас, но обектът, към който сочи, е от дъщерния клас, както е показано на диаграмата на полиморфизма.
Повикването обект.treatPatient() ще изпълни метода treatPatient() на подкласа Surgeon. Когато се използва препратка към базов клас за извикване на метод, методът, който се извиква, се определя от JVM въз основа на действителния обект, към който сочи препратката. Въпреки че OBJ е препратка към 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) Грешка = ? Това е така, защото подкласът няма достъп до частните членове на суперкласа.





