1. Dar asta nu este tot.
Să presupunem că Cow
clasa are o printAll()
metodă care apelează alte două metode. Apoi codul va funcționa astfel:
Cod | Descriere |
---|---|
|
|
|
Ieșirea ecranului va fi:
|
Rețineți că atunci când printAll()
metoda din Cow
clasă este apelată pe un Whale
obiect, se folosește printName
metoda claseiWhale
, nu cea din Cow
metodă.
Principalul lucru nu este clasa în care este scrisă metoda, ci mai degrabă tipul (clasa) obiectului pe care este apelată metoda.
Numai metodele non-statice pot fi moștenite și suprascrise. Metodele statice nu sunt moștenite și, prin urmare, nu pot fi suprascrise.
Iată cum Whale
arată clasa după aplicarea moștenirii și suprascrierii metodei:
|
Iată cum Whale arată clasa după aplicarea moștenirii și suprascrierii metodei: Nu știm despre vreo printName metodă veche. |
2. Typecasting
Există un punct și mai interesant aici. Deoarece o clasă moștenește toate metodele și datele clasei sale părinte, o referință la un obiect al clasei copil poate fi stocată în (alocate) variabile al căror tip este același cu clasa părinte (și părintele părinte, etc. — tot drumul până la Object
clasă). Exemplu:
Cod | Descriere |
---|---|
|
Ieșirea ecranului va fi:
|
|
Ieșirea ecranului va fi:
|
|
Ieșirea ecranului va fi:
Metoda toString() este moștenită din Object clasă |
Aceasta este o proprietate foarte valoroasă: puțin mai târziu vei înțelege cum să o folosești în practică.
3. Apelarea unei metode pe un obiect
When a method is called on a variable, the method is actually called on an object. This mechanism is called dynamic method dispatch.
Here's how it looks:
Code | Description |
---|---|
|
The screen output will be:
|
|
The screen output will be:
|
Note that the specific implementation of the printName()
method that gets called — the one in the Cow
or the one in the Whale
class — is not determined by the variable's type, but by the type of the object that the variable refers to.
The Cow
variable stores a reference to a Whale
object, and the printName()
method defined in the Whale
class is what is called.
This is not very obvious. Remember the main rule:
The set of methods available to be called on a variable is determined by the variable's type. And the specific method implementation that gets called is determined by the type/class of the object referred to by the variable.
You'll encounter this all the time, so the sooner you remember this, the better.
GO TO FULL VERSION