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 回答