Hei! Du bruker allerede Java-metoder og vet mye om dem. Du har sannsynligvis stått overfor situasjonen der en klasse har mange metoder med samme navn, men forskjellige parametere. Du husker at i disse tilfellene brukte vi metodeoverbelastning. I dag vurderer vi en annen situasjon. Tenk deg at vi har en enkelt delt metode, men den må gjøre forskjellige ting i forskjellige klasser. Hvordan implementerer vi denne atferden? For å forstå, la oss vurdere en dyreforeldreklasse , som representerer dyr, og vi lager en talemetode i den:
Målet vårt er enkelt: unngå å lage mange talemetoder. I stedet for å lage en catSpeak()- metode for mjauing, en snakeSpeak()- metode for hvesing osv., ønsker vi å kalle speak()metoden og få slangen til å hvese, katten mjau og hunden bjeffe. Vi kan enkelt oppnå dette ved å bruke metodeoverstyring. Wikipedia gir følgende forklaring av begrepet 'overstyring': Metodeoverstyring, i objektorientert programmering, er en språkfunksjon som lar en underklasse eller barneklasse gi en spesifikk implementering av en metode som allerede er levert av en av dens superklasser eller foreldreklasser Det er i hovedsak riktig. Metodeoverstyring lar deg ta en metode fra overordnet klasse og skrive din egen implementering i hver barneklasse. Den nye implementeringen 'erstatter' foreldrenes implementering i barneklassen. La oss se hvordan dette ser ut i et eksempel. Lag 4 klasser som arver dyreklassen vår :
Overstyring har flere begrensninger:
public class Animal {
public void speak() {
System.out.println("Hello!");
}
}
Selv om vi nettopp har begynt å skrive programmet, ser du sannsynligvis et potensielt problem: det er mange dyr i verden, og de "snakker" alle annerledes: katter mjauer, ender kvaksalver og slanger hveser. 
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 lite livhack for fremtiden: for å overstyre foreldreklassens metoder, gå til barneklassens kode i IntelliJ IDE, klikk Ctrl+O, og velg "Overstyr metoder..." i menyen. Bli vant til å bruke hurtigtaster fra begynnelsen — det vil hjelpe deg å skrive programmer raskere! For å spesifisere atferden vi trenger, gjorde vi et par ting:
- I hver barneklasse laget vi en metode med samme navn som overordnet klasses metode.
- Vi fortalte kompilatoren at det ikke var en tilfeldighet å navngi metoden på samme måte som i foreldreklassen: vi vil overstyre oppførselen. For å kommunisere dette til kompilatoren setter vi @Override-kommentaren over metoden.
Når den plasseres over en metode, informerer @Override-kommentaren kompilatoren (så vel som programmerere som leser koden din): 'Alt er i orden. Dette er ikke en feil. Jeg er ikke glemsom. Jeg er klar over at en slik metode allerede eksisterer, og jeg ønsker å overstyre den. - Vi skrev implementeringen vi trenger for hver barneklasse. Når speak()- metoden kalles, skal en slange hvese, en bjørn skal knurre osv.
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();
}
}
Konsoll utgang:
Woof!
Meow!
Growl!
Hiss!
Utmerket! Alt fungerer som det skal! Vi opprettet 4 referansevariabler som lagrer objekter fra dyrenes overordnede klasse, og vi tildelte forekomster av 4 forskjellige barneklasser til dem. Som et resultat viser hvert objekt sin egen oppførsel. For hver barneklasse erstattet den overstyrte speak() -metoden 'native' speak()- metoden i Animal- klassen (som ganske enkelt viser 'Hei!'). 
-
Den overstyrte metoden må ha samme parametere som den overordnede metoden.
Hvis den overordnede klassens speak- metode har en String- parameter, må den overstyrte metoden i barneklassen også ha en String- parameter. Ellers vil kompilatoren generere en feil:
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!"); } }
-
Den overstyrte metoden må ha samme returtype som den overordnede metoden.
Ellers får vi en kompilatorfeil:
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!"; } }
-
Tilgangsmodifikatoren på den overstyrte metoden må også være den samme som den "originale" metoden:
public class Animal { public void speak() { System.out.println("Hello!"); } } public class Cat extends Animal { @Override private void speak() { // Error! System.out.println("Meow!"); } }
GO TO FULL VERSION