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

标签 java private access-modifiers

我正在学习 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/

相关文章:

java - 比较 if 语句应该调用两次,但在比较 Integer 时只调用一次

c++ - 如何从另一个类访问私有(private)变量?

C# - 在此示例中改进属性封装?

c# - 覆盖但不调用

java - 为什么类或接口(interface)不能接收私有(private)或 protected 访问修饰符?

java - JList 选择,在中间引入弹出窗口时,连续的项目被标记为选中

java - 使用 Apache Commons-Imaging/Sanselan 更新 Tiff-Metadata

java - 如何将子域路由到集群内的一个或多个合适的节点?

iphone - 使用私有(private) API 从后台模式重新启动 VOIP 应用程序

公共(public)成员的 C++ 替代方案