Szia! Már használod a Java metódusokat, és sokat tudsz róluk. Hogyan működik a módszer felülbírálása - 1Biztosan találkoztál már sok metódussal rendelkező osztállyal, aminek ugyanaz a neve, de eltérő argumentumlistájuk. Emlékszel, hogy ezekben az esetekben módszertúlterhelést alkalmaztunk. Ma egy másik helyzetet veszünk szemügyre. Képzeljük el, hogy van egy közös metódusunk, de ennek különböző dolgokat kell tennie attól függően, hogy melyik osztályba hívják. Hogyan valósítjuk meg ezt a viselkedést? Ennek megértéséhez vegyük az Animalállatokat reprezentáló szülő osztályt, és hozzunk létre egy speakmetódust benne:

public class Animal {
  
   public void speak() {

       System.out.println("Hello!");
   }
}
Bár még csak most kezdtük el írni a programunkat, valószínűleg lát egy lehetséges problémát: a világ tele van rengeteg állattal, és mind másképp "beszélnek": macskák nyávognak, kacsák hápognak, kígyók sziszegnek stb. Célunk egyszerű: Hogyan működik a módszer felülbírálása - 2mi szeretné elkerülni egy csomó beszédmód létrehozását. Ahelyett, hogy létrehoznánk egy meow()módszert a nyávogásra, hiss()sziszegésre stb., azt akarjuk, hogy a kígyó sziszegjön, a macska nyávogjon, és a kutya ugasson, amikor a speak()módszert hívják. Ezt a módszer felülbírálásával könnyen elérhetjük . A Wikipédia a következőképpen magyarázza a kifejezést: Method overridingAz objektum-orientált programozásban egy olyan nyelvi szolgáltatás, amely lehetővé teszi egy alosztály vagy gyermekosztály számára, hogy egy olyan metódus konkrét megvalósítását biztosítsa, amelyet valamelyik szuperosztálya vagy szülőosztálya már biztosít. Ez alapvetően helyes. A felülbírálás lehetővé teszi egy szülőosztály valamelyik metódusát, és minden származtatott osztályba saját implementációt írhat. Az új megvalósítás a gyermek osztályban "felváltja" a szülőben lévőt. Nézzük meg, hogyan is néz ez ki egy példán keresztül. Hozzunk létre 4 leszármazottat az osztályunkból 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!");
   }
}
Íme egy kis életmentő a jövőre nézve: a szülőosztály metódusainak felülbírálásához lépjen be a származtatott osztály kódjába az IntelliJ IDE- ben , nyomja meg a Ctrl+O billentyűkombinációt , és válassza a menüből a Metódusok felülbírálása... lehetőséget. Kezdettől fogva szokja meg a gyorsbillentyűk használatát. Felgyorsítják a kódolást! A kívánt viselkedés elérése érdekében néhány dolgot megtettünk:
  1. Minden leszármazott osztályban létrehoztunk egy metódust, amelynek neve megegyezik a szülő osztály metódusával.
  2. Azt mondtuk a fordítónak, hogy nem csak ugyanazt a nevet adjuk a metódusnak, mint a szülő osztályban, hanem felül akarjuk írni a viselkedését. Ez az "üzenet" a fordítónak az @Override annotáción keresztül kerül továbbításra.
    A metódus feletti @Override megjegyzés azt mondja a fordítónak (valamint a kódot olvasó más programozóknak): "Ne aggódjon. Ez nem hiba vagy figyelmen kívül hagyás. Tisztában vagyok vele, hogy ez a módszer már létezik, és szeretném felülírni .

  3. Minden leszármazott osztályhoz megírtuk a szükséges megvalósítást. Amikor a speak()módszert hívják, egy kígyó sziszeg, egy medve morog, és így tovább.
Nézzük meg, hogyan működik ez egy programban:

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!
Szuper, minden úgy működik ahogy kell! Létrehoztunk 4 referenciaváltozót, amelyek típusa a Animalszülő osztály, és hozzárendeltük a leszármazott osztályok 4 különböző objektumát. Ennek eredményeként minden objektum másként viselkedik. Mindegyik származtatott osztály esetében a felülírt speak()metódus lecseréli az osztály meglévő speak()metódusát Animal(amely egyszerűen a „Speaking:” üzenetet jeleníti meg a konzolon). Hogyan működik a módszer felülbírálása - 3A módszer felülbírálásának számos korlátja van:
  1. A felülírt metódusnak ugyanazokkal az argumentumokkal kell rendelkeznie, mint a szülőosztály metódusának.

    Ha a speakszülő osztály metódusa Stringbemenetet vesz, akkor a leszármazott osztály felülírt metódusának is Stringbemenetet kell vennie. Ellenkező esetben a fordító hibát generál:

    
    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!");
       }
    }
    

  2. A felülírt metódusnak meg kell egyeznie a szülőosztály metódusának visszatérési típusával.

    Ellenkező esetben fordítási 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!";
       }
    }
    

  3. A felülírt metódus hozzáférés-módosítója sem térhet el az eredetitől:

    
    public class Animal {
    
       public void speak() {
    
           System.out.println("Hello!");
       }
    }
    
    public class Cat extends Animal {
    
       @Override
       private void speak() {      // Error!
           System.out.println("Meow!");
       }
    }
    
Java-ban a metódusok felülbírálása a polimorfizmus megvalósításának egyik módja. Ez azt jelenti, hogy a fő előnye az a rugalmasság, amelyről korábban beszéltünk. Felállíthatunk egy egyszerű és logikus osztályhierarchiát, amelyek mindegyike sajátos viselkedéssel (kutyák ugatása, nyávogó macskák), de egyetlen interfésszel – egyetlen speak()módszer mindenki számára, nem pedig egy csomó különböző módszer, pl bark(). , meow(), stb.