3

私はJavaを学んでおり、読んでいる本にはクローン作成に関する次の例があります。ではclone()、バッファが。であっても、最初のインスタンスは新しいオブジェクトにバッファを設定できますprivate。これが機能するためには、フィールドが必要なようですprotected

なぜこれが許可されるのですか?フィールドclone()へのアクセスを許可する特別な特権がありますか?private

public class IntegerStack implements Cloneable {
    private int[] buffer;
    private int top;

    // ... code omitted ...

    @Override
    public IntegerStack clone() {
        try{
            IntegerStack nObj = (IntegerStack) super.clone();
            nObj.buffer = buffer.clone();
            return nObj;
        } catch (CloneNotSupportedException e)
        {
            throw new InternalError(e.toString());
        }
    }
}
4

1 に答える 1

17

修飾子は、同じインスタンスのみがフィールドにアクセスできることを意味するものではprivateありません。これは、同じクラスのオブジェクトのみがアクセスできることを意味します。

Java言語仕様では、§6.6、アクセス制御で次のように述べています。

...メンバーまたはコンストラクターがプライベートとして宣言されている場合、アクセスは、メンバーまたはコンストラクターの宣言を囲むトップレベルクラス(§7.6)の本体内で発生する場合にのみ許可されます。

つまり、クラス内のすべてのユーザーがいつでもアクセスできます。ネストされたクラスでさえ、囲んでいるクラスのメンバーとコンストラクターにアクセスできprivate、その逆も可能です。

(それを誤解しているのはあなただけではありません。 「間違っていることが判明した、最も長く保持されているプログラミングの仮定は何ですか?」に対するこの非常に支持された答えをチェックしてください。 )

于 2009-06-10T15:16:07.023 に答える