我正在学习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());
}
}
}
答案 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?)