1. Maar dat is niet alles.
Stel dat de Cow
klasse een methode heeft printAll()
die twee andere methoden aanroept. Dan werkt de code als volgt:
Code | Beschrijving |
---|---|
|
|
|
De schermuitvoer is:
|
Merk op dat wanneer de printAll()
methode in de Cow
klasse wordt aangeroepen op een Whale
object, de printName
methode van deWhale
klasse wordt gebruikt, niet die in de Cow
methode.
Het belangrijkste is niet de klasse waarin de methode is geschreven, maar eerder het type (klasse) van het object waarop de methode wordt aangeroepen.
Alleen niet-statische methoden kunnen worden overgenomen en overschreven. Statische methoden worden niet overgeërfd en kunnen daarom niet worden overschreven.
Zo Whale
ziet de klasse eruit na het toepassen van overerving en methode-overheersing:
|
Zo Whale ziet de klasse eruit na het toepassen van overerving en methode-overheersing: We kennen geen enkele oude printName methode. |
2. Typecasten
Er is hier een nog interessanter punt. Omdat een klasse alle methoden en gegevens van zijn bovenliggende klasse overerft, kan een verwijzing naar een object van de onderliggende klasse worden opgeslagen in (toegewezen aan) variabelen waarvan het type hetzelfde is als de bovenliggende klasse (en de bovenliggende klasse, enz. ) tot in de Object
klas). Voorbeeld:
Code | Beschrijving |
---|---|
|
De schermuitvoer is:
|
|
De schermuitvoer is:
|
|
De schermuitvoer is:
De toString() methode wordt geërfd van de Object klasse |
Dit is een zeer waardevolle eigenschap: even later zul je begrijpen hoe je het in de praktijk kunt gebruiken.
3. Een methode aanroepen op een object
Wanneer een methode wordt aangeroepen op een variabele, wordt de methode eigenlijk aangeroepen op een object. Dit mechanisme wordt dynamische methodeverzending genoemd.
Zo ziet het eruit:
Code | Beschrijving |
---|---|
|
De schermuitvoer is:
|
|
De schermuitvoer is:
|
Merk op dat de specifieke implementatie van de printName()
methode die wordt aangeroepen - die in de Cow
of die in de Whale
klasse - niet wordt bepaald door het type van de variabele, maar door het type object waarnaar de variabele verwijst.
De Cow
variabele slaat een verwijzing naar een Whale
object op en de printName()
methode die in de Whale
klasse is gedefinieerd, wordt genoemd.
Dit is niet erg duidelijk. Onthoud de hoofdregel:
De set methoden die beschikbaar zijn om op een variabele te worden aangeroepen, wordt bepaald door het type van de variabele. En de specifieke methode-implementatie die wordt aangeroepen, wordt bepaald door het type/de klasse van het object waarnaar de variabele verwijst.
Je zult dit de hele tijd tegenkomen, dus hoe eerder je dit onthoudt, hoe beter.
GO TO FULL VERSION