为什么clone可以在另一个对象上设置私有字段?

Asa*_*ers 3 java private access-modifiers

我正在学习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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*ers 16

private修改并不意味着只有同一个实例可以访问域; 它意味着只有同一个类的对象才能访问它.

Java语言规范说,在6.6节,访问控制:

...如果成员或构造函数被声明为private,则当且仅当它发生在包含成员或构造函数声明的顶级类(第7.6节)的主体内时才允许访问.

换句话说,类中的任何内容都可以随时访问它.即使是嵌套类也可以访问private封闭类中的成员和构造函数,反之亦然.

(你误解它并不孤单,看看这个备受upvoted回答"什么是你的最长持有的编程假设,竟然是不正确的?)