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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
test
Moi : Lettre javaapplication1.test.B - 42e816
Lui : Lettre javaapplication1.test.A - 9304b1
Vous allez me dire : oui, et alors ?

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

Bon, jettez y un petit coup d'oeil et merci d'avance