Prevracia v Jave
Ak podtrieda poskytne špecifickú implementáciu pre metódu, ktorá je už definovaná v jej rodičovskej triede, nazýva sa metóda Prečítanie. Metóda prepísania v podtriede musí mať rovnaké parametre názvu a typ návratu ako metóda v nadradenej triede.
Pravidlá pre potlačenie metódy
- Parametre názvu a typ návratu sa musia zhodovať s rodičovskou metódou.
- Java vyberá, ktorá metóda na spustenie v čase spustenia na základe typu skutočného objektu nielen typu referenčnej premennej.
- Statické metódy nemožno prepísať.
- Ten @Override anotácia Chytá chyby, ako je preklepy v názvoch metód.
class Animal { void move (){ System . out . println ( 'Animal is moving.' ); } void eat (){ System . out . println ( 'Animal is eating.' ); } } class Dog extends Animal { @Override void move (){ // move method from Base class is overriden in this // method System . out . println ( 'Dog is running.' ); } void bark (){ System . out . println ( 'Dog is barking.' ); } } public class Geeks { public static void main ( String [] args ) { Dog d = new Dog (); d . move (); d . eat (); d . bark (); } }
Výstup
Dog is running. Animal is eating. Dog is barking.
Vysvetlenie: Trieda zvierat definuje základné funkcie ako pohyb () a jesť () . Trieda psov zdedí zvieratá a prepisovať Metóda Move () na zabezpečenie konkrétneho správania Pes beží. Obe triedy majú prístup k svojim vlastným metódam. Pri vytváraní objektu psa Calling Move () vykoná metódu prepísania.
Osobitné prípady v prvoradosti
1. Volanie rodičovskej metódy pomocou super
Ten super kľúčové slovo môže vyvolať metódu rodičovskej triedy z prvoradej metódy.
Java class Parent { void show (){ System . out . println ( 'Parent's show()' ); } } class Child extends Parent { @Override void show (){ super . show (); System . out . println ( 'Child's show()' ); } } public class Main { public static void main ( String [] args ){ Parent obj = new Child (); obj . show (); } }
Výstup
Parent's show() Child's show()
2. Konečné metódy nemôžu byť potlačené
Ak nechceme, aby bola spôsob prepísaná, vyhlasujeme to ako finále . Prečítajte si Použitie finále s dedičstvom .
Java class Parent { // Can't be overridden final void show (){ } } class Child extends Parent { // This would produce error void show () {} }
Výstup :
3. Statické metódy
- Statické metódy nemôžu byť potlačené; Definovanie statickej metódy v podtriede s rovnakým podpisom ako v nadtrieskovej metóde skryje metódu nadtrieskovej triedy.
- Metódy inštancie môžu byť prepísané, ale podtrieda nemôže prepísať statickú metódu nadradenia.
- Statická metóda v podtriede s rovnakým podpisom ako statická metóda SuperClass skryje pôvodnú metódu.
class Parent { static void staticMethod (){ System . out . println ( 'Parent static method' ); } void instanceMethod (){ System . out . println ( 'Parent instance method' ); } } class Child extends Parent { static void staticMethod (){ // Hides Parent's static method System . out . println ( 'Child static method' ); } @Override void instanceMethod (){ // Overrides Parent's instance method System . out . println ( 'Child instance method' ); } } public class GFG { public static void main ( String [] args ){ Parent p = new Child (); // Calls Parent's static method (hiding) p . staticMethod (); // Calls Child's overridden instance method p . instanceMethod (); } }
Výstup
Parent static method Child instance method
4. Súkromné metódy
- Súkromné metódy nemôžu byť prepísané, pretože nie sú viditeľné pre podtriedy.
- Metóda podtriedy s rovnakým názvom sa považuje za novú nezávislú metódu nesúvisiacu s rodičovskou triedou.
class Parent { private void display (){ System . out . println ( 'Parent private method' ); } } class Child extends Parent { void display (){ // This is a new method not overriding System . out . println ( 'Child method' ); } } public class GFG { public static void main ( String [] args ){ Child c = new Child (); // Calls Child's method c . display (); } }
Výstup
Child method
5. Typy covariant návratnosti
- V metóde, ktorý prepisuje typ vrátenia metódy prevedenia, môže byť podtrieda typu návratu metódy prepísanej.
- Táto funkcia je známa ako typ návratu Covariant a umožňuje konkrétnejšie typy návratnosti v podtriede.
class Parent { Parent getObject (){ System . out . println ( 'Parent object' ); return new Parent (); } } class Child extends Parent { @Override // Covariant return type Child getObject () { System . out . println ( 'Child object' ); return new Child (); } } public class GFG { public static void main ( String [] args ){ Parent obj = new Child (); // Calls Child's method obj . getObject (); } }
Výstup
Child object
Výnimočné manipulácie v prvoradosti
- Prevádzková metóda nemôže hádzať nové alebo širšie kontrolované výnimky ako metóda v nadtrieskovej triede.
- Môže hodiť menej alebo užšie skontrolované výnimky.
- Môže hodiť akékoľvek nezaškrtnuté výnimky (napríklad RunTimeException) bez ohľadu na metódu nadtrieskovej metódy.
import java.io.IOException ; class Parent { void display () throws IOException { System . out . println ( 'Parent method' ); } } class Child extends Parent { @Override void display () throws IOException { System . out . println ( 'Child method' ); } } public class GFG { public static void main ( String [] args ){ // Parent reference Child object Parent obj = new Child (); try { // Calls Child's overridden method obj . display (); } catch ( IOException e ){ System . out . println ( 'Exception caught: ' + e . getMessage ()); } } }
Výstup
Child method
Prečo používame prekladanie metódy?
- Zmeniť alebo vylepšiť správanie existujúcej metódy v podtriede.
- Na dosiahnutie runtime polymorfizmu - volania metódy závisia od skutočného typu objektu.
- Opätovné použitie názvov metód logicky znižuje redundanciu.
Príklad v reálnom živote: Systém riadenia zamestnancov
Pochopme, aby sme sa prevalili analógiou v reálnom svete.
Predstavte si systém správy zamestnancov organizácie. Všetci zamestnanci zdieľajú určité správanie, ako je RaisesAlary () a propagovať (), ale logika sa líši pre rôzne úlohy, ako je manažér alebo inžinier. Môžeme si vytvoriť jedno zamestnanecké pole, v ktorom sú jednotliví zamestnanci rôznych typov (predajná technológia atď.) A zavolať ich funkcie. To veľa zjednodušuje celkový kód.
Java abstract class Employee { abstract void raiseSalary (); abstract void promote (); } class Manager extends Employee { @Override void raiseSalary (){ System . out . println ( 'Manager salary raised with incentives.' ); } @Override void promote (){ System . out . println ( 'Manager promoted to Senior Manager.' ); } } class Engineer extends Employee { @Override void raiseSalary (){ System . out . println ( 'Engineer salary raised with bonus.' ); } @Override void promote (){ System . out . println ( 'Engineer promoted to Senior Engineer.' ); } } public class Company { public static void main ( String [] args ){ Employee [] employees = { new Manager () new Engineer () }; System . out . println ( '--- Raising Salaries ---' ); for ( Employee e : employees ){ e . raiseSalary (); } System . out . println ( 'n--- Promotions ---' ); for ( Employee e : employees ) { e . promote (); } } }
Výstup
--- Raising Salaries --- Manager salary raised with incentives. Engineer salary raised with bonus. --- Promotions --- Manager promoted to Senior Manager. Engineer promoted to Senior Engineer.
Vysvetlenie: Aj keď sa objekty manažéra aj inžinierov uvádzajú na používanie typu zamestnanca Java nazýva preplnené metódy skutočných objektov za behu demonštrujúc dynamickú metódu Dispatch (runtime polymorfizmus).
Súvisiaci článok: Preťaženie metódy a potlačenie metódy