1. Ma non è tutto.
Supponiamo che la Cow
classe abbia un printAll()
metodo che chiama altri due metodi. Quindi il codice funzionerà in questo modo:
Codice | Descrizione |
---|---|
|
|
|
L'output dello schermo sarà:
|
Si noti che quando il printAll()
metodo nella Cow
classe viene chiamato su un Whale
oggetto, viene utilizzato il printName
metodo dellaWhale
classe, non quello nel Cow
metodo.
La cosa principale non è la classe in cui è scritto il metodo, ma piuttosto il tipo (classe) dell'oggetto su cui viene chiamato il metodo.
Solo i metodi non statici possono essere ereditati e sovrascritti. I metodi statici non vengono ereditati e pertanto non possono essere sovrascritti.
Ecco come Whale
appare la classe dopo aver applicato l'ereditarietà e l'override del metodo:
|
Ecco come Whale appare la classe dopo aver applicato l'ereditarietà e l'override del metodo: Non conosciamo alcun vecchio printName metodo. |
2. Tipografia
C'è un punto ancora più interessante qui. Poiché una classe eredita tutti i metodi e i dati della sua classe genitore, un riferimento a un oggetto della classe figlia può essere memorizzato in (assegnato a) variabili il cui tipo è lo stesso della classe genitore (e del genitore del genitore, ecc. — fino in Object
classe). Esempio:
Codice | Descrizione |
---|---|
|
L'output dello schermo sarà:
|
|
L'output dello schermo sarà:
|
|
L'output dello schermo sarà:
Il toString() metodo è ereditato dalla Object classe |
Questa è una proprietà molto preziosa: poco dopo capirai come usarla nella pratica.
3. Chiamare un metodo su un oggetto
Quando un metodo viene chiamato su una variabile, il metodo viene effettivamente chiamato su un oggetto. Questo meccanismo è chiamato invio di metodi dinamici.
Ecco come appare:
Codice | Descrizione |
---|---|
|
L'output dello schermo sarà:
|
|
L'output dello schermo sarà:
|
Si noti che l'implementazione specifica del printName()
metodo che viene chiamato — quello in Cow
o quello nella Whale
classe — non è determinata dal tipo della variabile, ma dal tipo dell'oggetto a cui fa riferimento la variabile.
La Cow
variabile memorizza un riferimento a un Whale
oggetto e il printName()
metodo definito nella Whale
classe è ciò che viene chiamato.
Questo non è molto ovvio. Ricorda la regola principale:
L'insieme di metodi disponibili per essere chiamati su una variabile è determinato dal tipo della variabile. E l'implementazione specifica del metodo che viene chiamata è determinata dal tipo/classe dell'oggetto a cui fa riferimento la variabile.
Lo incontrerai sempre, quindi prima lo ricordi, meglio è.
GO TO FULL VERSION