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

Особливі випадки в рамках
1. Виклик батьківського методу за допомогою супер
З Супер ключове слово може викликати метод батьківського класу з методу, що переважає.
Javaclass 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. Остаточні методи не можуть бути перекриті
Якщо ми не хочемо, щоб метод був переоцінений, ми оголошуємо його як остаточний . Будь ласка, подивіться Використання фіналу з успадкуванням .
Javaclass Parent{ // Can't be overridden final void show(){ } } class Child extends Parent{ // This would produce error void show() {} }
Випуск :
3. Статичні методи
- Статичні методи не можуть бути перекриті; Визначення статичного методу в підкласі з тим же підписом, що і в Суперкласі, приховує метод суперкласа.
- Методи екземпляра можуть бути перекриті, але підклас не може перекрити статичний метод суперкласу.
- Статичний метод у підкласі з тим самим підписом, що і статичний метод суперкласа, приховує вихідний метод.
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. Приватні методи
- Приватні методи не можуть бути перекриті, оскільки вони не видно для підкласів.
- Метод підкласу з однойменною назвою розглядається як новий незалежний метод, не пов'язаний з батьківським класом.
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. Коваріантні типи повернення
- У методі, що переосмислює тип повернення методу, що переоцінює, може бути підкласом типу повернення методу переоцінки.
- Ця функція відома як тип повернення коваріантів і дозволяє більш конкретні типи повернення в підкласі.
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) незалежно від методу суперкласу.
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 () та сприяють (), але логіка відрізняється для різних ролей, таких як менеджер чи інженер. Ми можемо створити один масив працівників, де окремі працівники мають різні типи (технології продажів тощо) та зателефонують їх функціям. Це спрощує загальний код багато.
Javaabstract 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 викликають переоцінені методи фактичних об'єктів під час виконання, демонструючи динамічний диспетчер методу (поліморфізм виконання).
Пов’язана стаття: Перевантаження методу та переосмислення методу