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.
java char na int

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.
Javaclass 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 .
Javaclass 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.
dlhý na šnúru
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.
Javaabstract 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
formátovanie reťazcov java