logo

Переважаючи на Яві

Коли підклас забезпечує конкретну реалізацію методу, який вже визначений у його батьківському класі, він називається методом, що переосмислює. Метод переоцінки в підкласі повинен мати однакові параметри імені та повернути тип як метод у батьківському класі.

Правила методу, що переосмислюють

  • Параметри імені та тип повернення повинні відповідати батьківському методу.
  • Java вибирає, який метод запускатись під час виконання на основі фактичного типу об'єкта, а не лише типу еталонної змінної.
  • Статичні методи не можуть бути перекриті.
  • З @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 () і їсти () . Клас собак успадковує від тварини та переоцінка Метод хід () для забезпечення конкретної поведінки Собака біжить. Обидва класи можуть отримати доступ до власних методів. Під час створення об'єкта для собак -об'єкта Move () виконує метод переоцінки.



Метод, що переважає на Яві' title=

Особливі випадки в рамках

1. Виклик батьківського методу за допомогою супер

З Супер ключове слово може викликати метод батьківського класу з методу, що переважає.

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 

Чому ми використовуємо метод, що переважає?

  • Змінити або посилити поведінку існуючого методу в підкласі.
  • Для досягнення поліморфізму виконання - методи викликів залежать від фактичного типу об'єкта.
  • Для повторного використання імен методів логічно зниження надмірності.

Приклад у реальному житті: Система управління працівниками

Давайте зрозуміємо переважання з реальною аналогією.

Уявіть, що система управління працівниками організації. Усі працівники поділяють певну поведінку, як -от RainisingAlary () та сприяють (), але логіка відрізняється для різних ролей, таких як менеджер чи інженер. Ми можемо створити один масив працівників, де окремі працівники мають різні типи (технології продажів тощо) та зателефонують їх функціям. Це спрощує загальний код багато.

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 викликають переоцінені методи фактичних об'єктів під час виконання, демонструючи динамічний диспетчер методу (поліморфізм виконання).



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