La super classe à ne pas appeler la méthode de remplacement?
J'ai les classes suivantes:
class foo {
public void a() {
print("a");
}
public void b() {
a();
}
}
class bar extends foo {
public void a() {
print("overwritten a");
}
}
Quand je vais maintenant appeler le bar.b (en) je tiens à appeler la méthode de remplacement d'un() dans foo. Il ne, cependant, d'imprimer "un".
- Pardon de la didactique: Il s'appelle "substitution", pas "écraser".
- Le code que vous avez écrit, il doit travailler comme vous l'espérez, comme beaucoup d'entre les réponses ci-dessous suggèrent à obtenir le résultat que vous obtenez, vous devez être en train de faire quelque chose d'autre dans votre code que vous ne présentez pas ici.
Vous devez vous connecter pour publier un commentaire.
Sont vos deux classes dans différents packages? Et est votre classe foo méthodes déclarées public, protégé ou privé ou forfait local? Évidemment, si ils sont privés, cela ne fonctionnera pas. Peut-être moins évident, c'est que si ils sont forfait local (c'est à dire pas de public/protected/private portée) alors vous ne pouvez ignorer si vous êtes dans le même package que la classe d'origine.
Par exemple:
Dans ce cas, vous aurez toujours une "Une". Si vous déclarez l'origine d'un() la méthode Foo public ou protégé, vous obtiendrez le résultat que vous attendiez.
Il se peut que vous essayez d'utiliser des méthodes statiques, qui ne fonctionnent pas comme ils ne reçoivent pas remplacée.
Un bon moyen de vérifier est d'ajouter de la @Override annotation à la barre.un() et voir si le compilateur vous donne une erreur (d'un) n'est pas réellement overidding rien
Quand je lance le suivant:
J'obtiens le résultat suivant:
qui est ce que je m'attends à voir.
Sont les méthodes définies comme statique? C'est la seule façon que je pouvais voir arriver à ce résultat. J'ai trouvé une bonne explication à ce sujet ici: http://faq.javaranch.com/view?OverridingVsHiding
Vous pouvez être confus si vous venez à partir de C# ou une autre langue où vous devez déclarer explicitement les fonctions virtuelles et/ou des fonctions de remplacement.
En Java, toutes les instance fonctions sont virtuels, et peut être remplacé, à moins qu'ils sont déclarées comme privées et/ou finale.
Il n'est pas nécessaire de spécifier le nouveau @Override annotation pour ce faire, l'ajout de l'annotation juste indique que votre intention est de les remplacer, et sera la cause d'une soit d'un avertissement ou d'erreur si ce n'est pas un remplacement. (Si vous avez mal orthographié le nom de la méthode par exemple).
Andrew le montre l'exemple de la façon dont cela devrait fonctionner.
De la bouche des chevaux:
http://download.oracle.com/javase/tutorial/java/IandI/override.html
"La version de la méthode de remplacement qui est appelé est celui de la sous-classe. La version de caché méthode qui est appelé dépend si elle est appelée à partir de la super-classe ou la sous-classe".
Donc, si ils sont à la fois des méthodes statiques et d'appeler la méthode de la super-classe, puis la super-classe de la méthode est invoquée, pas la sous-classe de la méthode. Alors, vraiment, aucune tendance générale est de prendre place.
Alors que je travaillais sur un Android programme, j'ai eu le même problème sur mes classes Java. Il s'est avéré que le problème n'était pas dans les classes, mais la façon dont Android cadre des processus de sortie de l'écran.
par exemple, si la sortie a été programmée dans le onCreate() la méthode de la classe parente, Android a échoué à récupérer correctement la sortie de méthodes de remplacement de classes enfant au-delà de premier enfant. Honnêtement, je ne comprends pas toute la méthode de l'appel de la commande.
Pour résoudre le problème j'ai simplement programmé la sortie dans le onResume() et maintenant il semble fonctionner correctement.