Szia! Ön már Java metódusokat használ, és sokat tud róluk. Valószínűleg szembesültél már azzal a helyzettel, hogy egy osztályban sok metódus van, ugyanazzal a névvel, de eltérő paraméterekkel. Emlékszel, hogy ezekben az esetekben módszertúlterhelést alkalmaztunk. Ma egy másik helyzetet vizsgálunk. Képzeljük el, hogy egyetlen megosztott metódusunk van, de ennek különböző dolgokat kell végrehajtania a különböző osztályokban. Hogyan valósítsuk meg ezt a magatartást? Hogy megértsük, nézzünk meg egy Animal szülő osztályt, amely az állatokat képviseli, és hozunk létre benne egy beszédmódszert :
Célunk egyszerű: ne hozzon létre rengeteg beszédmódot. Ahelyett, hogy létrehoznánk egy catSpeak() metódust a nyávogáshoz, egy snakeSpeak() metódust a sziszegéshez stb., a speak() metódust szeretnénk meghívni.módszerrel, és a kígyó sziszeg, a macska nyávog, és a kutya ugat. Ezt a módszer felülbírálásával könnyen elérhetjük. A Wikipédia a következő magyarázatot adja a „felülbírálás” kifejezésre: A metódus felülbírálása az objektum-orientált programozásban egy olyan nyelvi szolgáltatás, amely lehetővé teszi egy alosztálynak vagy gyermekosztálynak, hogy egy olyan metódus konkrét megvalósítását biztosítsa, amelyet valamelyik szuperosztálya, ill. szülői osztályok Ez lényegében helyes. A metódus felülbírálása lehetővé teszi, hogy a szülőosztály valamelyik metódusát vegyük, és minden gyermekosztályba saját implementációt írjunk. Az új implementáció „felváltja” a szülő implementációját a gyermekosztályban. Nézzük meg, hogyan néz ki ez egy példán. Hozzon létre 4 osztályt, amelyek öröklik az Állatok osztályunkat:
A felülbírálásnak számos korlátja van:
public class Animal {
public void speak() {
System.out.println("Hello!");
}
}
Bár még csak most kezdtük el írni a programot, valószínűleg lát egy lehetséges problémát: sok állat van a világon, és mindegyik másképp "beszél": a macskák nyávognak, a kacsák hápognak, a kígyók sziszegnek. 
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!");
}
}
"Íme egy kis mentőakció a jövőre nézve: a szülőosztály metódusainak felülbírálásához lépjen az utódosztály kódjára az IntelliJ IDE-ben, kattintson a Ctrl+O billentyűkre, és válassza a "Módszerek felülbírálása..." menüpontot a menüben. Szokjon rá a gyorsbillentyűk használatára. a kezdetektől fogva – segít gyorsabban írni a programokat! A szükséges viselkedés meghatározásához néhány dolgot megtettünk:
- Minden gyermekosztályban létrehoztunk egy metódust, amelynek neve megegyezik a szülő osztály metódusával.
- Azt mondtuk a fordítónak, hogy a metódus elnevezése ugyanúgy, mint a szülő osztályban, nem véletlen: felül akarjuk írni a viselkedését. Ahhoz, hogy ezt közöljük a fordítóval, beállítjuk a @Override annotációt a metódus fölé.
Amikor egy metódus fölé helyezik, az @Override megjegyzés tájékoztatja a fordítót (valamint a kódot olvasó programozókat): „Minden rendben van. Ez nem hiba. Nem vagyok feledékeny. Tisztában vagyok vele, hogy már létezik ilyen módszer, és szeretném felülírni. - Minden gyerekosztályhoz megírtuk a szükséges megvalósítást. A speak() metódus meghívásakor egy kígyó sziszeg, egy medve morog stb.
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();
}
}
Konzol kimenet:
Woof!
Meow!
Growl!
Hiss!
Kiváló! Minden úgy működik ahogy kell! Létrehoztunk 4 referenciaváltozót, amelyek az Animal szülő osztály objektumait tárolják, és 4 különböző gyermekosztály példányait rendeltük hozzájuk. Ennek eredményeként minden tárgy saját viselkedést mutat. Minden gyermekosztálynál a felülírt speak() metódus felváltotta a 'native' speak() metódust az Animal osztályban (amely egyszerűen a 'Hello!'-t jeleníti meg). 
-
A felülírt metódusnak ugyanazokkal a paraméterekkel kell rendelkeznie, mint a szülő metódusé.
Ha a szülőosztály speak metódusának van String paramétere, akkor a gyermekosztályban felülírt metódusnak is String paraméterrel kell rendelkeznie. Ellenkező esetben a fordító hibát generál:
public class Animal { public void speak(String s) { System.out.println("Hello! " + s); } } public class Cat extends Animal { @Override // Error! public void speak() { System.out.println("Meow!"); } }
-
A felülírt metódus visszatérési típusának meg kell egyeznie a szülő metóduséval.
Ellenkező esetben fordítói hibát kapunk:
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!"; } }
-
A felülírt metódus hozzáférés-módosítójának is meg kell egyeznie az „eredeti” metódussal:
public class Animal { public void speak() { System.out.println("Hello!"); } } public class Cat extends Animal { @Override private void speak() { // Error! System.out.println("Meow!"); } }
GO TO FULL VERSION