Převažující v Javě

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ě

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

Java
   class   Parent  {          // Can't be overridden      final     void     show  (){          }   }   class   Child     extends     Parent  {          // This would produce error      void     show  ()     {}   }   


Výstup :

Metodika

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


Nejlepší Články

Kategorie

Zajímavé Články