
Animal
forældreklassen, som repræsenterer dyr, og skabe en speak
metode i den:
public class Animal {
public void speak() {
System.out.println("Hello!");
}
}
Selvom vi lige er begyndt at skrive vores program, kan du sikkert se et potentielt problem: Verden er fuld af masser af dyr, og de "taler" alle forskelligt: katte miaver, ænder kvaksalver, slanger hvæser osv. Vores mål er enkelt: 
meow()
metode til at mjave, hiss()
til hvæsende osv., ønsker vi, at slangen hvæser, katten mjaver, og hunden gøer, når metoden speak()
kaldes. Vi kan nemt opnå dette ved at bruge metodetilsidesættelse . Wikipedia forklarer udtrykket som følger: Metode tilsidesætter, 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 overordnede klasser. Det er grundlæggende rigtigt. Tilsidesættelse giver dig mulighed for at tage en metode fra en overordnet klasse og skrive din egen implementering i hver afledt klasse. Den nye implementering i børneklassen "erstatter" den i forælderen. Lad os se, hvordan det ser ud med et eksempel. Lad os skabe 4 efterkommere af vores Animal
klasse:
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 metoderne for en overordnet klasse, gå ind i koden for den afledte klasse i IntelliJ IDE , tryk på Ctrl+O og vælg Tilsidesæt metoder... fra menuen. Væn dig til at bruge genvejstaster fra starten. De vil fremskynde kodning! For at få den ønskede adfærd gjorde vi et par ting:
- I hver efterkommerklasse oprettede vi en metode med samme navn som metoden i den overordnede klasse.
-
Vi fortalte compileren, at vi ikke bare giver metoden det samme navn som i den overordnede klasse, men snarere vil vi tilsidesætte dens adfærd. Denne "besked" til compileren formidles via @Override- annotationen.
@Override-annotationen over en metode fortæller compileren (såvel som andre programmører, der læser din kode), "Bare rolig. Dette er ikke en fejl eller forglemmelse. Jeg er klar over, at denne metode allerede eksisterer, og jeg vil gerne tilsidesætte den. . - Vi skrev den implementering, vi skal bruge for hver efterkommerklasse. Når
speak()
metoden kaldes, skal en slange hvæse, en bjørn knurre og så videre.
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!
Super, alt fungerer som det skal! Vi oprettede 4 referencevariabler, hvis type er den Animal
overordnede klasse, og tildelte dem 4 forskellige objekter af efterkommerklasserne. Som et resultat opfører hvert objekt sig forskelligt. For hver af de afledte klasser erstatter den tilsidesatte metode klassens speak()
eksisterende metode (som blot viser "Speaking: " på konsollen). Metodetilsidesættelse har flere begrænsninger: speak()
Animal

-
En tilsidesat metode skal have de samme argumenter som metoden i den overordnede klasse.
Hvis
speak
metoden for den overordnede klasse tager aString
som input, så skal den overstyrede metode i efterkommerklassen også tage aString
som input. Ellers vil compileren generere en fejl: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 tilsidesatte metode skal have samme returtype som metoden i den overordnede klasse.
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!"; } }
-
Den tilsidesatte metodes adgangsmodifikator kan heller ikke adskille sig fra den originale:
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()
metode for alle i stedet for en masse forskellige metoder, f.eks bark()
. meow()
, osv.
GO TO FULL VERSION