é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 être
A2 = nouveau B (); code>?
Je viens d'exécuter votre code et réellement qui retourne
2 code>, pas
3 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.