Demande de précisions sur les niveau de visibilité
Bon, avant tout, je vous dis bonjour à tous !
Voila, il faut que je vous expose un petit souci que j'ai eu et pour ça rien de mieux qu'un peu de code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
public abstract class UneLettre {
protected final String getLettre() {
return "Lettre "+this.getClass().getName()+" - "+Integer.toHexString(hashCode());
}
}
public class A extends UneLettre {
}
public class B extends UneLettre {
public void test(A a) {
System.out.println("Moi : "+this.getLettre());
System.out.println("Lui : "+a.getLettre());
}
} |
Bon, voila. J'ai deux classes, A et B, qui heritent de UneLettre. La classe abstraite UneLettre apporte une methode protected qui affiche le nom de la classe de l'objet courant. La classe A ne fait rien, la classe B introduit une methode de test.
Voila, ensuite je fais ce petit test :
Code:
1 2 3 4 5
|
A _a = new A();
B _b = new B();
System.out.println("test");
_b.test(_a); |
Et voila ce que j'obtiens :
Citation:
test
Moi : Lettre javaapplication1.test.B - 42e816
Lui : Lettre javaapplication1.test.A - 9304b1
Vous allez me dire : oui, et alors ? 8O
Alors la methode getLettre est protected ! B ne devrais pas pouvoir faire a.getLettre() !!
Si j'ai bien tout suivi, le mot clé protected donne accès à une methode/variable de classe à tous les héritiers. ok ? Mais néanmoins B et A sont deux objets distincs...
Donc :
- Soit c'est un bug, mais j'ai testé le même code sous PHP et lui aussi est OK
- Soit le mot clé protected donne accès à TOUS les heritiers d'une classe, même si ce sont des objets distincts... Si c'est le cas, les principes de sécurité introduits dans mes applications ne servent à rien... :?
- J'ai fait une erreur que je n'ai pas vu :oops:
Bon, jettez y un petit coup d'oeil et merci d'avance ;)