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

时间:2009-06-10 15:14:05

标签: 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());
        }
    }
}

1 个答案:

答案 0 :(得分:16)

private修饰符并不意味着只有同一个实例才能访问该字段;它意味着只有同一个类的对象才能访问它。

Java Language Specification中的§6.6, Access Control

  

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

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

(你并不是唯一一个误解它的人;请查看this much-upvoted answer to "What is your longest-held programming assumption that turned out to be incorrect?