logo

Преобладаване в 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' title=

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

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


Изход :

Методовертриране' loading='lazy' title=

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 извиква отменените методи на действителните обекти по време на изпълнение, демонстрирайки динамичен метод за изпращане (полиморфизъм на изпълнение).

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