11 votes

Comment peut-on accéder à une variable 'protected static' de la superclasse dans la sous-classe, lorsque la sous-classe réside dans un autre paquet ?

Voici la version légèrement élaborée de la même question.

Nous ne pouvons pas accéder à une variable protégée (de la superclasse) dans la sous-classe, où la sous-classe est dans un paquet différent. Nous pouvons seulement accéder à la variable héritée de la superclasse. Mais si nous changeons le modificateur en ' protected static', nous pouvons aussi accéder à la variable de la superclasse. Pourquoi est-ce que c'est comme ça ?

Voici l'extrait de code de la même chose que j'essayais d'expliquer.

package firstOne;

public class First {
    **protected** int a=7;
}

package secondOne;

import firstOne.*;

public class Second extends First {
    protected int a=10; // Here i am overriding the protected instance variable

    public static void main (String [] args){
        Second SecondObj = new Second();
        SecondObj.testit();
    }
    public void testit(){
        System.out.println("value of A in Second class is " + a);
        First b = new First();
        System.out.println("value in the First class" + b.a ); // Here compiler throws an error.
    }
}

Le comportement ci-dessus est attendu. Mais ma question est la suivante : si nous changeons le modificateur d'accès de la variable d'instance de la superclasse 'a' en 'protected static', nous pouvons accéder à la variable (celle de la superclasse) également ! Ce que je voulais dire, c'est que

package firstOne;

public class First {
    **protected static** int a=7;
}

package secondOne;

import firstOne.*;

public class Second extends First {
    protected int a=10;

    public static void main (String [] args){
        System.out.println("value in the super class" + First.a ); //Here the protected variable of the super class can be accessed..! My question is how and why..?
        Second secondObj = new Second();
        secondObj.testit();
    }

    public void testit(){
        System.out.println("value of a in Second class is " + a);
    }

}

Le code ci-dessus montre la sortie :

valeur dans la super classe 7

la valeur de x dans la classe test1 est 10

Comment cela est-il possible... ?

4voto

Ryan Stewart Points 46960

Extrait de "Vérification de l'accès aux membres protégés dans la machine virtuelle Java" :

Soit m être un membre déclaré dans une classe c qui appartient à un paquet p . Si m est public, il peut être accédé par (code dans) n'importe quelle classe. Si m est privé, il ne peut être accédé que par c . Si m a un accès par défaut, il ne peut être accédé que par toute classe qui appartient à p .

Si m est protégé, les choses sont légèrement plus compliquées. D'abord, m peut être accédé par toute classe appartenant à p comme s'il s'agissait d'un accès par défaut. En outre, toute sous-classe peut y accéder. s de c qui appartient à un paquet différent de p avec la restriction suivante : si m n'est pas statique, alors la classe o de l'objet dont le membre est accédé doit être s ou une sous-classe de s , écrit o s (si m est statique, la restriction ne s'applique pas : m est toujours accessible par s ).

J'ai trouvé cette référence dans le JLS, section 6.6.2.1 qui supporte la partie "l'objet dont le membre est accédé doit être". s ou une sous-classe...". Je ne vois rien qui soutienne la clause statique, mais d'après votre propre exemple, elle est manifestement vraie.

0voto

sibidiba Points 2879

La surcharge ne s'applique qu'aux méthodes, pas aux variables de classe. Il n'est pas possible de remplacer une variable. Vous remplacez le symbole accédant à la variable a de la superclasse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X