1

同じ親を共有するクラス内の防護フィールドへのアクセスと可視性があるのはなぜですか? 私は常に、保護されたものは、決して外部ではなく、親または子自体を介してのみアクセスできると考えていました。

class Parent {

    protected int age;
}

class Sister extends Parent { }

class Brother extends Parent {

    public void myMethod(Sister sister) {
        //I can access the field of my sister,
        // even when it is protected.
        sister.age = 18;
        // Every protected and public field of sister is visible
        // I want to reduce visibility, since most protected fields
        // also have public getters and some setters which creates
        // too much visibility.
    }
}

だから家族以外から守られているだけなのかな。これはなぜですか?また、直接の親と子以外の家族からも何かを隠すにはどうすればよいですか? 私には、アクセス メンバー修飾子が不足しているようです。のようなものは、family実際にはあるべきでprotectedあり、保護されるべきであり、子と親以外のすべてから隠されるべきです。私は誰にも Java を書き直すように頼んでいるわけではありません。

4

4 に答える 4

3

これは、クラスParentとが同じパッケージに含まれているBrotherためです。Sister同じパッケージ内のメンバーは、private修飾子を除いて常に表示されます。

このコード:

public class Sister {

    void someMethod() {
        Brother brother = new Brother();
        brother.age = 18;
    }
}

クラスで作業していて、そこからクラスのメンバーSisterにアクセスしようとしていることを意味します。同じ親クラスを誤って拡張するという事実を除いて、とは何の関係もありません。ageBrotherBrotherSister

メンバーへのアクセスageが有効な唯一の理由は、BrotherSisterが同じパッケージ内にあるためです。Brotherまたは別のパッケージに移動しようとするSisterと、コンパイラが文句を言い始めます。

于 2015-07-27T14:15:57.040 に答える
2

Brother と Sister が Parent と同じパッケージにない場合age 、他のインスタンスの保護された変数は表示されません別のパッケージにある場合、サブクラスがそのスーパークラスの保護された変数にアクセスできないのはなぜですか? を参照してください。

例:

package test.family.parent;

public class Parent {
    protected int age;
}


package test.family.child;
import test.family.parent.Parent;

public class Brother extends Parent {

public void test(){
        this.age = 1;
        Brother brother = new Brother();
        brother.age = 44; // OK
        Sister sister = new Sister();
        sister.age = 44;  // does not compile
    }
}

package test.family.child;
import test.family.parent.Parent;

public class Sister extends Parent {

    public void test(){
        this.age = 1;
        Brother brother = new Brother();
        brother.age = 44;  // does not compile
        Sister sister = new Sister();
        sister.age = 44;   // OK
    }
}

この例でSisterは、自分自身と他のインスタンスの年齢にアクセスできますが、の年齢にはアクセスできませんBrother

于 2015-07-27T14:11:56.920 に答える
2

ドキュメントから、次の動作を確認できます。public, protected, and private

public誰もがそれを表示/変更できることを意味します。

protectedそのパッケージとサブクラスがそれを表示/変更できることを意味します

privateクラスがそれを表示/変更するだけであることを意味します。

また、例とわかりやすい説明については 、こちらを確認してください

編集:

経験則として、「oneClass」が「anotherClass」の場合、クラスは別のクラスを継承すると考えてください。あなたが書いたことは、「兄弟」は「親」であり、「兄弟」は「人」であるはずです。 「妹」は「人」です。

現在、両方とも兄弟姉妹であると同時に親でもあるため、何をしようとしているのかについて混乱が生じています。

編集2:

class parent{
   private String age;
}
于 2015-07-27T14:07:22.033 に答える
0

修飾子はクラス用です。あなたの兄弟も親なので、フィールドが保護されているため、parent.age にアクセスできます。問題の実際のオブジェクトがthis兄弟であるか、別の兄弟であるか、姉妹であるか、または他の親であるかは問題ではありません。

于 2015-07-27T13:51:22.417 に答える