Nadjačano u Javi
Kad podrazred osigurava specifičnu implementaciju za metodu koja je već definirana u svojoj matičnoj klasi, to se naziva nadjačavanjem metode. Pretplaćena metoda u podrazli mora imati istoimene parametre i tip povratka kao metoda u matičnoj klasi.
Pravila za prevladavanje metoda
- Naziv Parametri i tip povratka moraju se podudarati s roditeljskom metodom.
- Java odabire koju metodu radi u vrijeme pokretanja na temelju stvarne vrste objekta, a ne samo referentne vrste varijable.
- Statičke metode se ne mogu nadjačati.
- A @Override napomena hvata pogreške poput pogrešaka u pogreškama u imenima metoda.
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 (); } }
Izlaz
Dog is running. Animal is eating. Dog is barking.
Obrazloženje: Životinjska klasa definira osnovne funkcionalnosti poput potez() i jesti() . Klasa psa nasljeđuje od životinje i poništiti Metoda Move () za pružanje određenog ponašanja Pas trči. Obje klase mogu pristupiti vlastitim metodama. Prilikom stvaranja psećeg objekta poziva se move () izvršava nadjačanu metodu.
Posebni slučajevi u prevladavanju
1. Pozivanje roditeljske metode pomoću super
A Super ključna riječ može pozvati metodu matične klase iz metode prevladavanja.
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 (); } }
Izlaz
Parent's show() Child's show()
2. Konačne metode ne mogu se nadjačati
Ako ne želimo da se metoda nadjača, izjavljujemo je konačan . Molimo pogledajte Korištenje finala s nasljeđivanjem .
Java class Parent { // Can't be overridden final void show (){ } } class Child extends Parent { // This would produce error void show () {} }
Izlaz ::
3. statičke metode
- Statičke metode se ne mogu nadjačati; Definiranje statičke metode u podrazredu s istim potpisom kao u superklasima skriva metodu superklase.
- Metode instanci mogu se nadjačati, ali podrazred ne može nadjačati statičku metodu superklase.
- Statička metoda u podrazredu s istim potpisom kao i statička metoda superklasa skriva izvornu metodu.
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 (); } }
Izlaz
Parent static method Child instance method
4. Privatne metode
- Privatne metode ne mogu se nadjačati jer nisu vidljive podrazredima.
- Metoda podrazreda s istim imenom tretira se kao nova neovisna metoda koja nije povezana s matičnom klasom.
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 (); } }
Izlaz
Child method
5. Kovarijantni tipovi povratka
- U metodi koja nadjačava vrstu povratka metode prevladavanja može biti podrazred returnog tipa nadjačene metode.
- Ova je značajka poznata kao kovarijantna vrsta povratka i omogućava specifičnije vrste povrata u podrazredu.
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 (); } }
Izlaz
Child object
Upravljanje iznimkama u prevladavanju
- Način prevladavanja ne može izbaciti nove ili šire provjerene iznimke od metode u superklasu.
- Može baciti manje ili uže provjerene iznimke.
- Može baciti bilo kakve neprovjerene iznimke (poput RuntimeException) bez obzira na metodu superklase.
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 ()); } } }
Izlaz
Child method
Zašto koristimo nadjačavanje metode?
- Promjena ili poboljšanje ponašanja postojeće metode u potklasu.
- Da bi se postigao polimorfizam izvođenja - pozivi metoda ovise o stvarnoj vrsti objekta.
- Da bi se metoda ponovno upotrijebila logično smanjenje viška.
Primjer iz stvarnog života: Sustav upravljanja zaposlenicima
Razumijemo nadjačavanje analogijom u stvarnom svijetu.
Zamislite sustav upravljanja zaposlenicima organizacije. Svi zaposlenici dijele neka ponašanja kao što su RaisesAlary () i promoviraju (), ali logika se razlikuje za različite uloge poput menadžera ili inženjera. Možemo stvoriti jedinstveni niz zaposlenika u kojem su pojedini zaposlenici različitih vrsta (prodajne tehnologije itd.) I nazvati njihove funkcije. To puno pojednostavljuje cjelokupni 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 (); } } }
Izlaz
--- Raising Salaries --- Manager salary raised with incentives. Engineer salary raised with bonus. --- Promotions --- Manager promoted to Senior Manager. Engineer promoted to Senior Engineer.
Obrazloženje: Iako se i menadžer i inženjerski objekti upućuju na korištenje tipa zaposlenika Java poziva nadjačene metode stvarnih objekata u vrijeme izvođenja pokazujući dinamičku dinamičku metodu (polimorfizam runtime).
Povezani članak: Preopterećenje metode i prevladavanje metoda