1. Men det er ikke alt.
Antag, at Cow
klassen har en printAll()
metode, der kalder to andre metoder. Så vil koden virke sådan:
Kode | Beskrivelse |
---|---|
|
|
|
Skærmoutput vil være:
|
Bemærk, at når printAll()
metoden i Cow
klassen kaldes på et Whale
objekt,printName
Whale
bruges klassens metodeCow
, ikke metoden i metoden.
Det vigtigste er ikke den klasse metoden er skrevet i, men snarere typen (klassen) af det objekt, som metoden kaldes på.
Kun ikke-statiske metoder kan nedarves og tilsidesættes. Statiske metoder nedarves ikke og kan derfor ikke tilsidesættes.
Sådan Whale
ser klassen ud efter anvendelse af arv og metodetilsidesættelse:
|
Sådan Whale ser klassen ud efter at have anvendt arv og metodetilsidesættelse: Vi kender ikke til nogen gammel printName metode. |
2. Typecasting
Der er en endnu mere interessant pointe her. Fordi en klasse arver alle metoder og data fra dens overordnede klasse, kan en reference til et objekt i den underordnede klasse lagres i (tildelt til) variabler, hvis type er den samme som den overordnede klasse (og forælderens overordnede osv. — helt op til klassen Object
). Eksempel:
Kode | Beskrivelse |
---|---|
|
Skærmoutput vil være:
|
|
Skærmoutput vil være:
|
|
Skærmoutput vil være:
Metoden toString() er nedarvet fra Object klassen |
Dette er en meget værdifuld ejendom: lidt senere vil du forstå, hvordan du bruger den i praksis.
3. Kald en metode på et objekt
Når en metode kaldes på en variabel, kaldes metoden faktisk på et objekt. Denne mekanisme kaldes dynamisk metodeafsendelse.
Sådan ser det ud:
Kode | Beskrivelse |
---|---|
|
Skærmoutput vil være:
|
|
Skærmoutput vil være:
|
Bemærk, at den specifikke implementering af printName()
metoden, der bliver kaldt — den i Cow
eller den i Whale
klassen — ikke bestemmes af variablens type, men af typen af objektet, som variablen refererer til.
Variablen Cow
gemmer en reference til et Whale
objekt, og den printName()
metode, der er defineret i Whale
klassen, er det, der kaldes.
Dette er ikke særlig indlysende. Husk hovedreglen:
Sættet af tilgængelige metoder til at blive kaldt på en variabel bestemmes af variablens type. Og den specifikke metodeimplementering, der bliver kaldt, bestemmes af typen/klassen af objektet, der henvises til af variablen.
Du vil støde på dette hele tiden, så jo før du husker det, jo bedre.
GO TO FULL VERSION