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

发布于 2024-07-23 10:08:37 字数 665 浏览 6 评论 0原文

我正在学习Java,我正在阅读的书有以下关于克隆的示例。 在clone()中,我的第一个实例能够在新对象上设置缓冲区,即使缓冲区是私有的。 似乎应该要求该字段受到保护才能正常工作。

为什么这是允许的? 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());
        }
    }
}

I'm learning Java, and the book I'm reading has the following example on cloning. In clone(), my first instance is able to set buffer on the new object even though buffer is private. It seems like it should require the field to be protected for this to work.

Why is this allowed? Does clone() have special privileges that allows it to access the 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());
        }
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

海拔太高太耀眼 2024-07-30 10:08:37

private 修饰符并不意味着只有同一个实例才能访问该字段; 这意味着只有同一类的对象才能访问它。

Java 语言规范§6.6,访问控制

...如果成员或构造函数被声明为私有,则当且仅当它出现在顶级类的主体中时才允许访问 (§7.6) 包含成员或构造函数的声明。

换句话说,类内的任何内容都可以随时访问它。 即使嵌套类也可以访问封闭类中的私有成员和构造函数,反之亦然。

(您并不是唯一一个误解它的人;请查看 这个备受好评的答案“你最长持有的编程假设被证明是不正确的?

The private modifier does not mean that only the same instance can access the field; it means only objects of the same class can access it.

The Java Language Specification says in §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.

In other words, anything inside the class can access it at any time. Even nested classes can access private members and constructors in the enclosing class, and vice versa.

(You're not alone in misunderstanding it; check out this much-upvoted answer to "What is your longest-held programming assumption that turned out to be incorrect?)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文