2
votes

Remplacement et héritage de méthode Java

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();
    }
}

0 commentaires

4 Réponses :


4
votes

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é.


2 commentaires

@ 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.



1
votes

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 .


0 commentaires

0
votes

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


0 commentaires

0
votes

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.


0 commentaires