2010-11-26 3 views
2

Salut Je suis tombé sur ce problème ce matin (je l'ai déjà trouvé un travail autour) mais je suis curieux de savoir pourquoi mon code ne fonctionne pas comme je voulaisJava boucle infinie/appels

public class classA 

    //(1) 
    public void function(GL10 gl){ 

      function(gl,useGLUtilsBool, useMipMapBool); 
     } 
    //(2) 
     public void function(GL10 gl,boolean useGLUtils, boolean 
    useMipMap){ 
      generateTexture(gl, useGLUtils, useMipMap); 
     } 
    } 

    @Override 
    public class classB extends 
    classA{ 
    //(3) 
     public void function(GL10 gl, boolean useGLUtils, boolean 
    useMipMap) { 
      function(gl); 
     } 
    //(4) 
    @Override  
    public void function(GL10 gl) { 
      super.function(gl); 

     } 

Normalement il devrait faire (3) -> (4) -> (1) -> (2) mais à la place je reçois (3) -> (4) -> (1) -> (3) -> (4) - > (1) ...

ce que je ne comprends pas pourquoi la fonction CLASSA (...) (1) appellerait (3) et non (2)

+5

Bienvenue dans le polymorphisme. –

+0

Oui j'ai joué avec le polymorphisme, je ne m'attendais pas à ça ^^ (je sais que nous n'attendons jamais de bugs, ils s'invitent) –

+0

Note: si la fonction() était statique, elle se comporterait comme vous décrire parce que vous n'obtenez pas de polymorphisme avec des méthodes statiques. –

Répondre

6

en raison de l'héritage et polymorphism. Vous avez remplacé (signalerons par @Override) la méthode function(GL10 gl, boolean useGLUtils, boolean useMipMap) dans la sous-classe, donc à chaque fois que cette méthode est appelée sur une instance de classe B, la méthode redéfinie sera appelée, au lieu de celui de la superclasse

+0

En fait j'ai juste oublié le @Override quand j'ai écrit la question –

1

Il a à faire avec une décision de conception de Java, rendant toutes les méthodes publiques virtual par défaut. Dans un langage comme C++ où vous devez explicitement déclarer des fonctions comme virtuelles, vous obtiendrez le comportement attendu avec le code ci-dessus. En Java cependant, l'appel finira toujours par passer à la méthode la plus éloignée de la chaîne d'héritage, sauf si vous utilisez le super préfixe pour le forcer à appeler une méthode plus haute.

Questions connexes