Ce problème s'est présenté lorsque moi et mes amis étions en train d'étudier pour des examens. Nous avons remarqué un comportement étrange lors de l'appel d'une méthode d'une variable assignée statiquement.
Code>Mots, c'est parti :
class C {
public void a(double x) {}
}
class D extends C {
void b() {}
}
class F extends D {
void a(int i) {}
void a(double d) {}
Maintenant, faire
D foo = new F();
foo.a(1);
Qu'est-ce que cela va donner ? Eh bien la méthode fonctionne a(double) en F ! !
Voici ce que nous pensions qu'il s'était passé :
- Le programme commence par rechercher a dans le type statique D : il n'y a rien à ce niveau.
- Va dans sa super classe, C . Ne trouve pas a(int) mais trouve à la place a(double) .
- Décide que c'est la signature dont je parlais (c'est-à-dire a(double)), mais FIIRST, après toute cette recherche, regardons la page dynamique tapez d'abord, c'est écrit !
- Courses a(double) en F !
Est-ce exact ? Cela signifie qu'il escalade la hiérarchie pour trouver une méthode qui pourrait convenir si la conversion de type de int à double est faite. APRÈS cela, il vérifie si le type dynamique possède cette signature nouvellement interprétée.
J'ai remarqué que si j'ajoutais
void a(int) {}
** en classe C , cela me donnerait a(int) en F lors de l'exécution de l'invocation ci-dessus !
Quelqu'un peut-il expliquer les mécanismes de ce processus ? Pourquoi le code s'exécute-t-il/compile-t-il de cette manière ? Quelles sont les raisons techniques derrière cela ? Et y a-t-il d'autres choses dont il faut être conscient concernant des circonstances similaires ()