CodeGym /Java blog /Véletlen /Módszer felülbírálása Java-ban
John Squirrels
Szint
San Francisco

Módszer felülbírálása Java-ban

Megjelent a csoportban
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 :

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. Hogyan működik a módszer felülbírálása - 2Cé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:

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:
  1. Minden gyermekosztá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 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.

  3. 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.
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!
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). Hogyan működik a módszer felülbírálása - 3A felülbírálásnak számos korlátja van:
  1. 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!");
       }
    }
    

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

  3. 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!");
           }
    }
    
A Java módszer felülbírálása a polimorfizmus megvalósításának egyik módja (az OOP elve, amelyet az előző leckében ismertettünk). Ez azt jelenti, hogy a fő előnye ugyanaz a rugalmasság, amelyet korábban tárgyaltunk. Felépíthetünk egy egyszerű és logikus osztályrendszert, amelyek mindegyikének sajátos viselkedése van (kutyák ugatnak, macskák nyávognak), közös interfésszel - egyetlen speak() metódus mindegyikhez, nem pedig rengeteg metódus, pl. dogSpeak() , speakCat () stb.
Hozzászólások
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION