Преобладаване в Java

Преобладаване в Java

Когато подклас предостави специфична реализация за метод, който вече е дефиниран в нейния родителски клас, той се нарича метод, който е преобладаващ. Методът на преобръщането в подкласа трябва да има същите параметри на име и тип връщане като метода в родителския клас.

Правила за отмяна на метода

  • Параметри на името и типът връщане трябва да съответстват на родителския метод.
  • Java избира кой метод да стартира по време на изпълнение въз основа на действителния тип обект, а не само от типа референтна променлива.
  • Статичните методи не могат да бъдат отменени.
  • The @Override пояснение Улов на грешки като печатни грешки в имената на методите.
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  ();      }   }   

Изход
Dog is running. Animal is eating. Dog is barking.  

Обяснение: Класът на животните определя основни функционалности като move () и яжте () . Класът на кучетата наследява от животни и отменя методът на преместване () за осигуряване на конкретно поведение Кучето тича. И двата класа могат да имат достъп до собствените си методи. При създаване на кучешки обект извикване на Object move () изпълнява метода на преобръщане.

Метод, отменящ се в Java

Специални случаи при отмяна

1. Обаждане на метод на родител, използвайки супер

The супер ключова дума може да извика метода на родителския клас от метода за преобладаване.

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  ();      }   }   

Изход
Parent's show() Child's show()  

2.  Крайните методи не могат да бъдат отменени

Ако не искаме метод да бъде отменен, ние го декларираме като  окончателно . Моля, вижте  Използване на окончателно с наследство

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


Изход :

Методовертриране

3. Статични методи

  • Статичните методи не могат да бъдат отменени; Определянето на статичен метод в подклас със същия подпис, както в суперкласа, крие метода на суперкласа.
  • Методите на инстанцията могат да бъдат отменени, но подклас не може да отмени статичния метод на суперклас.
  • Статичен метод в подклас със същия подпис като статичен метод на суперклас крие оригиналния метод.
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  ();         }   }   

Изход
Parent static method Child instance method  

4. Частни методи

  • Частните методи не могат да бъдат отменени, тъй като те не са видими за подкласовете.
  • Методът на подклас със същото име се третира като нов независим метод, несвързан с родителския клас.
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  ();         }   }   

Изход
Child method  

5. Ковариантни видове връщане

  • В метода, отменящ се типа връщане на метода за преобладаване, може да бъде подклас на типа връщане на метода на отменянето.
  • Тази функция е известна като ковариантния тип връщане и позволява по -специфични типове връщане в подкласа.
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  ();             }   }   

Изход
Child object  

Изключително обработка на преобладаващите

  • Методът за преобладаване не може да хвърли нови или по -широки проверени изключения от метода в суперкласа.
  • Той може да хвърли по -малко или по -тесни проверени изключения.
  • Той може да хвърли всякакви непроверени изключения (като RunTimeException), независимо от метода на суперклас.
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  ());      }      }   }   

Изход
Child method  

Защо използваме метод, който преобладава?

  • Да променя или подобри поведението на съществуващ метод в подклас.
  • За постигане на полиморфизъм на изпълнение - Методът разговорите зависят от действителния тип обект.
  • За да се използват повторно имената на методи, логично намалявайки излишъка.

Пример за реалния живот: Система за управление на служителите

Нека разберем преодоляването с аналогия в реалния свят.

Представете си система за управление на служителите на организацията. Всички служители споделят някои поведения като RaiseSalary () и Promote (), но логиката се различава за различни роли като мениджър или инженер. Можем да създадем един масив на служители, където отделните служители са от различни видове (технологии за продажби и т.н.) и да се обаждаме на техните функции. Това много опростява общия код.

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  ();      }      }   }   

Изход
--- Raising Salaries --- Manager salary raised with incentives. Engineer salary raised with bonus. --- Promotions --- Manager promoted to Senior Manager. Engineer promoted to Senior Engineer.  

Обяснение: Въпреки че и обектите на мениджър и инженери се насочват с помощта на типа на служителя Java извиква отменените методи на действителните обекти по време на изпълнение, демонстрирайки динамичен метод за изпращане (полиморфизъм на изпълнение).

Свързана статия: Метод претоварване и отмяна на метода