CodeGym/Blog Java/Aleatoriu/Suprascrierea metodei în Java
John Squirrels
Nivel
San Francisco

Suprascrierea metodei în Java

Publicat în grup
Bună! Folosești deja metode Java și știi multe despre ele. Probabil te-ai confruntat cu situația în care o clasă are multe metode cu același nume, dar cu parametri diferiți. Vă veți aminti că în acele cazuri am folosit supraîncărcarea metodei. Astăzi luăm în considerare o altă situație. Imaginați-vă că avem o singură metodă partajată, dar trebuie să facă lucruri diferite în clase diferite. Cum implementăm acest comportament? Pentru a înțelege, să luăm în considerare o clasă părinte Animal , care reprezintă animale, și vom crea o metodă de vorbire în ea:
public class Animal {

   public void speak() {

       System.out.println("Hello!");
   }
}
Deși abia am început să scriem programul, probabil că vedeți o problemă potențială: există o mulțime de animale în lume și toate „vorbesc” diferit: pisicile miaună, rațele șuieră și șerpii șuieră. Cum funcționează suprascrierea metodei - 2Scopul nostru este simplu: evitați crearea de multe metode de vorbire. În loc să creăm o metodă catSpeak() pentru miaunat, o metodă snakeSpeak() pentru șuierat etc., vrem să apelăm speak()metoda și pune șarpele să șuiera, pisica miau și câinele să latre. Putem realiza cu ușurință acest lucru folosind suprascrierea metodei. Wikipedia oferă următoarea explicație a termenului „supraveghere”: Suprascrierea metodei, în programarea orientată pe obiecte, este o caracteristică a limbajului care permite unei subclase sau clase copil să ofere o implementare specifică a unei metode care este deja furnizată de una dintre superclasele sale sau clasele parentale Acest lucru este în esență corect. Suprascrierea metodei vă permite să luați o metodă din clasa părinte și să scrieți propria implementare în fiecare clasă copil. Noua implementare „înlocuiește” implementarea părintelui în clasa copil. Să vedem cum arată într-un exemplu. Creați 4 clase care moștenesc clasa noastră 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!");
   }
}
„Iată un mic truc de viață pentru viitor: pentru a suprascrie metodele clasei părinte, accesați codul clasei copil în IntelliJ IDE, faceți clic pe Ctrl+O și alegeți „Înlocuire metode...” în meniu. Obișnuiți-vă să utilizați tastele rapide de la început — vă va ajuta să scrieți programe mai repede! Pentru a specifica comportamentul de care avem nevoie, am făcut câteva lucruri:
  1. În fiecare clasă copil, am creat o metodă cu același nume ca metoda clasei părinte.

  2. Am spus compilatorului că numirea metodei la fel ca în clasa părinte nu a fost întâmplătoare: vrem să-i suprascriem comportamentul. Pentru a comunica acest lucru compilatorului, setăm adnotarea @Override deasupra metodei.
    Când este plasată deasupra unei metode, adnotarea @Override informează compilatorul (precum și programatorii care vă citesc codul): „Totul este în regulă. Aceasta nu este o greșeală. Nu sunt uituc. Sunt conștient că o astfel de metodă există deja și vreau să o suprascriu'.

  3. Am scris implementarea de care avem nevoie pentru fiecare clasă de copil. Când este apelată metoda speak() , un șarpe ar trebui să șuiera, un urs ar trebui să mârâie etc.
Să vedem cum funcționează asta într-un program:
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();
   }
}
Ieșire din consolă:
Woof!
Meow!
Growl!
Hiss!
Excelent! Totul funcționează așa cum trebuie! Am creat 4 variabile de referință care stochează obiecte ale clasei părinte Animal și le-am atribuit instanțe a 4 clase de copii diferite. Ca urmare, fiecare obiect își manifestă propriul comportament. Pentru fiecare clasă copil, metoda suprascrisă speak() a înlocuit metoda „native” speak() în clasa Animal (care afișează pur și simplu „Hello!”). Cum funcționează suprascrierea metodei - 3Suprascrierea are mai multe limitări:
  1. Metoda suprascrisă trebuie să aibă aceiași parametri ca metoda părinte.

    Dacă metoda speak a clasei părinte are un parametru String , metoda suprascrisă din clasa copil trebuie să aibă și un parametru String . În caz contrar, compilatorul va genera o eroare:

    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. Metoda suprascrisă trebuie să aibă același tip de returnare ca și metoda părinte.

    În caz contrar, vom primi o eroare de compilator:

    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. Modificatorul de acces al metodei suprascrise trebuie să fie, de asemenea, același cu metoda „originală”:

    public class Animal {
    
          public void speak() {
    
                System.out.println("Hello!");
          }
    }
    
    public class Cat extends Animal {
    
           @Override
           private void speak() {      // Error!
               System.out.println("Meow!");
           }
    }
Suprascrierea metodei în Java este o modalitate de a implementa polimorfismul (principiul OOP pe care l-am descris în ultima lecție). Aceasta înseamnă că principalul său avantaj este aceeași flexibilitate despre care am discutat anterior. Putem construi un sistem simplu și logic de clase, fiecare având un comportament specific (latră câinii, miaună pisicile), cu o interfață comună - o singură metodă speak() pentru toate, mai degrabă decât multe metode, de exemplu dogSpeak ( ) , speakCat () etc.
Comentarii
  • Popular
  • Nou
  • Vechi
Trebuie să fii conectat pentru a lăsa un comentariu
Această pagină nu are încă niciun comentariu