Masquage d'un attribut

     

Supposons :

Cela est autorisé par le compilateur.
La liaison sur les attributs est statique, ce qui signifie que si on invoque un attribut d'un objet reférencé par une référence r, le compilateur décide de quel attribut il s'agit en "regardant" le type de r et non le type de l'objet référencé par r. Si r est de type A, r.n est l'attribut de la classe A, même si r référence un objet de type B.
On peut, comme pour les méthodes, utiliser dans la classe A le mot super pour invoquer l'attribut de la superclasse.

Cela est illustré dans l'exemple ci-dessous.

class A {
int n = 1;
float x;
}

class B extends A {
int n = 2;
double x;

void affiche() {
System.out.println("dans B n vaut " + n +
" et le n de la classe A vaut " + super.n);
}
}

class Masquage {
public static void main(String[]arg) {
B b = new B();
A a = b;

b.affiche();

System.out.println("a.n vaut " + a.n);
System.out.println("b.n vaut " + b.n);
}
}
Nous vous laissons chercher la réponse, qu'il est facile de déterminer si on a compris que l'attribut invoqué ne dépend que du type de la référence et pas du type de l'objet référencé.

Il est dans l'ensemble déconseillé d'utiliser le masquage des attributs. Il est préférable d'utiliser des noms différents entre les attributs définis dans une classe et les attributs définis dans une sous-classe de celle-ci.

Par ailleurs, si, comme il est conseillé, tous les attributs sont privés, le masquage des attributs ne joue pas un grand rôle.

Pour accéder au programme.

© Irène Charon Télécom ParisTech 2012