CodeGym /Java blog /Tilfældig /Metodetilsidesættelse i Java
John Squirrels
Niveau
San Francisco

Metodetilsidesættelse i Java

Udgivet i gruppen
Hej! Du bruger allerede Java-metoder og ved meget om dem. Du har sandsynligvis stået over for den situation, hvor en klasse har mange metoder med samme navn, men forskellige parametre. Du kan huske, at vi i disse tilfælde brugte metodeoverbelastning. I dag overvejer vi en anden situation. Forestil dig, at vi har en enkelt delt metode, men den skal gøre forskellige ting i forskellige klasser. Hvordan implementerer vi denne adfærd? For at forstå, lad os overveje en dyreforælderklasse , som repræsenterer dyr, og vi laver en talemetode i den:

public class Animal {

   public void speak() {

       System.out.println("Hello!");
   }
}
Selvom vi først lige er begyndt at skrive programmet, ser du sikkert et potentielt problem: Der er mange dyr i verden, og de 'taler' alle forskelligt: ​​katte miaver, ænder kvaksalver og slanger hvæser. Sådan fungerer metodetilsidesættelse - 2Vores mål er enkelt: undgå at skabe masser af talemetoder. I stedet for at oprette en catSpeak() -metode til at miave, en snakeSpeak()- metode til at hvæse osv., vil vi kalde speak()metode og få slangen til at hvæse, katten miave og hunden gø. Det kan vi nemt opnå ved at bruge metodetilsidesættelse. Wikipedia giver følgende forklaring på begrebet 'tilsidesættende': Metodetilsidesættelse, i objektorienteret programmering, er en sprogfunktion, der tillader en underklasse eller underklasse at levere en specifik implementering af en metode, der allerede er leveret af en af ​​dens superklasser eller forældreklasser Det er i det væsentlige korrekt. Metodetilsidesættelse giver dig mulighed for at tage en metode fra forældreklassen og skrive din egen implementering i hver underordnede klasse. Den nye implementering 'erstatter' forældrenes implementering i børneklassen. Lad os se, hvordan dette ser ud i et eksempel. Opret 4 klasser, der arver vores dyreklasse :

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!");
   }
}
"Her er et lille lifehack for fremtiden: for at tilsidesætte forældreklassens metoder, gå til børneklassens kode i IntelliJ IDE, klik på Ctrl+O og vælg "Tilsidesæt metoder..." i menuen. Væn dig til at bruge genvejstaster fra starten – det vil hjælpe dig med at skrive programmer hurtigere! For at specificere den adfærd, vi har brug for, gjorde vi et par ting:
  1. I hver underordnede klasse lavede vi en metode med samme navn som forældreklassens metode.

  2. Vi fortalte compileren, at det ikke var tilfældet at navngive metoden på samme måde som i forældreklassen: vi vil tilsidesætte dens adfærd. For at kommunikere dette til compileren sætter vi @Override-annotationen over metoden.
    Når den placeres over en metode, informerer @Override-annotationen compileren (såvel som programmører, der læser din kode): 'Alt er okay. Dette er ikke en fejl. Jeg er ikke glemsom. Jeg er klar over, at sådan en metode allerede findes, og jeg vil gerne tilsidesætte den«.

  3. Vi skrev den implementering, vi skal bruge for hver børneklasse. Når speak()- metoden kaldes, skal en slange hvæse, en bjørn knurre osv.
Lad os se, hvordan det fungerer i et 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();
   }
}
Konsoludgang:
Woof!
Meow!
Growl!
Hiss!
Fremragende! Alt fungerer som det skal! Vi oprettede 4 referencevariabler, der gemmer objekter fra dyrenes overordnede klasse, og vi tildelte forekomster af 4 forskellige underordnede klasser til dem. Som et resultat udviser hvert objekt sin egen adfærd. For hver underordnede klasse erstattede den tilsidesatte speak() metode metoden 'native' speak() i Animal- klassen (som blot viser 'Hej!'). Sådan fungerer metodetilsidesættelse - 3Tilsidesættelse har flere begrænsninger:
  1. Den tilsidesatte metode skal have de samme parametre som den overordnede metode.

    Hvis den overordnede klasses speak- metode har en String- parameter, skal den overstyrede metode i den underordnede klasse også have en String- parameter. Ellers vil compileren generere en fejl:

    
    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. Den tilsidesatte metode skal have samme returtype som den overordnede metode.

    Ellers får vi en kompileringsfejl:

    
    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. Adgangsmodifikatoren på den tilsidesatte metode skal også være den samme som den "originale" metode:

    
    public class Animal {
    	
          public void speak() {
    	
                System.out.println("Hello!");
          }
    }
    
    public class Cat extends Animal {
    
           @Override
           private void speak() {      // Error!
               System.out.println("Meow!");
           }
    }
    
Metodetilsidesættelse i Java er en måde at implementere polymorfi på (princippet om OOP, som vi beskrev i sidste lektion). Dette betyder, at dens største fordel er den samme fleksibilitet, som vi diskuterede tidligere. Vi kan bygge et enkelt og logisk system af klasser, som hver har en specifik adfærd (hunde gøer, katte miaver), med en fælles grænseflade - en enkelt speak()-metode for dem alle i stedet for masser af metoder, f.eks. dogSpeak ( ) , speakCat () osv.
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION