当前位置: 首页 > 面试题库 >

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

金珂
2023-03-14
问题内容

我正在学习Java,正在阅读的书中包含以下有关克隆的示例。在中clone(),即使buffer是,我的第一个实例也可以在新对象上设置缓冲区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语言规范说,在6.6节,访问控制

…如果成员或构造函数被声明为私有,则仅当访问发生在包含成员或构造函数的声明的顶级类(第7.6节)的主体内时,才允许访问。

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



 类似资料:
  • 有人能解释为什么我能在中设置私有成员? 但是返回一个致命错误。 我总是假设私有成员应该只能从同一个对象实例而不是同一个对象类访问?

  • 问题内容: 最近,我观察到在Java中访问priavte字段的意外行为。考虑以下示例,该示例说明了该行为: 为什么我可以访问类的其他对象的私有字段的内法(第二种情况)? 问题答案: 私有字段保护一个类,而不是实例。主要目的是允许一个类独立于其API实现。在它们之间隔离实例,或从相同类的静态代码中保护实例的代码都不会带来任何好处。

  • 假设我有这门课: 以及子类: 我知道这是不可能的,但我想你明白我想要什么。如果Foobar实现了Cloneable,并且没有扩展AbstractFoo,那么子类就可以工作。我想我想要但不允许的是: 如果Foobar实现了Cloneable,并且没有扩展AbstractFoo,那么子类就可以工作。 除了扩展的抽象类,我怎么能做到“相同”?

  • 问题内容: 将变量分配给另一个变量会将引用复制到同一实例。这意味着更改一个将更改另一个。 我实际上如何克隆或复制实例? 问题答案: 使用Date对象的方法,该方法返回自1970年1月1日00:00:00纪元时间以来的毫秒数: 在Safari 4中,您还可以编写: …但是我不确定这是否可以在其他浏览器中使用。(似乎可以在IE8中使用)。

  • 问题内容: 有人可以解释一下我吗 什么是PHP中的对象克隆? 什么时候应该在PHP中使用clone关键字? 问题答案: 对象克隆是复制对象的行为。正如Cody所指出的那样,在PHP中进行克隆是通过对对象进行浅表复制来完成的。这意味着除非您通过定义magic方法明确指示对象也克隆这些内部对象,否则 不会 克隆已克隆对象的内部对象。 如果不使用该方法,则新对象的内部对象将是与克隆的原始对象的内部对象相

  • 问题内容: 我在一个包含私有字段的包中有一个结构: 另一个软件包(例如,白盒测试软件包)需要访问它们: 是否有一种方法可以声明是某种“朋友”软件包,或者可以通过其他任何方式访问的私有成员,但仍然对所有其他软件包保持私有(也许在其中)? 问题答案: 有 是 一种方法来 读取 使用反映不导出成员 但是,尝试使用y.Set或通过其他方式设置反射字段将导致代码恐慌,您试图在软件包外部设置未导出的字段。 简