Pourquoi le code ci-dessous imprime "MAIN"?
public class Main { public static void method() { System.out.println("Main"); } public static void main(String[] args) { Main m = new SubMain(); m.method(); } } class SubMain extends Main { public static void method() { System.out.println("SubMain"); } }
5 Réponses :
Les méthodes statiques sont résolues sur le type de compilation de la variable. Si vous le modifiez à m code> est de type
principal code>, donc la méthode dans
principale code> est appelée. p>
SUMINAIN M ... CODE>, la méthode sur
SUMINAIN code> sera appelée. P>
En plus de cette réponse, je vous recommande de ne pas appeler des méthodes statiques à partir d'un objet d'instance et appelez-les à partir du nom de la classe (ex: SubMainMain.Method () plutôt que m.Method ()).
C'est pourquoi Java vous avertit lorsque vous essayez d'invoquer une méthode statique sur un objet d'instance.
@Ricfitting Java ne vous avertit pas mais votre IDE peut vous avertir.
Eclipse me donne ce type d'avertissement lorsque j'essaie de faire ce genre de chose: p>
La méthode statique XXX () à partir du type XXX doit être accessible de manière statique p> blockQuote>
Les méthodes statiques ne participent pas à l'héritage. La variable est de type
principale code>, de sorte que le compilateur a résolu votre appel de fonction sur
main.method () code>. P>.
Pour plus de plaisir, essayez de paramétrer
m code> à
null code>. p>
C'est parce que les méthodes statiques ne sont pas polymorphes. De plus, la méthode statique doit être invoquée non par objet, mais à l'aide de la classe, c'est-à-dire Si vous voulez profiter du polymorphisme, n'utilisez pas de méthodes statiques. P> submain.method () code>.
Lorsque vous appelez
m.method () code> java appelle en réalité
main.method () code> parce que m est de type principal. P>
Java effectue une liaison anticipée pour des méthodes statiques, contrairement aux méthodes d'instance liées de manière dynamique. P>
Parce que votre variable d'objet est de type principal, l'appel est lié à la mise en œuvre de la superclasse lors de la compilation. P>
Une bonne explication est disponible ici a>. p>
Les méthodes statiques sont statiquement liées à leur nom de classe car M est le type de classe principale puis après la compilation, cela ressemblerait comme suit Main.Method (); Après la compilation de votre classe Exécutez la commande suivante Javap -c Main vous pouvez voir le code d'assemblage JVM pour la classe principale et tu verrais la suite M.Method // invoque statique invoquer static, invocation SPÉCIALE dit que la liaison statique INVOKE SPÉCIALE, INVOKE Interface indique cette liaison dynamique p>
Vous pouvez même écrire
MAIN M = NULL; code> puis appelez la méthode, l'expression avant que le point ne soit pas utilisé du tout.
Et si nous n'avions pas de méthode remplacée dans la sous-classe "SUMINAINE" et utilisez SUMINAIN M = Nouveau SUMENMAIN (); M.Method ();