ホームページ >Java >&#&チュートリアル >異なるパッケージ内のサブクラスは、スーパークラスの保護されたメンバーに直接アクセスできますか?

異なるパッケージ内のサブクラスは、スーパークラスの保護されたメンバーに直接アクセスできますか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-07 16:30:15719ブラウズ

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

Java の保護されたアクセスについて

Java では、protected 修飾子は、同じパッケージ内の特定のメンバーおよびサブクラスへのアクセスを許可することを目的としています。他のパッケージでは。ただし、サブクラスの外にあるスーパークラスのインスタンスから保護されたメンバーにアクセスするときによくある誤解が生じます。

次の例を考えてみましょう。

// 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 は、次の行でエラーを発生させます。 protectedInt がアクセスされ、それが表示されないとして主張されます。これは、Java の protected の定義と矛盾しているように思えます。「protected 修飾子は、メンバーがその独自のパッケージ (package-private と同様) 内でのみアクセスでき、さらに、別のパッケージ内のそのクラスのサブクラスからもアクセスできることを指定します。」

誤解を解く

この動作を理解する鍵は、保護の定義にあります。これは、保護されているのは次の場合にのみ適用されます。サブクラス。具体的には、保護されたメンバーへのアクセスは、サブクラスの本体内でのみ許可されます。

したがって、保護されたメンバー protectedInt にはクラス C 内からアクセスできますが、アクセスできるのはクラス C 自体のインスタンスまたはクラス C のサブクラスのインスタンスのみです。同じパッケージ内にあるとしても、スーパークラスのインスタンスから直接アクセスすることはできません。

go メソッドのエラーを解決するには、次のようにする必要があります。クラス A の代わりにクラス C のインスタンス:

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

これにより、サブクラス インスタンスを通じて保護されたメンバーに正しくアクセスできます。

以上が異なるパッケージ内のサブクラスは、スーパークラスの保護されたメンバーに直接アクセスできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。