1

例として、メンバー変数として String を入れています。ただ、もともと複雑な構造があります。

public class ClassA {

    private final String test ;

    public ClassA(String str) {
        test = str;
    }

    @Override public int hashCode() {
        return test.hashCode();
    }

    @Override public boolean equals(Object obj) {
        return obj instanceof ClassA && test.equals(((ClassA)obj).test);
    }

}


public class ClassB {

    public static void main(String args[])
    {
        ClassA obj1 = new ClassA("abc");
        ClassA obj2 = new ClassA("def");
        obj1.equals(obj2);
        obj2.test;//not valid
    }
}

私が知っていることから、 のプライベート変数へのアクセスtestobj1ClassA のメソッド内にのみ存在し、これらのメソッドは のコンテキストから呼び出す必要がありますobj1

obj2 のテスト変数を呼び出すとobj1.equals(obj2)、obj1 のコンテキストからアクセスできます。

そのため、ClassA メソッド内から ClassA 型の任意のオブジェクトのプライベート変数にアクセスできます。

4

5 に答える 5

0

「プライベート」は、オブジェクトに対してプライベートではなく、クラスに対してプライベートを意味します。プライベート フィールドを使用する主な理由の 1 つは実装の隠蔽ですが、クラスの実装をクラス自体から隠蔽しても意味がありません。

この場合の「ClassA」は、実際には「ClassAのみ」を意味することに注意してください。ClassA のサブクラスからプライベート メンバーにアクセスすることはできません。

于 2013-09-18T14:53:52.057 に答える
0

もちろんはい。プライベート アクセス指定子は、クラスが自身の変数にアクセスするのを止めることができません。アクセス指定子に関係なく、そうでなければ、ゲッターとセッターメソッドがどのように機能するか。

これはカプセル化の基本です。オブジェクトを作成することにより、1 つのクラスの変数にアクセスできます。ただし、デフォルトでは同じクラスがそのメンバーにアクセスできます。

再び誰かが正しく指摘したように、スーパークラスのプライベートメンバーでさえ、そのサブクラスからは見えないか、アクセスできません。しかし、それは別の概念です。

以下の素敵な記事/ブログにアクセスできます

http://inheritingjava.blogspot.in/2011/01/chapter-4-access-modifiers.html

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

于 2013-09-18T15:07:39.883 に答える
0

あなた自身が書いているように:

そのため、ClassA メソッド内から ClassA 型の任意のオブジェクトのプライベート変数にアクセスできます。

正解です。

于 2013-09-18T14:51:18.217 に答える