Када поткласа пружа одређену примену за методу која је већ дефинисана у свом родитељском разреду, то се назива превладавајући начин. Овернути метод у поткласи мора имати исте параметре имена и врсти повратка као метода у матичној класи.
јавасцрипт онцлицк
Правила за превладавање метода
- Параметри имена и врста повратка морају се подударати са родитељском методом.
- Јава бира која метода да се покреће у време трајања на основу стварног типа објекта, а не само референтна варијабилна врста.
- Статичке методе се не могу надјачати.
- Тхе АНСИТОН АНСИТОН хвата грешке попут погрешака у именама метода.
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.
Објашњење: Класа животиња дефинише основне функционалности попут потез () и јести () . Наслеђује класе паса од животиње и надјачати метода потеза () да пружи одређено понашање Обе часове могу приступити сопственим поступцима. Приликом креирања паса Објект Позив за позивање () извршава преглашени метод.

Посебни случајеви у прегледу
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
Изузетно руковање у прегледу
- Превладавајућа метода не може да баца нове или шире провјерене изузетке од методе у суперкласу.
- Може бацити мање или ужи провјерено изузеће.
- Може бацити све непровјерене изузетке (попут Рунтимеекцептион) без обзира на методу суперкласа.
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
Зашто користимо превладавајући начин?
- Да се промени или побољшају понашање постојеће методе у подразлици.
- Да би се постигло полуморфизам за рунтиме - метода позиви зависе од стварног типа објекта.
- За поновну употребу имена метода логично смањује редундантност.
Пример реалног живота: Систем управљања запосленима
Схватимо превладавајуће аналогију стварног света.
јава низ сортиран
Замислите систем управљања запосленима организације. Сви запослени деле нека понашања попут раковне () и промовишу (), али логика се разликује за различите улоге попут менаџера или инжењера. Можемо да створимо низ запосленог у којем су поједини запослени у различитим типовима (продаја техничара итд.) И називају своје функције. Ово поједностављује укупни број у пуно.
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.
Објашњење: Иако се и менаџер и инжењерски објекти називају коришћењем типа запослених Јава, назива преглашене методе стварних објеката на извођању динамичке методе (полуморфизам за рунтиме).
Сродни чланак: Метода преоптерећење и превладавање метода