Ceci est une question juste par curiosité.
Je sais que lorsque nous appelons la méthode surchargée d’un object de sous-classe par la référence de sa superclasse, JVM accorde de l’importance au type d’object et non au type de référence.
Ceci est mon code simple:
class Animal { void eat() { System.out.println("Animal is eating..."); } } class Horse extends Animal { @Override void eat() { System.out.println("Horse is eating..."); } } public class PolymorphismTest { public static void main(Ssortingng...args) { Animal a=new Animal(); a.eat(); Animal h= new Horse(); h.eat(); } }
Comme prévu, je reçois le résultat:
run: Animal is eating... Horse is eating... BUILD SUCCESSFUL (total time: 0 seconds)
Ma question est la suivante: pouvons-nous utiliser la référence h pour appeler la méthode super-classe eat () et non la sous-classe? Je sais que cette question est un peu contraire aux lois du polymorphism, mais on ne sait jamais quand il sera nécessaire de le faire.
J’ai essayé de dactylographier la référence h à Animal mais pas de chance. Des idées?
class Horse extends Animal { @Override void eat() { super.eat(); } }
Non, vous devrez le faire explicitement dans la méthode super.eat()
c’est-à-dire super.eat()
).
Vous ne pouvez pas le faire en effectuant une conversion de type. Votre seule façon d’appeler la méthode de la super-classe est de l’envelopper comme l’a montré Brett Holt ou vous devez avoir un object dont le type d’exécution le plus spécifique est Animal.
En Java – Toutes les méthodes sont virtuelles et leur implémentation la plus récente est utilisée lors de l’appel de la fonction.
Pour répondre à votre question, veuillez rendre la méthode static
dans la classe Animal, puis vous obtiendrez la méthode eat de la classe Animal appelée.
static void eat(){ System.out.println("Animal is eating..."); }