Exercice JAVA masquage (shadowing) et héritage
Rédigé par GC Team, Publié le 18 Août 2010, Mise à jour le Samedi, 17 Décembre 2022 17:57
Indiquer l'affichage du programme. Attention aux situations de masquage.
Masquage (Shadowing), Héritage
Alphabet.java
Vous trouverez ci-dessous le programme Alphabet qui implémente la hiérarchie de 3 classes (A, B et C). Indiquez l'affichage du programme (sans l'exécuter). Attention aux situations de shadowing.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
class Alphabet { public static void main(String args[]) { A[] as = new A[3]; as[0] = new A(1); as[1] = new B(2); as[2] = new C(3); for (int i = 0; i < as.length; i++) { as[i].afficherClasse(); System.out.println("-----"); } for (int i = 0; i < as.length; i++) { as[i].afficherVariables(); System.out.println("-----"); } } } class A { protected int a = 5; public A(int a) { this.a = a; } public void afficherClasse() { System.out.println("Classe A"); } public void afficherVariables() { System.out.println("a = " + a); } } class B extends A { protected int b = 6; public B(int b) { super(2 * b); a = b; } public void afficherClasse() { super.afficherClasse(); System.out.println("Classe B"); } public void afficherVariables() { super.afficherVariables(); System.out.println("b = " + b); } } class C extends B { protected int b = 7; protected int c = 8; public C(int c) { super(3 * c); b = c; } public void afficherClasse() { super.afficherClasse(); System.out.println("Classe C"); } public void afficherVariables() { super.afficherVariables(); System.out.println("c = " + c); } } |
L'affichage correct et donné ci-dessous.
Classe A ----- Classe A Classe B ----- Classe A Classe B Classe C ----- a = 1 ----- a = 2 b = 6 ----- a = 9 b = 6 c = 8
La difficulté principale réside dans l'affichage du dernier objet (de type C).
Pourquoi l'attribut b vaut-il 6 et non pas 3 ?
Réponse : à cause du masquage. En effet, si on observe la hiérarchie de classes donnée, on peut remarquer qu'un objet de type C possède en fait deux attributs b : l'un hérité de B et l'autre redéfini dans C (qui masque le premier).
Lorsque la méthode afficherVariables va être invoquée sur l'objet de type C, elle va appeler la méthode afficherVariables de la super-classe (B). Cette dernière va afficher l'attribut b de la super-classe, qui vaut 6.
Pour bien comprendre la nuance, remplacez la méthode afficherVariables de la classe C par la suivante :
public void afficherVariables() {
super.afficherVariables();
System.out.println("b (masquant) = " + b);
System.out.println("c = " + c);
}
|
Ré-exécutez le programme. L'affichage devrait alors être le suivant:
Classe A ----- Classe A Classe B ----- Classe A Classe B Classe C ----- a = 1 ----- a = 2 b = 6 ----- a = 9 b = 6 b (masquant) = 3 c = 8 -----
