1. Pero eso no es todo.
Supongamos que la Cow
clase tiene un printAll()
método que llama a otros dos métodos. Entonces el código funcionará así:
Código | Descripción |
---|---|
|
|
|
La salida de pantalla será:
|
Tenga en cuenta que cuando se llama al printAll()
método de la clase en un objeto, se usa el método de la clase, no el del método.Cow
Whale
printName
Whale
Cow
Lo principal no es la clase en la que está escrito el método, sino el tipo (clase) del objeto en el que se llama al método.
Solo los métodos no estáticos se pueden heredar y anular. Los métodos estáticos no se heredan y, por lo tanto, no se pueden anular.
Así es como Whale
se ve la clase después de aplicar la herencia y la anulación de métodos:
|
Así es como Whale se ve la clase después de aplicar la herencia y la anulación de métodos: No conocemos ningún printName método antiguo. |
2. Encasillamiento
Hay un punto aún más interesante aquí. Debido a que una clase hereda todos los métodos y datos de su clase principal, una referencia a un objeto de la clase secundaria puede almacenarse (asignarse a) variables cuyo tipo es el mismo que el de la clase principal (y el principal del principal, etc. ) todo el camino hasta la Object
clase). Ejemplo:
Código | Descripción |
---|---|
|
La salida de pantalla será:
|
|
La salida de pantalla será:
|
|
La salida de pantalla será:
El toString() método se hereda de la Object clase. |
Esta es una propiedad muy valiosa: un poco más adelante comprenderá cómo usarla en la práctica.
3. Llamar a un método en un objeto
Cuando se llama a un método en una variable, en realidad se llama al método en un objeto. Este mecanismo se denomina despacho de método dinámico.
Así es como se ve:
Código | Descripción |
---|---|
|
La salida de pantalla será:
|
|
La salida de pantalla será:
|
Tenga en cuenta que la implementación específica del printName()
método que se llama (el que está en Cow
o el de la Whale
clase) no está determinada por el tipo de variable, sino por el tipo de objeto al que se refiere la variable.
La Cow
variable almacena una referencia a un Whale
objeto, y el printName()
método definido en la Whale
clase es lo que se llama.
Esto no es muy obvio. Recuerda la regla principal:
El conjunto de métodos disponibles para ser llamados en una variable está determinado por el tipo de variable. Y la implementación del método específico que se llama está determinada por el tipo/clase del objeto al que hace referencia la variable.
Te encontrarás con esto todo el tiempo, así que cuanto antes lo recuerdes, mejor.