java override method overriding
Acest tutorial explică cum se realizează polimorfismul în timpul rulării în Java folosind Metoda Overriding și adnotarea @override cu exemple simple:
Am discutat deja în detaliu conceptul de polimorfism și polimorfismul în timp de compilare. În acest tutorial, vom continua cu polimorfismul Runtime în Java.
Spre deosebire de polimorfismul în timp de compilare, în care apelul de metodă este rezolvat în timp de compilare, în polimorfismul de execuție, apelul de metodă este rezolvat în timpul de execuție.
=> Verificați TOATE Tutorialele Java aici.
Ce veți învăța:
- Polimorfismul de rulare în Java
- Adnotare @override în Java
- Supraîncărcare și suprascriere în Java
- Concluzie
Polimorfismul de rulare în Java
Un polimorfism de rulare care este, de asemenea, cunoscut sub numele de polimorfism dinamic sau Expediere dinamică a metodei este un tehnică în care un apel de metodă suprascris este rezolvat dinamic în timpul rulării.
Polimorfismul în timpul rulării în Java se realizează folosind „ suprasolicitarea metodei ”. Metoda suprascrierii este o tehnică prin care o metodă din clasa părinte este redefinită sau suprascrisă în clasa copil.
Când metoda este suprascrisă într-o clasă, tehnica de expediere a metodei dinamice rezolvă apelul la metoda suprascrisă la runtime și nu la compilare.
Realizați polimorfismul în timpul rulării în Java - Metodă suprascriere
Metoda de suprascriere este abordarea pe care o folosim pentru a realiza polimorfismul de rulare în Java. După cum sa menționat deja, suprascrierea metodei este o tehnică în care subclasa adaugă o metodă care este deja prezentă în clasa sa părinte și adaugă noi funcționalități acestei metode. Apoi spunem că metoda clasei de bază este anulată.
Noua metodă pe care am definit-o în subclasă cu același prototip ca metoda clasei părinte, dar implementarea diferită se numește „ metoda suprascriere ” . Metoda din clasa părinte este cunoscută sub numele de „ Metoda suprascrisă ”.
ce dispozitive funcționează la nivelul osi 2
Odată ce metoda este suprascrisă, rămâne întrebarea cu privire la modul în care apelul la această metodă suprascrisă este rezolvat?
De obicei apelăm metoda suprascrisă prin referința clasei de bază. Vom crea o referință de tip bază și apoi vom atribui un obiect de clasă copil folosind noul cuvânt cheie.
Astfel, depinde de conținutul variabilei de referință sau de ce obiect este menționat de referința clasei de bază care determină care metodă trebuie apelată. Deci, dacă obiectele de referință indică obiectul clasei copil, atunci se numește metoda suprascriere.
În caz contrar, dacă obiectul de referință conține un obiect de clasă de bază, atunci se apelează metoda suprascrisă. Un subiect pe care trebuie să îl clarificăm în polimorfismul de execuție, în special pentru transmiterea metodelor dinamice, este „Upcasting”, care este explicat mai jos.
Upcasting
Când un obiect de referință al clasei părinte pe care l-am discutat mai sus indică sau se referă la obiectul subclasei, atunci îl numim Upcasting.
Să înțelegem ascultarea folosind un exemplu simplu.
Luați în considerare că avem o clasă „BaseClass” și extindem această BaseClass pentru a crea o nouă clasă DerivedClass. Această structură arată așa cum se arată mai jos.
class BaseClass { ….//BaseClass code here } class DerivedClass extends BaseClass{ ….//DerivedClass code here }
Acum, pentru a implementa upcasting, vom declara o variabilă de referință de tip BaseClass. Apoi, atribuim un obiect DerivedClass referinței clasei BaseClass așa cum se face în instrucțiunea de cod de mai jos.
BaseClass base = new DerivedClass (); //Upcasting
Deci, aici putem spune că am ridicat obiectul DerivedClass la BaseClass. În ceea ce privește polimorfismul în timpul rulării, conceptul de ascensiune este foarte important.
Astfel, în general, ascensiunea este procesul de atribuire a obiectelor copil sau subclasă la referința unui părinte sau a unei superclase.
SuperClass reference = new Subclass Object;
Programul Java de mai jos demonstrează suprascrierea metodei și arată, de asemenea, modul în care se efectuează ascultarea pentru a rezolva apelurile de metode suprascrise în timpul rulării.
//base/parent class class Parent { void Print() //print method { System.out.println('Parent::Print() method'); } } //child class 1 inheriting from Parent class child1 extends Parent { void Print() //overridden print method { System.out.println('child1::Print() method'); } } //child class 2 inheriting from Parent class child2 extends Parent { void Print() //overridden print method { System.out.println('child2::Print() method'); } } class Main { public static void main(String() args) { Parent parent = new Parent(); parent.Print(); //executes parent Print () method parent = new child1(); //upcasting parent.Print(); //executes child1 Print () method parent = new child2(); //upcasting parent.Print(); //executes child2 Print () method
Ieșire:
În programul de mai sus, avem două clase, adică child1 și child2, care sunt ambele derivate dintr-o clasă „Parent”. Clasa părinte are o metodă „Imprimare”, care este suprascrisă atât în clasele copil1, cât și în clasa copil2. Apoi, în metoda principală, creăm un obiect de referință al clasei părinte numit „părinte”.
Mai întâi, îi atribuim un obiect al clasei părinte și apoi apelăm metoda „Print ()”. Apoi repetăm acest lucru atribuind mai întâi obiectul child1 și apoi obiectul child2 la referința părinte.
cel mai bun serviciu de recuperare a datelor de pe hard disk
Ieșirea arată, în funcție de conținutul referinței părinte, și se apelează metoda de imprimare corespunzătoare.
Avantajele polimorfismului dinamic / de execuție
- Cu polimorfismul dinamic, programatorului i se permite să suprascrie metodele.
- Permite claselor să definească o metodă cu implementare generală pe care derivatele sale o pot suprascrie și furniza implementarea specifică.
- Cu expediere dinamică a metodei, apelul metodei este rezolvat la runtime, spre deosebire de supraîncărcare, care se decide în timpul compilării. Acest lucru permite mai multă flexibilitate programatorilor.
Deoarece polimorfismul în timp de execuție leagă metoda adecvată de apel în timpul rulării și îl numim și legarea dinamică sau legarea tardivă . Pe de altă parte, polimorfismul în timp de compilare suportă legarea statică sau legarea timpurie .
Legare statică vs. legare dinamică
Legarea statică | Legare dinamică |
---|---|
Metoda de apel rezolvată la compilare este legarea statică. | Metoda de apel rezolvată la runtime este legarea dinamică. |
Supraîncărcarea metodei este un exemplu de legare statică. | Anularea metodei este un exemplu de legare dinamică. |
Tipurile de clase și câmpuri sunt utilizate pentru legarea statică. | Obiectele sunt utilizate pentru legarea dinamică. |
Entitățile private, finale și statice utilizează legarea statică. | Metodele virtuale utilizează legarea dinamică. |
Funcție / metodă virtuală în Java
Funcția sau metoda virtuală în Java este o caracteristică care este utilizată cu polimorfismul Runtime. Spre deosebire de C ++, Java nu are un cuvânt cheie special „virtual” pentru a indica faptul că o metodă este virtuală. O metodă care este definită în clasa de bază și suprascrisă în clasa derivată este virtuală.
În Java, în mod implicit, fiecare metodă nestatică, cu excepția celor private și finale, este o funcție virtuală. Deci, rețineți că metodele pe care le-am discutat mai sus pentru a implementa polimorfismul de execuție sunt, de asemenea, metode virtuale.
Deoarece metoda statică este legată de clasă și nu poate fi apelată folosind un obiect, nu poate fi utilizată cu polimorfismul de execuție și, de asemenea, nu este o funcție virtuală.
Interfețele din Java sunt virtuale în mod implicit. Clasele care implementează interfețe oferă implementări pentru metodele de interfață. La fel ca în polimorfismul de execuție, apelul la metodele de interfață este rezolvat și la execuție.
Amintiți-vă că, deoarece metodele dintr-o interfață sunt proiectate pentru a fi suprascrise, toate metodele de interfață sunt funcții virtuale.
De exemplu, luați în considerare următorul cod:
interface car{ void accelerate(); } class Maruti implements car{ void accelerate () { System.out.println(“Maruti car accelerated!!”); } }
În codul de mai sus, metoda accelerate () este o funcție virtuală, deoarece face parte din mașina de interfață și este concepută pentru a fi suprascrisă.
Adnotare @override în Java
Adnotarea @override este adnotarea implicită în Java. Această adnotare a fost introdusă în Java 1.5. Adnotarea @override este utilizată atunci când metoda subclasă anulează metoda superclasei sale.
Prin utilizarea adnotării Java @override pentru a indica faptul că metoda suprascrie metoda clasei părinte, un compilator emite un avertisment dacă metoda adnotată nu este suprascrisă. Deci, este obligatoriu ca metoda să fie suprascrisă atunci când este utilizată adnotarea @override.
În al doilea rând, folosind adnotarea @override facem codul mai lizibil. Ne putem da seama imediat că metoda declarată trebuie înlocuită.
Sintaxa generală a adnotării Java @override este
public @interface override
Programul Java de mai jos arată utilizarea adnotării @override.
//base class definition class BaseClass { public void display() { System.out.println('BaseClass::display () method'); } } //derived class inheriting base class class DerivedClass extends BaseClass { @Override //indicates the display method being overridden public void display() { System.out.println('DerivedClass::display () method'); } } // main class public class Main { public static void main(String args()) { System.out.println('@Override Example'); //BaseClass type object;contain child object BaseClass testObj = new DerivedClass(); //call display method based on contents of object i.e. derived class display () testObj.display(); } }
Ieșire:
În programul de mai sus, avem un BaseClass care definește o metodă de afișare. Apoi derivăm o clasă DerivedClass din acest BaseClass și marcăm metoda de afișare cu adnotarea @override. Această metodă este suprascrisă în DerivedClass.
În metoda principală, creăm o referință de obiect BaseClass și o îndreptăm către obiectul DerivedClass care face ca referința să apeleze metoda de afișare DerivedClass.
Dacă nu am fi implementat metoda display () în clasa Derived, atunci compilatorul ar fi dat un avertisment al compilatorului, deoarece este marcat cu adnotare @override.
Supraîncărcare și suprascriere în Java
Acum, că am discutat atât despre supraîncărcare, cât și suprascriere în Java, să rezumăm aceste două concepte.
Supraîncărcarea este legată de polimorfismul în timpul compilării, adică implementăm polimorfismul în timpul compilării folosind supraîncărcarea. Supraîncărcarea se face în două moduri, adică supraîncărcarea metodei și supraîncărcarea operatorului.
Supraîncărcarea metodei este tehnica în care avem mai multe metode cu același nume, dar liste de parametri diferiți. Lista parametrilor este diferențiată în funcție de numărul de parametri, tipurile de parametri sau secvența de parametri.
Supraîncărcarea operatorului în Java este limitată și ne permite să supraîncărcăm doar operatorul ‘+’ care este folosit pentru a adăuga două numere și a concatena două obiecte String.
Supraîncărcarea este rezolvată la compilare și este statică. Se mai numește „Legare timpurie” .
Metoda suprascrierii este o caracteristică prin care implementăm polimorfismul în timpul rulării. În metoda suprascrierii, o metodă a clasei părinte este suprascrisă în clasa copil. Aceasta înseamnă că prototipul metodei atât în super cât și în subclasă rămâne același, dar implementările sunt diferite.
Anularea metodei folosește tehnica de expediere a metodei dinamice pentru a rezolva apelul metodei și pentru a decide dacă se apelează o metodă de superclasă sau subclasă și acest lucru se face în timpul rulării.
etl tester intervievează întrebări și răspunsuri
Prin urmare, polimorfismul în timpul rulării este numit și polimorfism dinamic sau legare târzie.
În continuare, să prezentăm diferențele dintre supraîncărcare și suprascriere în Java.
Supraîncărcarea Vs Suprascrierea în Java
Suprasolicitare | Suprasolicitarea |
---|---|
Supraîncărcarea este utilizată în polimorfismul de compilare. | Suprascrierea este implementată în polimorfismul de rulare. |
Se poate face în aceeași clasă. Poate necesita sau nu moștenirea. | Suprascrierea necesită întotdeauna moștenire. |
Metodele sunt supraîncărcate cu același nume de metodă și listă de parametri diferiți. | Metodele suprascrise au aceleași prototipuri. |
Tipul de returnare nu este luat în considerare la supraîncărcarea metodei. | Tipul de returnare trebuie să fie același în metodele suprascrise și suprascrise. |
Îmbunătățește lizibilitatea programului. | Suprascrierea permite să aveți implementare specifică din punct de vedere clasic. |
întrebări frecvente
Q # 1) Putem anula metoda statică?
Răspuns: Nu. Metodele statice nu pot fi anulate în Java. Acest lucru se datorează faptului că metodele statice sunt bazate pe clase și sunt apelate direct de clasă. Nu au nevoie de obiecte pentru a invoca în timpul rulării. Prin urmare, expedierea metodei statice este determinată de compilator.
Q # 2) Putem anula constructorul?
Răspuns: Nu, nu putem anula un constructor. Un constructor este apelat atunci când obiectul este creat. Nu se numește obiect. De asemenea, una dintre cerințele suprascrierii este metoda suprascrisă, iar metoda suprascrierii ar trebui să aibă aceeași semnătură a metodei, care nu este posibilă în cazul constructorilor.
Î. # 3) De ce se numește suprasolicitarea metodei ca Polimorfism Dinamic?
Răspuns: În cazul suprasolicitării metodei, apelul metodei este rezolvat dinamic în timpul rulării. Prin urmare, se numește polimorfism dinamic.
Q # 4) La ce folosește polimorfismul dinamic în Java?
Răspuns: Polimorfismul dinamic utilizează o tehnică de expediere a metodei dinamice care acceptă suprascrierea metodei, astfel încât subclasa să poată oferi implementare specifică metodei suprascrise. Astfel putem implementa caracteristicile specifice care ne permit să scriem programe eficiente.
În al doilea rând, nu trebuie să ne facem griji cu privire la rezolvarea apelurilor de metodă, deoarece expedierea metodei dinamice decide ce metodă să apelăm.
Q # 5) Care este diferența dintre legarea statică și legarea dinamică?
Răspuns: Legătura dintre un apel de metodă și implementarea sa se numește obligatoriu. Când această legare este rezolvată la compilare, o numim legare statică. Când legarea se face dinamic în timpul rulării, atunci o numim legare dinamică.
Legarea statică utilizează tipul de date al clasei și câmpurilor pentru a rezolva apelurile de metodă. Legarea dinamică folosește obiecte pentru a rezolva apelurile de metodă. Legarea statică este, de asemenea, numită polimorfism în timp de compilare, iar legarea dinamică este numită și polimorfism în timpul rulării.
Concluzie
În acest tutorial, am discutat în detaliu polimorfismul de rulare în Java.
Polimorfismul de rulare este implementat folosind metoda suprascriere. Suprascrierea metodei se face în subclasă în care o metodă definită în superclasă este redefinită sau suprascrisă în subclasa sa. Semnătura metodei rămâne aceeași în super și subclasă.
Folosind metoda suprascriere putem oferi implementare specifică aceleiași metode din subclasă. În acest fel, putem scrie programe mai eficiente care implică moștenire. Java oferă adnotare @override pentru a indica faptul că metoda urmează să fie suprascrisă.
În mod implicit, toate metodele nestatice care nu sunt finale sunt virtuale în Java. Toate metodele virtuale pot fi anulate.
=> Urmăriți aici seria de antrenament Java simplă.
Lectură recomandată
- Anularea metodelor predefinite în Java
- Java String length () Metodă cu exemple
- Ce este polimorfismul în Java - Tutorial cu exemple
- Cum se utilizează metoda Java toString?
- Java String indexOf Method cu exemple de cod
- Șirul Java conține () Tutorial metodă cu exemple
- Metoda Java String Split () - Cum se împarte un șir în Java
- Java String compare Metoda cu exemple de programare