java – 为什么clone可以在另一个对象上设置私有字段?
作者:互联网
我正在学习Java,我正在阅读的书中有关于克隆的以下示例.在clone()中,我的第一个实例能够在新对象上设置缓冲区,即使缓冲区是私有的.看起来它应该要求保护字段以使其工作.
为什么允许这样做? clone()是否具有允许其访问私有字段的特殊权限?
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());
}
}
}
解决方法:
private修饰符并不意味着只有同一个实例才能访问该字段;它意味着只有同一个类的对象才能访问它.
Java Language Specification在§6.6, Access Control说:
… if the member or constructor is declared private, then access is permitted if and only if it occurs within the body of the top level class 07002 that encloses the declaration of the member or constructor.
换句话说,类中的任何内容都可以随时访问它.即使是嵌套类也可以访问封闭类中的私有成员和构造函数,反之亦然.
(你并不是唯一一个误解它的人;请查看this much-upvoted answer to “What is your longest-held programming assumption that turned out to be incorrect?)
标签:java,private,access-modifiers 来源: https://codeday.me/bug/20190713/1448623.html