
Animal
родителския клас, който представлява животни, и създадем speak
метод в него:
public class Animal {
public void speak() {
System.out.println("Hello!");
}
}
Въпреки че току-що започнахме да пишем нашата програма, вероятно виждате потенциален проблем: светът е пълен с много животни и всички те „говорят“ по различен начин: котките мяучат, патиците крякат, змиите съскат и т.н.
Нашата цел е проста: 
meow()
метод за мяукане, hiss()
за съскане и т.н., ние искаме змията да съска, котката да мяуче и кучето да лае, когато методът speak()
бъде извикан. Можем лесно да постигнем това, като използваме отмяна на метода . Уикипедия обяснява термина по следния начин: Замяна на метода, в обектно-ориентираното програмиране, е езикова характеристика, която позволява на подклас or дъщерен клас да предостави специфична реализация на метод, който вече е предоставен от един от неговите суперкласове or родителски класове. Това по принцип е правилно. Замяната ви позволява да вземете няHowъв метод на родителски клас и да напишете своя собствена реализация във всеки производен клас. Новата реализация в дъщерния клас "замества" тази в родителския. Нека да видим How изглежда това с пример. Нека създадем 4 наследника на нашия Animal
клас:
public class Bear extends Animal {
@Override
public void speak() {
System.out.println("Growl!");
}
}
public class Cat extends Animal {
@Override
public void speak() {
System.out.println("Meow!");
}
}
public class Dog extends Animal {
@Override
public void speak() {
System.out.println("Woof!");
}
}
public class Snake extends Animal {
@Override
public void speak() {
System.out.println("Hiss!");
}
}
Ето малък лайфхак за бъдещето: за да замените методите на родителски клас, влезте в codeа на производния клас в IntelliJ IDE , натиснете Ctrl+O и изберете Замени методите... от менюто. Свикнете да използвате клавишни комбинации от самото начало. Те ще ускорят codeирането! За да постигнем желаното поведение, направихме няколко неща:
- Във всеки клас наследник създадохме метод със същото име като метода в родителския клас.
-
Казахме на компилатора, че не просто даваме на метода същото име като в родителския клас, а по-скоро искаме да отменим поведението му. Това „съобщение“ към компилатора се предава чрез анотацията @Override .
Анотацията @Override над даден метод казва на компилатора (Howто и на други програмисти, които четат вашия code): „Не се притеснявайте. Това не е грешка or пропуск. Наясно съм, че този метод вече съществува и искам да го отменя . - Написахме имплементацията, от която се нуждаем за всеки клас наследник. Когато
speak()
се извика методът, змия трябва да изсъска, мечка да ръмжи и т.н.
public class Main {
public static void main(String[] args) {
Animal animal1 = new Dog();
Animal animal2 = new Cat();
Animal animal3 = new Bear();
Animal animal4 = new Snake();
animal1.speak();
animal2.speak();
animal3.speak();
animal4.speak();
}
}
Изход от конзолата:
Woof!
Meow!
Growl!
Hiss!
Супер, всичко работи Howто трябва! Създадохме 4 референтни променливи, чийто тип е Animal
родителският клас, и им присвоихме 4 различни обекта от наследствените класове. В резултат на това всеки обект се държи по различен начин. За всеки от производните класове, замененият speak()
метод замества съществуващия speak()
метод на Animal
класа (който просто показва „Говоря:“ на конзолата). 
-
Отменен метод трябва да има същите аргументи като метода в родителския клас.
Ако
speak
методът на родителския клас приемаString
като вход, тогава заместеният метод в наследствения клас също трябва да приемаString
като вход. В противен случай компилаторът ще генерира грешка:public class Animal { public void speak(String s) { System.out.println("Speaking: " + s); } } public class Cat extends Animal { @Override // Error! public void speak() { System.out.println("Meow!"); } }
-
Замененият метод трябва да има същия тип връщане като метода в родителския клас.
В противен случай ще получим грешка при компилация:
public class Animal { public void speak() { System.out.println("Hello!"); } } public class Cat extends Animal { @Override public String speak() { // Error! System.out.println("Meow!"); return "Meow!"; } }
-
Модификаторът за достъп на заменения метод също не може да се различава от оригиналния:
public class Animal { public void speak() { System.out.println("Hello!"); } } public class Cat extends Animal { @Override private void speak() { // Error! System.out.println("Meow!"); } }
speak()
метод за всички, а не куп различни методи, напр bark()
. meow()
, и т.н.
GO TO FULL VERSION