Когато подклас предостави специфична реализация за метод, който вече е дефиниран в нейния родителски клас, той се нарича метод, който е преобладаващ. Методът на преобръщането в подкласа трябва да има същите параметри на име и тип връщане като метода в родителския клас.
Правила за отмяна на метода
- Параметри на името и типът връщане трябва да съответстват на родителския метод.
- Java избира кой метод да стартира по време на изпълнение въз основа на действителния тип обект, а не само от типа референтна променлива.
- Статичните методи не могат да бъдат отменени.
- The @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 () и яжте () . Класът на кучетата наследява от животни и отменя методът на преместване () за осигуряване на конкретно поведение Кучето тича. И двата класа могат да имат достъп до собствените си методи. При създаване на кучешки обект извикване на Object move () изпълнява метода на преобръщане.

Специални случаи при отмяна
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. Крайните методи не могат да бъдат отменени
Ако не искаме метод да бъде отменен, ние го декларираме като окончателно . Моля, вижте Използване на окончателно с наследство .
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
Защо използваме метод, който преобладава?
- Да променя или подобри поведението на съществуващ метод в подклас.
- За постигане на полиморфизъм на изпълнение - Методът разговорите зависят от действителния тип обект.
- За да се използват повторно имената на методи, логично намалявайки излишъка.
Пример за реалния живот: Система за управление на служителите
Нека разберем преодоляването с аналогия в реалния свят.
Представете си система за управление на служителите на организацията. Всички служители споделят някои поведения като RaiseSalary () и Promote (), но логиката се различава за различни роли като мениджър или инженер. Можем да създадем един масив на служители, където отделните служители са от различни видове (технологии за продажби и т.н.) и да се обаждаме на техните функции. Това много опростява общия код.
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 извиква отменените методи на действителните обекти по време на изпълнение, демонстрирайки динамичен метод за изпращане (полиморфизъм на изпълнение).
Свързана статия: Метод претоварване и отмяна на метода