CodeGym /Kurser /All lectures for SV purposes /ï»żĂ…sidosĂ€ttande av metod

ï»żĂ…sidosĂ€ttande av metod

All lectures for SV purposes
NivÄ , Lektion
TillgÀngliga
Hej! Du anvÀnder redan Java-metoder och vet mycket om dem. Hur metodöverstyrning fungerar - 1Du har sÀkert stött pÄ en klass med mÄnga metoder som har samma namn men olika argumentlistor. Du kommer ihÄg att vi i dessa fall anvÀnde metodöverbelastning. Idag ska vi titta pÄ en annan situation. FörestÀll dig att vi har en gemensam metod, men den ska göra olika saker beroende pÄ vilken klass den kallas i. Hur implementerar vi detta beteende? För att förstÄ detta, lÄt oss ta AnimalförÀldraklassen, som representerar djur, och skapa en speakmetod i den:

public class Animal {
  
   public void speak() {

       System.out.println("Hello!");
   }
}
Även om vi precis har börjat skriva vĂ„rt program, kan du förmodligen se ett potentiellt problem: vĂ€rlden Ă€r full av massor av djur, och de "talar" alla olika: katter jamar, ankor kvackar, ormar vĂ€ser, etc. VĂ„rt mĂ„l Ă€r enkelt: Hur metodöverstyrning fungerar - 2vi vill undvika att skapa en massa metoder för att tala. IstĂ€llet för att skapa en meow()metod för att jama, hiss()för att vĂ€sa etc. vill vi att ormen ska vĂ€sa, katten jaja och hunden ska skĂ€lla nĂ€r metoden speak()kallas. Vi kan enkelt uppnĂ„ detta genom att anvĂ€nda metodöverstyrning . Wikipedia förklarar termen pĂ„ följande sĂ€tt: Metodöverskridande, i objektorienterad programmering, Ă€r en sprĂ„kfunktion som tillĂ„ter en underklass eller underklass att tillhandahĂ„lla en specifik implementering av en metod som redan tillhandahĂ„lls av en av dess superklasser eller överordnade klasser. Det Ă€r i princip korrekt. ÅsidosĂ€ttande lĂ„ter dig ta nĂ„gon metod av en överordnad klass och skriva din egen implementering i varje hĂ€rledd klass. Den nya implementeringen i barnklassen "ersĂ€tter" den i förĂ€ldern. LĂ„t oss se hur det hĂ€r ser ut med ett exempel. LĂ„t oss skapa 4 Ă€ttlingar till vĂ„r Animalklass:

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!");
   }
}
HĂ€r Ă€r ett litet lifehack för framtiden: för att Ă„sidosĂ€tta metoderna för en överordnad klass, gĂ„ in i koden för den hĂ€rledda klassen i IntelliJ IDE , tryck pĂ„ Ctrl+O och vĂ€lj ÅsidosĂ€tt metoder... frĂ„n menyn. VĂ€nj dig vid att anvĂ€nda snabbtangenter frĂ„n början. De kommer att pĂ„skynda kodningen! För att fĂ„ det önskade beteendet gjorde vi nĂ„gra saker:
  1. I varje descendant-klass skapade vi en metod med samma namn som metoden i den överordnade klassen.
  2. Vi sa till kompilatorn att vi inte bara ger metoden samma namn som i den överordnade klassen utan snarare vill vi ÄsidosÀtta dess beteende. Detta "meddelande" till kompilatorn förmedlas via @Override- kommentaren.
    @Override-kommentaren ovanför en metod sÀger till kompilatorn (liksom andra programmerare som lÀser din kod), "Oroa dig inte. Detta Àr inte ett misstag eller förbiseende. Jag Àr medveten om att den hÀr metoden redan finns och jag vill ÄsidosÀtta den .

  3. Vi skrev implementeringen vi behöver för varje efterkommande klass. NÀr speak()metoden kallas ska en orm frÀsa, en björn morra och sÄ vidare.
LĂ„t oss se hur detta fungerar i ett 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();
   }
}
KonsolutgÄng:

Woof! 
Meow! 
Growl! 
Hiss!
JĂ€ttebra, allt fungerar som det ska! Vi skapade 4 referensvariabler vars typ Ă€r den Animalöverordnade klassen, och tilldelade dem 4 olika objekt i de efterkommande klasserna. Som ett resultat beter sig varje objekt annorlunda. speak()För var och en av de hĂ€rledda klasserna ersĂ€tter den Ă„sidosatta metoden den befintliga speak()metoden för Animalklassen (som helt enkelt visar "Speaking: " pĂ„ konsolen). Hur metodöverstyrning fungerar - 3ÅsidosĂ€ttande av metod har flera begrĂ€nsningar:
  1. En Äsidosatt metod mÄste ha samma argument som metoden i den överordnade klassen.

    Om speakmetoden för den överordnade klassen tar a Stringsom indata, mÄste den Äsidosatta metoden i den efterkommande klassen ocksÄ ta a Stringsom indata. Annars kommer kompilatorn att generera ett fel:

    
    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. Den Äsidosatta metoden mÄste ha samma returtyp som metoden i den överordnade klassen.

    Annars fÄr vi ett kompileringsfel:

    
    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. Den Äsidosatta metodens Ätkomstmodifierare kan inte heller skilja sig frÄn den ursprungliga:

    
    public class Animal {
    
       public void speak() {
    
           System.out.println("Hello!");
       }
    }
    
    public class Cat extends Animal {
    
       @Override
       private void speak() {      // Error!
           System.out.println("Meow!");
       }
    }
    
I Java Àr metodöverstyrning ett sÀtt att implementera polymorfism. Det betyder att dess frÀmsta fördel Àr den flexibiliteten som vi pratade om tidigare. Vi kan bygga en enkel och logisk hierarki av klasser, var och en med specifikt beteende (skallande hundar, jamande katter) men ett enda grÀnssnitt - en enda speak()metod för alla snarare Àn en massa olika metoder, t.ex. , bark(), meow()etc.
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION