logo

Převažující v Javě

Pokud podtřída poskytne specifickou implementaci pro metodu, která je již definována v jeho nadřazené třídě, nazývá se převažující metoda. Metoda přepsání v podtřídě musí mít stejný název parametry a typ návratu jako metoda v nadřazené třídě.

Pravidla pro převahu metody

  • Parametry názvu a typ návratu se musí shodovat s nadřazenou metodou.
  • Java vybírá, kterou metodu probíhá za běhu na základě skutečného typu objektu, nejen typu referenční proměnné.
  • Statické metody nelze přepsat.
  • The @Override anotace Chybí chyby jako překlepy v názvech metod.
Java
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. 

Vysvětlení: Třída zvířat definuje základní funkce jako pohyb() a jíst() . Třída psů zdědí od zvířete a přepsání metoda pohybu () pro zajištění konkrétního chování Pes běží. Obě třídy mají přístup ke svým vlastním metodám. Při vytváření objektu psího objektu Calling Move () provádí metodu přepsání.



Převažující metoda v Javě' title=

Zvláštní případy převažující

1. Volání rodičovské metody pomocí super

The super klíčové slovo může vyvolat metodu rodičovské třídy z metody převažující.

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é metody nelze přepsat

Pokud nechceme, aby byla metoda přepsána  finále . Viz prosím  Používání finále s dědictvím

řazení v seznamu polí v jazyce Java
Java
class Parent{    // Can't be overridden  final void show(){    } } class Child extends Parent{    // This would produce error  void show() {} } 


Výstup :



Metodika' loading='lazy' title=

3. statické metody

  • Statické metody nelze přepsat; Definování statické metody v podtřídě se stejným podpisem jako v super třídě skrývá metodu superclass.
  • Metody instancí lze přepsat, ale podtřída nemůže přepsat statickou metodu superclass.
  • Statická metoda v podtřídě se stejným podpisem jako statická metoda super třídy skrývá původní metodu.
Java
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. soukromé metody

  • Soukromé metody nelze přepsat, protože nejsou viditelné pro podtřídy.
  • Metoda podtřídy se stejným názvem je považována za novou nezávislou metodu nesouvisející s rodičovskou třídou.
Java
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 návratnosti kovariantu

  • V metodě přepsající typ návratnosti může být podtřídou typu návratu přepsané metody.
  • Tato funkce je známá jako typ návratu kovariantu a umožňuje konkrétnější typy návratnosti v podtřídě.
Java
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 

Zvládnutí výjimky v převahu

  • Převažující metoda nemůže házet nové nebo širší kontrolované výjimky než metoda v superclass.
  • Může hodit méně nebo užší kontrolované výjimky.
  • Může házet všechny nekontrolované výjimky (jako je runtimeexception) bez ohledu na metodu superclass.
Java
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 

Proč používáme převažující metodu?

  • Změnit nebo zlepšit chování existující metody v podtřídě.
  • K dosažení polymorfismu runtime - volání metody závisí na skutečném typu objektu.
  • Názvy metod opětovného použití logicky snižují redundanci.

Příklad skutečného života: Systém správy zaměstnanců

Pojďme pochopit přepsání analogií v reálném světě.

Představte si systém řízení zaměstnanců organizace. Všichni zaměstnanci sdílejí některá chování, jako je rychlost () a propaguje (), ale logika se liší pro různé role, jako je manažer nebo inženýr. Můžeme vytvořit jedinou řadu zaměstnanců, kde jsou jednotliví zaměstnanci různých typů (prodejní technologie atd.) A volat jejich funkce. To hodně 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. 

Vysvětlení: Přestože jsou objekty manažera i inženýra označovány pomocí typu zaměstnance Java volá přepsané metody skutečných objektů za běhu demonstrující dynamickou metodu odeslání (polymorfismus runtime).



Související článek: Přetížení metody a převažování metody