1. Mais ce n'est pas tout.
Supposons que la Cow
classe ait une printAll()
méthode qui appelle deux autres méthodes. Ensuite, le code fonctionnera comme ceci :
Code | Description |
---|---|
|
|
|
La sortie d'écran sera :
|
Notez que lorsque la printAll()
méthode de la Cow
classe est appelée sur un Whale
objet, la printName
méthode de laWhale
classe est utilisée, pas celle de la Cow
méthode.
L'essentiel n'est pas la classe dans laquelle la méthode est écrite, mais plutôt le type (classe) de l'objet sur lequel la méthode est appelée.
Seules les méthodes non statiques peuvent être héritées et remplacées. Les méthodes statiques ne sont pas héritées et ne peuvent donc pas être remplacées.
Voici à quoi Whale
ressemble la classe après l'application de l'héritage et du remplacement de méthode :
|
Voici à quoi Whale ressemble la classe après l'application de l'héritage et de la substitution de méthode : Nous ne connaissons aucune ancienne printName méthode. |
2. Transtypage
Il y a un point encore plus intéressant ici. Parce qu'une classe hérite de toutes les méthodes et données de sa classe parent, une référence à un objet de la classe enfant peut être stockée dans (assignée à) des variables dont le type est le même que la classe parent (et le parent du parent, etc. — jusqu'à la Object
classe). Exemple:
Code | Description |
---|---|
|
La sortie d'écran sera :
|
|
La sortie d'écran sera :
|
|
La sortie d'écran sera :
La toString() méthode est héritée de la Object classe |
C'est une propriété très précieuse : un peu plus tard, vous comprendrez comment l'utiliser en pratique.
3. Appel d'une méthode sur un objet
Lorsqu'une méthode est appelée sur une variable, la méthode est en fait appelée sur un objet. Ce mécanisme est appelé répartition dynamique des méthodes.
Voici à quoi ça ressemble :
Code | Description |
---|---|
|
La sortie d'écran sera :
|
|
La sortie d'écran sera :
|
Notez que l'implémentation spécifique de la printName()
méthode qui est appelée — celle de Cow
ou celle de la Whale
classe — n'est pas déterminée par le type de la variable, mais par le type de l'objet auquel la variable fait référence.
La Cow
variable stocke une référence à un Whale
objet, et la printName()
méthode définie dans la Whale
classe est ce qui est appelé.
Ce n'est pas très évident. Rappelez-vous la règle principale :
L'ensemble des méthodes disponibles pour être appelées sur une variable est déterminé par le type de la variable. Et l'implémentation de méthode spécifique qui est appelée est déterminée par le type/classe de l'objet référencé par la variable.
Vous rencontrerez cela tout le temps, donc plus tôt vous vous en souviendrez, mieux ce sera.
GO TO FULL VERSION