
Animal
förÀldraklassen, som representerar djur, och skapa en speak
metod 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: 
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 Animal
klass:
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:
- I varje descendant-klass skapade vi en metod med samma namn som metoden i den överordnade klassen.
-
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 . - 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.
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 Animal
klassen (som helt enkelt visar "Speaking: " pÄ konsolen). 
-
En Äsidosatt metod mÄste ha samma argument som metoden i den överordnade klassen.
Om
speak
metoden för den överordnade klassen tar aString
som indata, mÄste den Äsidosatta metoden i den efterkommande klassen ocksÄ ta aString
som 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!"); } }
-
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!"; } }
-
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!"); } }
speak()
metod för alla snarare Àn en massa olika metoder, t.ex. , bark()
, meow()
etc.
GO TO FULL VERSION