Prevracia v Jave

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.
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.  

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.

Metóda, ktorá prvádila v Java

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 :

Metóda

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.
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. 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.
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 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.
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  

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.
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  

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