Какво е полиморфизъм в 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 в класа по хирург може да бъде записан като:
treatPatient(){super.treatPatient();//add code specific to Surgeon}
Ключовата дума 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) Грешка =? Това е така, защото подкласът няма достъп до частни членове на супер класа.
Разлика между статичен и динамичен полиморфизъм
Статичен полиморфизъм | Динамичен полиморфизъм |
---|---|
Той се отнася до претоварване на метода. | Той се отнася до отмяна на метода. |
Грешките, ако има такива, се разрешават по време на компилиране. Тъй като кодът не се изпълнява по време на компилация, оттук и името static. Пример: 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(); |