我正在学习Java,我正在阅读的书有以下关于克隆的示例。在clone()
,我的第一个实例能够在新对象上设置缓冲区,即使缓冲区是private
。似乎应该要求该字段是protected
为了这个工作。
为什么这是允许的?做clone()
具有允许其访问的特殊权限private
fields?
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());
}
}
}
The private
修饰符并不意味着只有同一个实例才能访问该字段;这意味着只有同一类的对象才能访问它。
The Java语言规范说在§6.6,访问控制:
...如果成员或构造函数被声明为私有,则当且仅当它出现在顶级类的主体中时才允许访问(§7.6)包含成员或构造函数的声明。
换句话说,类中的任何内容都可以随时访问它。甚至嵌套类也可以访问private
封闭类中的成员和构造函数,反之亦然。
(你并不是唯一一个误解它的人;看看这个广受好评的答案是“你最长久坚持的编程假设最终被证明是不正确的?)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)