Maison >Java >javaDidacticiel >Les sous-classes de différents packages peuvent-elles accéder directement aux membres protégés d'une superclasse ?

Les sous-classes de différents packages peuvent-elles accéder directement aux membres protégés d'une superclasse ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-07 16:30:15762parcourir

Can Subclasses in Different Packages Directly Access a Superclass's Protected Members?

Comprendre l'accès protégé en Java

En Java, le modificateur protected est destiné à permettre l'accès à certains membres au sein d'un même package et aux sous-classes dans d'autres paquets. Cependant, une idée fausse courante survient lors de l'accès à des membres protégés à partir d'une instance de la superclasse en dehors de la sous-classe.

Considérez l'exemple suivant :

// Class A
package package1;
public class A {
    protected int protectedInt = 1;
}

// Class C
package package2;
import package1.A;
public class C extends A {
    public void go() {
        A a = new A();
        System.out.println(a.publicInt);
        System.out.println(a.protectedInt); // Eclipse underlines this line
    }
}

Eclipse génère une erreur sur la ligne où a. protectedInt est accédé, affirmant qu'il n'est pas visible. Cela semble contredire la définition de protected en Java : "Le modificateur protected spécifie que le membre n'est accessible que dans son propre package (comme avec package-private) et, en outre, par une sous-classe de sa classe dans un autre package."

Résoudre l'idée fausse

La clé pour comprendre ce comportement réside dans la définition de protégé, car il ne s'applique qu'aux sous-classes. Plus précisément, l'accès aux membres protégés n'est autorisé que dans le corps d'une sous-classe.

Par conséquent, le membre protégé protectedInt est accessible depuis la classe C, mais uniquement pour les instances de la classe C elle-même ou les instances des sous-classes de la classe C. . Il n'est pas accessible directement à partir des instances de la superclasse, même si elles se trouvent dans le même package.

Pour résoudre l'erreur dans la méthode go, vous devrez plutôt créer une instance de classe C. de la classe A :

C c = new C();
System.out.println(c.publicInt);
System.out.println(c.protectedInt);

Cela accédera correctement au membre protégé via l'instance de sous-classe.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn