éditer: devrait être A2 = nouveau B () em> strong>
Je ne comprends pas pourquoi le résultat pour A2.FOO (B) est 3 dans la question de la pratique suivante. Je pensais avec polymorphisme, la méthode des types dynamiques fonctionnerait avec la signature de méthode qui prend l'argument qui correspond à la statique taper. P> public class A {
public int foo(Object o) {
System.out.println(1);
return 1;
}
public int foo(A a) {
System.out.println(2);
return 2;
}
}
public class B extends A {
public int foo(A a) {
System.out.println(3);
return 3;
}
public int foo(B b) {
System.out.println(4);
return 4;
}
public static void main(String[] args) {
A a2 = new B();
B b = new B();
a2.foo(b);
}
}
3 Réponses :
Edit: Comme la question a été modifiée, la réponse est maintenant Si mais En bref, seul le type de 3 code> comme a.foo (a) code> est appelé mais remplacé. P>
A2 code> était un B code> puis la méthode remplacée serait utilisée, jamais une méthode surchargée. P>
a2 code> est un a code> et quelle classe a une méthode foo (a) code> qui peut être appelé, donc il imprime 2 code> p>
ceci code> sur le côté gauche de . code> changera le choix de la méthode appelée. P>
Vaut la peine de noter qu'il renvoie 2 code>, pas 3 code>.
@Amongalen a accepté, ça n'a pas été clair comme je l'ai écrit, merci.
Salut, désolé, A2 est en fait b ()
Etant donné que A2 code> est évidemment a code>, donc a # fio code> est exécuté. Il est possible (compile et exécute) depuis B code> est une instance de A code>. P>
A # FOO code> est exécuté, la réponse est 2 code> (non 3 code> et pas 4 code>). < / p>
Vous devez peut-être mettre à jour cela comme la question a été modifiée. C'est faux car il se trouve.
Il y a deux choses en cours ici: p>
surcharge em> est d'avoir deux méthodes différentes dans la même classe avec le même nom, mais des types d'arguments différents (ils sont donc différents). le remplacement em> et le polymorphisme consiste à avoir la même méthode unique dans deux classes différentes. P>
classes Le Alors, lorsque vous appelez a code> B code> surcharge em> la méthode code> FOO code>: ils ont deux méthodes avec le même nom. Dans a code> une méthode prend objet code> comme paramètre et on prend a code> comme paramètre. Dans B code> on prend A code> comme paramètre et on prend B code>. De ces quatre méthodes, deux sont les mêmes ( foo (a) code>). P>
foo (a) code> méthode dans B code> remplace le FOO (a) code> méthode dans A code>. La méthode foo (b) code> est une méthode différente. P>
a2.foo (b) code> Vous appelez la méthode foo (a) code>. Ça doit être, comme A2 code> est déclaré comme A code> et a code> n'a pas de a.foo (b) code >. Étant donné que a2 code> est un objet de type B code>, vous appelez b.foo (a) code> comme il remplace a.foo (A) code>. P>
En fait, cela reviendrait 2. Peut-être que vous aviez peut-être une erreur de copier la question et
a2 = nouveau A (); code> devrait êtreA2 = nouveau B (); code>?Je viens d'exécuter votre code et réellement qui retourne
2 code>, pas3 code>.hey, désolé, A2 est en fait b ()
meta.stactverflow.com/questions/317294/...
Vous avez déjà reçu des réponses sur votre question en les manipulant que vous avez invalidé toutes les réponses existantes.