1. Men det är inte allt.
Anta att Cow
klassen har en printAll()
metod som anropar två andra metoder. Då kommer koden att fungera så här:
Koda | Beskrivning |
---|---|
|
|
|
Skärmutgången blir:
|
Observera att när printAll()
metoden i Cow
klassen anropas på ett Whale
objekt,printName
Whale
används klassens metodCow
, inte metoden i metoden.
Huvudsaken är inte klassen metoden är skriven i, utan snarare typen (klassen) av objektet som metoden anropas på.
Endast icke-statiska metoder kan ärvas och åsidosättas. Statiska metoder ärvs inte och kan därför inte åsidosättas.
Så här Whale
ser klassen ut efter att ha tillämpat arv och metodöverstyrning:
|
Så här Whale ser klassen ut efter att ha tillämpat arv och metodöverstyrning: Vi känner inte till någon gammal printName metod. |
2. Typecasting
Det finns en ännu mer intressant punkt här. Eftersom en klass ärver alla metoder och data från sin överordnade klass, kan en referens till ett objekt i den underordnade klassen lagras i (tilldelade) variabler vars typ är densamma som förälderklassen (och förälderns överordnade, etc. — ända upp till Object
klassen). Exempel:
Koda | Beskrivning |
---|---|
|
Skärmutgången blir:
|
|
Skärmutgången blir:
|
|
Skärmutgången blir:
Metoden toString() ärvs från Object klassen |
Detta är en mycket värdefull egenskap: lite senare kommer du att förstå hur du använder den i praktiken.
3. Anropa en metod på ett objekt
När en metod anropas på en variabel anropas metoden faktiskt på ett objekt. Denna mekanism kallas dynamisk metodsändning.
Så här ser det ut:
Koda | Beskrivning |
---|---|
|
Skärmutgången blir:
|
|
Skärmutgången blir:
|
Observera att den specifika implementeringen av printName()
metoden som anropas — den i Cow
eller den i Whale
klassen — inte bestäms av variabelns typ, utan av typen av objekt som variabeln refererar till.
Variabeln Cow
lagrar en referens till ett Whale
objekt, och printName()
metoden som definieras i Whale
klassen är vad som kallas.
Detta är inte särskilt uppenbart. Kom ihåg huvudregeln:
Uppsättningen av metoder som är tillgängliga för att anropas på en variabel bestäms av variabelns typ. Och den specifika metodimplementeringen som anropas bestäms av typen/klassen för objektet som variabeln refererar till.
Du kommer att stöta på detta hela tiden, så ju förr du kommer ihåg detta, desto bättre.
GO TO FULL VERSION