class Dad { private static final String me = "dad"; protected String getMe() { return me; } protected void printMe() { System.out.println(getMe()); } } class Son extends Dad { private static final String me = "son"; protected String getMe() { return me; } class Test { public static void main(String[] args) { Son son = new Son(); son.printMe(); } }
4 Réponses :
Dans le premier cas, son.printMe ()
appelle printMe ()
de Son
(depuis Son
remplace cette méthode), qui appelle getMe ()
de Dad
(puisque Son
n'a pas remplacé cette méthode), qui renvoie "papa" .
Dans le second cas, son.printMe ()
appelle le printMe ()
de Papa
(depuis Son
n'a pas remplacé cette méthode), qui appelle getMe ()
de Son
, car Son
remplace cette méthode. Par conséquent, "son" est imprimé.
@ harp1814 c'est correct (sauf si la méthode de l'ancêtre est inaccessible à la classe enfant (par exemple, si elle est privée), auquel cas elle ne peut pas être directement appelée par le code de la classe enfant).
Mais les méthodes sont protégées, cela signifie que l'enfant peut voir la méthode de cet ancêtre.
Dans le deuxième scénario, vous appelez Dad # printMe
, qui, à son tour, appelle getMe
. Puisque Son
le remplace, Son # getMe
est appelé. Cette méthode renvoie "Son", qui est ensuite imprimé par printMe
.
Vous surchargez la même méthode avec la classe tge diff mais les paramètres sont les mêmes pour cette méthode principale tge qui appelle la méthode son
Cas 2:
son.printMe ()
appellera la classe Dad
printMe ()
comme ce n'est pas toujours le cas dans la classe Son
. Maintenant, il recherchera getMe ()
dans la classe d'implémentation la plus proche de l'hérarchie, c'est-à-dire la classe Son
. Maintenant, Son # getMe ()
recherchera la variable me
dans cette classe d'implémentation, et trouvera avec la valeur "son"
, ainsi est imprimé . Gardez à l'esprit que private static final String me = "papa";
et private static final String me = "son";
sont deux variables privées différentes appartenant à deux classes différentes. S'il n'y avait pas eu de définition de la variable me
dans la classe Son
, vous auriez eu une erreur de compilation.