next up previous contents index
suivant: Accessibilité monter: Composition, abstraction, extension précédent: Finalité   Table des matières   Index


Masquage1#1

Si un champ de la classe parente est à nouveau défini, avec le même nom, mais pas nécessairement avec le même type, dans une classe dérivée, le champ hérité de la classe parente est masqué. Ce mécanisme est distinct de la redéfinition d'une méthode.


229#229

Le masquage d'un champ est une maladresse de programmation, plutôt qu'une caractéristique utile : il vaut mieux s'abstenir d'utiliser cette possibilité. Par exemple, si l'on a

package exemples;

class A {
  int p=1;
}

class B extends A {
  int p=2;           // À ÉVITER
}

le champ p de A est masqué par la définition d'un autre champ de même nom par B (il en serait d'ailleurs de même si p était déclaré d'un autre type dans B). Si b est une variable (ou une expression) de type B, l'expression b.p accède au champ p défini dans B, de valeur 2 (figure 4.8). Cependant, les champs de A peuvent être obtenus au moyen d'un transtypage : (A) b est une expression de type A, donc l'expression ((A) b).p accède au champ de A, qui a pour valeur 1.

Le mécanisme de liaison tardive ne concerne ni les champs ni les méthodes de classe : seul le type de l'expression détermine le champ accédé, et non le type de la valeur. Ainsi, si l'on déclare

  A a = new B();

l'expression a.p accède au champ p défini dans A, pas à celui de B, bien que la valeur affectée à a soit une référence à une instance de B. Contrairement aux méthodes d'instance, qui peuvent être redéfinies, les méthodes de classe peuvent être masquées, de façon analogue aux champs, mais il n'est vraiment pas recommandé de le faire :

package exemples;

class A {
  static int f() { 
    return 1;
  }
}

class B extends A {
  static int f() {   // À ÉVITER
    return 2;
  }
}


next up previous contents index
suivant: Accessibilité monter: Composition, abstraction, extension précédent: Finalité   Table des matières   Index
Rene' LALEMENT 2002-11-07