Question

Je viens d'erreur bizarre qui consiste à modificateur protégé.

Je code suivant:

package p1;

public class C1 {
    protected void doIt() {}
}


package p2;

public class C2 extends p1.C1 {
    private C1 c1_instance;
    public void doItAgain() {
        c1_instance.doIt(); // wtf!!!!
    }
}

J'obtiens l'erreur, indiquant que l'accès doIt() a protégé et ne peut être consulté! Mais je suis dans la sous-classe et ont et l'accès à la méthode de doIt().

est-il pas un bug?

Était-ce utile?

La solution

J'ai eu aussi l'impression que protected signifiait « accessible depuis le même emballage ou d'une sous-classe », mais le Java Language Specification est bien sûr plus précis, et explique que dans une sous-classe S de C, « Si l'accès est par un nom qualifié Q.Id, où Q est un ExpressionName, l'accès est autorisé si et seulement si le type de l'expression Q est S ou une sous-classe de S ».

Vous ne pouvez donc accéder à une méthode de protected de la superclasse par une référence à la sous-classe que vous appelez, comme ceci:

public class C2 extends C1 {
    private C2 c2_other_instance;
    public void doItAgain() {
        c2_other_instance.doIt();
    }
}

Si vous expliquez pourquoi vous souhaitez accéder une instance de la superclasse d'une autre instance de la sous-classe alors quelqu'un pourrait être en mesure de proposer une meilleure conception. Sinon, vous devrez faire la méthode public ou mettre les classes dans le même paquet.

Autres conseils

En Java, vous ne pouvez pas appeler des méthodes de protected sur une autre instance de la classe de base , même à partir d'une sous-classe:

public class C2 extends p1.C1 {
    private C1 c1_instance;
    public void doItAgain() {
        doIt();             // fine
        c1_instance.doIt(); // disallowed
    }
}

La seule exception est quand à la fois la classe de base et la sous-classe sont dans le même emballage.

Pour citer le Java OO tutoriel :

Le modificateur de protected précise que le membre ne peut être consulté dans son propre paquet (comme avec le paquet-privé) et, en outre, par une sous-classe de sa classe dans un autre paquet.

protégé est équivalent à un accès de niveau paquet; vous ne pouvez pas accéder à la méthode si vous êtes dans un autre paquet.

Vous devriez être en mesure d'appeler doIt () directement sans passer par l'objet c1_instance cependant, comme C2 est une sous-classe.

De http://download.oracle.com/javase/tutorial /java/javaOO/accesscontrol.html

« Le modificateur protégé précise que le membre ne peut être consulté dans son ensemble (comme avec le paquet-privé) et, en outre, par une sous-classe de sa classe dans un autre paquet. »

C2 peut être une sous-classe C1, mais cela ne signifie pas qu'il peut accéder à ces méthodes sur une autre instance, à savoir c1_instance ne peut pas être une instance de C2. Vous pouvez y accéder si elle était dans le même paquet.

Non, protected assure l'accès dans le même emballage et dans les classes descendantes. Vous n'êtes ni dans le même paquet, ni vous accédez directement à partir d'une classe descendante. C2 est un descendant mais c1_instance est pas.

Si votre méthode est déclarée comme protégé, vous pouvez accéder à cette dans cette catégorie, withing l'emballage et dans la sous-classe.

est maintenant ici la question, pourquoi est-il une erreur d'inspite accéder à ce membre protégé de sa sous-classe. la réponse est d'accéder à la méthode protégée d'une sous-classe sous-classe doit utiliser la méthode directement à partir de la sous-classe directe. ici la sous-classe directe est C2 mais l'instance c1_instance est pas. vous pouvez utiliser cette méthode directement (doIt () à la place de c1_instance.doIt ())

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top