gpt4 book ai didi

java - 为什么克隆可以在另一个对象上设置私有(private)字段?

转载 作者:搜寻专家 更新时间:2023-11-01 04:03:52 25 4
gpt4 key购买 nike

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

最佳答案

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 (§7.6) that encloses the declaration of the member or constructor.

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

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

关于java - 为什么克隆可以在另一个对象上设置私有(private)字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/976243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com