J'ai besoin d'un moyen de choisir la méthode à appeler.
J'appelle une méthode parente qui appelle l'une de ses méthodes en utilisant "this". Le problème est que je remplace cette méthode dans ma classe, donc lorsque j'appelle la méthode parente, elle appelle ma méthode au lieu de sa méthode.
public class MainTest { public static class A { public String m1() { return this.m2(); } public String m2() { return "A.m2() called"; } } public static class B extends A { @Override public String m1() { return "B.m1() called"; } @Override public String m2() { return "B.m2() called"; } public String m3() { return super.m1(); } } public static void main(String[] args) { System.out.println(new B().m3()); } }
Je veux atteindre "A. m2 () appelé ", mais le résultat réel est" B.m2 () appelé "
3 Réponses :
vous pouvez voir le processus suivant:
-B.m3 fait super.m1 ce qui signifie A.m1
-A.m1 fait ceci.m2, où c'est B, pour cette raison B.m2 est appelé
«Après avoir supprimé le mot clé static», il est tout à fait approprié (et conseillé) de rendre les classes imbriquées statiques si elles n'ont pas besoin de faire référence à une instance de la classe englobante.
la question a été modifiée entre-temps, avant que vous ne puissiez voir que les classes sont imbriquées. J'ai aussi mis à jour ma réponse
Pour réaliser ce que vous voulez, vous devez appeler super.m2 ()
dans B.m3
.
L'appel de super.m1 ()
ne fonctionnerait pas car A.m1
appelle this.m2 ()
. ce
est de type d'exécution B
(vous n'avez jamais créé d'objet A
donc il ne peut pas être de type d'exécution A code>), donc le
m2
dans B
serait appelé. Vous ne pouvez appeler super.m2 ()
que pour obtenir ce que vous voulez.
Comme vous avez remplacé m2 ()
dans B
, alors seul moyen de faire exécuter A.m2 ()
au lieu de B.m2 ()
consiste à appeler super.m2 ()
à l'intérieur de B.m2()
.
Même si vous appelez super.m1 ();
dans B.m3 ()
, l'appel à this.m2 ()
dans A.m1 ()
provoquera toujours l'exécution du B.m2 ()
écrasé.
Si vous ne voulez pas avoir super. m2 ()
à l'intérieur de B.m2 ()
(ou ne le souhaite pas dans tous les cas), alors la seule alternative est de créer une méthode différente que vous ne remplacez pas dans B (et appelez-le depuis A.m1 ()
- vous devrez peut-être changer ou créer un autre A.m1 ()
également): p>
public static class A { public String m1(){ //you may need a different method to call from B.m3() return this.anotherM2(); } public String m2(){ return "A.m2() called"; } public String anotherM2() { return "A.m2() called"; } }
Vous pouvez, bien sûr, appeler anotherM2 ()
dans m2 ()
, pour éviter de vous répéter.
pourquoi utilisez-vous des classes statiques?
Dans quelle classe est votre méthode principale? et pourquoi vos deux classes sont statiques?
Ce sont probablement des classes imbriquées dans une autre classe. Quoi qu'il en soit, vous ne pouvez pas faire cela, sauf si vous créez une méthode dans
B
qui appellesuper.m2 ()
. Sinon, cela irait à l'encontre de l'intérêt des méthodes prioritaires.