Polimorfismul în Java (static și dinamic)
⚡ Rezumat inteligent
Polimorfismul în Java permite unei singure interfețe să reprezinte mai multe forme, astfel încât un singur nume de metodă se comportă diferit între clasele înrudite. Este un pilon al designului orientat pe obiecte care promovează flexibilitatea, reutilizarea codului și extinderea curată a sistemelor bancare, medicale și de întreprindere vechi.
În ce este polimorfismul Java?
Polimorfismul în Java apare atunci când una sau mai multe clase sau obiecte sunt legate între ele prin moștenire. Este capacitatea unui obiect de a lua mai multe forme. Moștenirea permite utilizatorilor să moștenească atribute și metode, iar polimorfismul folosește aceste metode pentru a îndeplini diferite sarcini. Scopul este comunicarea, deși abordarea poate diferi.
De exemplu, un smartphone este folosit pentru comunicare. Modul de comunicare poate fi un apel, un mesaj text, un mesaj ilustrat sau un e-mail. Scopul este comun, adică comunicarea, dar abordarea este diferită. Acest comportament este esența... polimorfismulAcum vom învăța polimorfismul în Java cu exemplu de cod, diagrame și explicații pas cu pas.
Clic aici dacă videoclipul nu este accesibil
De ce se utilizează polimorfismul în Java?
Polimorfismul în Java este utilizat deoarece face codul flexibil, reutilizabil și mai ușor de întreținut. O singură variabilă de referință de tip părinte poate indica mai multe obiecte copil, astfel încât același apel se adaptează la subclasa furnizată. Acest model păstrează codul testat intact în timp ce noul comportament este adăugat prin subclase specializate, motiv pentru care framework-uri precum Spring și Jakarta EE depind de el.
Java Polimorfism în POO cu Exemplu
Luați în considerare o clasă părinte numită Cont cu funcții pentru depunere și retragere. Clasa Account are două clase fiice. Operațiunea de depunere și retragere este aceeași pentru conturile de economii și cele curente, deci metodele moștenite de la clasa Account vor funcționa.
Java Exemplu de polimorfism
Modificare a cerințelor software
Există o modificare a specificațiilor cerințelor, lucru obișnuit în industria software. Trebuie adăugată funcționalitatea pentru un Cont Bancar Privilegiat cu Facilitate de Descoperire de Cont. Descoperirea de cont este o facilitate prin care un client poate retrage o sumă mai mare decât soldul disponibil în cont. Metoda de retragere pentru contul privilegiat necesită o implementare nouă, în timp ce codul testat în conturile de economii și curent este lăsat nemodificat. Această izolare este avantajul... OOPS.
Pas 1) Când este apelată metoda de retragere pentru contul de economii, se execută metoda definită în clasa părinte Cont.
Pas 2) Când este apelată metoda de retragere pentru contul privilegiat (facilitatea de descoperit de cont), este executată metoda de retragere definită în clasa privilegiată. Această dispecerizare este Polimorfismul în POO-uri.
Anularea metodei în Java
Suprascrierea metodelor este procesul de redefinire a unei metode de superclasă în interiorul unei subclase. Subclasa păstrează aceleași condițiitract, dar furnizează o implementare nouă care este selectată la rularea programului.
Reguli pentru înlocuirea metodei
- Semnătura metodei, adică numele metodei, lista de parametri și tipul de returnare, trebuie să corespundă exact.
- Metoda suprascrisă poate lărgi accesibilitatea, dar nu o poate restrânge. Dacă metoda este privată în clasa de bază, clasa fiică o poate face publică, dar nu invers.
Exemplu
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(); } }
Diferența dintre supraîncărcarea metodei și suprascrierea metodei
Supraîncărcarea metodelor are loc în cadrul aceleiași clase cu același nume de metodă, dar cu semnături diferite. Suprascrierea metodelor are loc printr-o relație de clasă părinte-copil, unde subclasa redefinește o metodă declarată în superclasă.
| Supraîncărcarea metodelor face parte din aceeași clasă, adică mai multe metode au același nume, dar semnături diferite. | Suprascrierea metodei are loc atunci când una dintre metodele din superclasă este redefinită în subclasă. În acest caz, semnătura metodei rămâne aceeași. |
ex:
void sum (int a , int b); void sum (int a , int b, int c); void sum (float a, double b); |
ex:
class X{ public int sum(){ // some code } } class Y extends X{ public int sum(){ //overridden method //signature is same } } |
Ce este polimorfismul dinamic?
Polimorfismul dinamic în POO-uri este mecanismul prin care mai multe metode pot fi definite cu același nume și semnătură în superclasă și subclasă. Apelul către o metodă suprascrisă este rezolvat la momentul execuției prin intermediul legării dinamice în interiorul JVM-ului.
Exemplu de polimorfism dinamic
O variabilă de referință a superclasei poate face referire la un obiect al subclasei:
Doctor obj = new Surgeon();
Luați în considerare afirmația:
obj.treatPatient();
Aici variabila de referință obj este din clasa părinte, dar obiectul către care indică este din clasa fiu, așa cum se arată în diagrama polimorfismului.
Apelul obj.tratPatient() va executa metoda treatPatient() a subclasei Surgeon. Când o referință a clasei de bază este utilizată pentru a apela o metodă, metoda invocată este decisă de JVM pe baza obiectului real la care indică referința. Chiar dacă obj este o referință la Doctor, apelează metoda Surgeon, deoarece indică un obiect Surgeon. Decizia se ia în timpul execuției, motiv pentru care se numește Polimorfismul dinamic sau polimorfism în timpul execuției.
Diferența dintre polimorfismul static și cel dinamic
Polimorfismul static în Java este un tip de polimorfism care colectează informațiile pentru apelarea unei metode în momentul compilării, în timp ce Polimorfismul Dinamic este un tip de polimorfism care colectează informațiile pentru apelarea unei metode în timpul execuției.
| Se referă la supraîncărcarea metodelor. | Se referă la suprascrierea metodei. |
| Erorile, dacă există, sunt rezolvate la momentul compilării. Deoarece codul nu este executat în timpul compilării, numele este static.
ex: void sum (int a , int b); void sum (float a, double b); int sum (int a, int b); //compiler gives error. |
Când o variabilă de referință apelează o metodă suprascrisă, metoda care va fi invocată este determinată de obiectul la care indică variabila de referință. Acest lucru poate fi determinat doar la momentul execuției, când codul este în execuție, motiv pentru care numele este dinamic.
ex: //reference of parent pointing to child object Doctor obj = new Surgeon(); // method of child called obj.treatPatient(); |
Super cuvânt cheie în Java
Ce se întâmplă dacă metoda treatPatient din clasa Surgeon dorește să execute funcționalitatea definită în clasa Doctor și apoi să își îndeplinească propriul comportament specific? În acest caz, cuvântul cheie super poate fi folosit pentru a accesa metodele clasei părinte din clasa copil. Metoda treatPatient din clasa Chirurg ar putea fi scrisă astfel:
treatPatient(){
super.treatPatient();
//add code specific to Surgeon
}
Cuvântul cheie super poate fi folosit pentru a accesa orice membru de date sau metodă a superclasei din subclasa. În continuare, vom învăța despre cuvântul cheie super, Moştenireși polimorfismul în Java cu programe de exemplu.
Exemplu: Pentru a învăța moștenirea, polimorfismul și cuvântul cheie super
Pas 1) Copiați următorul cod într-un editor.
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"); } }
Pas 2) Salvați, compilați și rulați codul. Observați rezultatul.
Pas 3) Eliminați comentariile de la liniile 6 la 9. Salvați, compilați și rulați codul. Observați rezultatul.
Pas 4) Eliminați comentariul de la linia 10. Salvați și compilați codul.
Pas 5) Eroare = ? Aceasta deoarece subclasa nu poate accesa membrii privați ai superclasei.






