1

私はこれらのクラスを持っています:

package abc;

public class A {

    public int publicInt;
    private int privateInt;
    protected int protectedInt;
    int defaultInt;

    public void test() {
        publicInt = 0;
        privateInt = 0;
        protectedInt = 0;
        defaultInt = 0;
    }

}

「A」には、4 つのアクセス修飾子すべての属性が含まれます。これらの他のクラスは、「A」を拡張するか、インスタンスを作成して属性にアクセスしようとします。

package de;

public class D {

    public void test() {
        E e = new E();
        e.publicInt = 0;
        e.privateInt = 0; // error, cannot access
        e.protectedInt = 0; // error, cannot access
        e.defaultInt = 0; // error, cannot access
    }

}

package de;

import abc.A;

public class E extends A {

    public void test() {
        publicInt = 0;
        privateInt = 0; // error, cannot access
        protectedInt = 0; // ok
        defaultInt = 0; // error, cannot access
    }

}

package abc;

import de.E;

public class C {

    public void test() {
        E e = new E();
        e.publicInt = 0;
        e.privateInt = 0; // error, cannot access
        e.protectedInt = 0; // ok, but why?
        e.defaultInt = 0; // error, cannot access
    }

}

クラスCでe.protectedIntにアクセスできる理由がわからないことを除いて、すべて問題ありません。

4

3 に答える 3

1

ここでは、コードの図が理解を深めるのに役立つと思います。

クラス E に保護されたメンバーを追加する

public class E extends A {
    protected int protectedIntE;
    ...

さて、クラスCでアクセスしてみてください

e.protectedInt = 0; // ok, but why?
e.protectedIntE = 0; // error, exactly as you expected

したがって、ここで注意すべきことはprotectedInt、インスタンスを介してアクセスしたにもかかわらずE、実際にはクラス A に属し、継承によってクラス E に継承されただけであるということです。クラス E の実際の (継承されていない) 保護されたメンバーは、期待どおりにまだアクセスできません。

現在、クラス A とクラス C は同じパッケージにあり、保護されたアクセスは基本的にパッケージのスーパーセットとして機能するため (サブクラス アクセスも含めることにより)、コンパイラはここで文句を言う必要はありませんでした。

于 2013-05-26T21:14:51.583 に答える
1

CA(package abc) と同じパッケージにありprotected、Java の修飾子には同じパッケージ内のアクセスが含まれているためです。

于 2013-05-26T20:34:59.077 に答える
0

アクセス制御

リンクをたどると、Java ドキュメントが表示され、修飾子のアクセシビリティが説明されます。

protectedクラス、関数などは、現在のクラス、パッケージ、およびサブパッケージで表示されます。クラスのサブクラス内にも表示されます。

于 2013-05-26T21:10:40.447 に答える