1. Men det er ikke alt.
Anta at Cow
klassen har en printAll()
metode som kaller to andre metoder. Da vil koden fungere slik:
Kode | Beskrivelse |
---|---|
|
|
|
Skjermutgangen vil være:
|
Merk at når printAll()
metoden i Cow
klassen kalles på et Whale
objekt,printName
Whale
brukes metoden til klassenCow
, ikke den i metoden.
Det viktigste er ikke klassen metoden er skrevet i, men snarere typen (klassen) til objektet som metoden kalles på.
Bare ikke-statiske metoder kan arves og overstyres. Statiske metoder er ikke arvet og kan derfor ikke overstyres.
Slik Whale
ser klassen ut etter å ha brukt arv og metodeoverstyring:
|
Slik Whale ser klassen ut etter å ha brukt arv og metodeoverstyring: Vi vet ikke om noen gammel printName metode. |
2. Typecasting
Det er et enda mer interessant poeng her. Fordi en klasse arver alle metodene og dataene til den overordnede klassen, kan en referanse til et objekt i den underordnede klassen lagres i (tilordnet til) variabler hvis type er den samme som den overordnede klassen (og den overordnede klassen, etc. — helt opp til Object
klassen). Eksempel:
Kode | Beskrivelse |
---|---|
|
Skjermutgangen vil være:
|
|
Skjermutgangen vil være:
|
|
Skjermutgangen vil være:
Metoden toString() er arvet fra Object klassen |
Dette er en veldig verdifull eiendom: litt senere vil du forstå hvordan du bruker den i praksis.
3. Kalle en metode på et objekt
Når en metode kalles på en variabel, kalles metoden faktisk på et objekt. Denne mekanismen kalles dynamisk metodeutsendelse.
Slik ser det ut:
Kode | Beskrivelse |
---|---|
|
Skjermutgangen vil være:
|
|
Skjermutgangen vil være:
|
Merk at den spesifikke implementeringen av printName()
metoden som blir kalt — den i Cow
eller den i Whale
klassen — ikke bestemmes av variabelens type, men av typen objekt som variabelen refererer til.
Variabelen Cow
lagrer en referanse til et Whale
objekt, og printName()
metoden som er definert i Whale
klassen er det som kalles.
Dette er ikke veldig åpenbart. Husk hovedregelen:
Settet med metoder som er tilgjengelige for å bli kalt på en variabel, bestemmes av variabelens type. Og den spesifikke metodeimplementeringen som blir kalt, bestemmes av typen/klassen til objektet som variabelen refererer til.
Du vil støte på dette hele tiden, så jo før du husker dette, jo bedre.
GO TO FULL VERSION