【问题标题】:Protected methods can be called on the object of subclass without overriding. Why it's different for clone method in java.lang.Object?可以在子类的对象上调用受保护的方法而无需覆盖。为什么 java.lang.Object 中的 clone 方法不同?
【发布时间】:2020-01-15 15:08:36
【问题描述】:

如果我有 A 类

    public class A {
        protected void show() {
        }
    }

另一个B类

    public class B extends A {
    }

驱动类:

    public class Driver {
          public static void main(String[] args) {
                  B b = new B();
                  b.show();
          }
    }

这东西很好用。但是为什么 Object 类中的 clone 方法会有所不同呢?如果我不使用 public 修饰符覆盖 clone 方法,我会收到如下错误:“clone has protected access in Object”。我们知道 Object 默认是所有类的父类。因此,这也应该与类 Driver、A 和 B 的工作方式相同。为什么不同?

【问题讨论】:

  • Driver 和 A 在同一个包中吗?
  • 如果A、B 和Driver 都驻留在不同的包中,那么b.show() 也不会编译。我猜在你的例子中A 和Driver 在同一个包中,因此没有错误。
  • 能否提供课程包?

标签: java overriding clone subclass protected


【解决方案1】:

来自javadoc

类中的clone() 方法必须遵守一些约定:

按照约定,返回的对象应该通过调用来获取 超级克隆。如果一个类及其所有超类(Object 除外) 遵守这个约定,x.clone().getClass() == x.getClass().

按照惯例,这个方法返回的对象应该是 独立于这个对象(正在被克隆)。为了达成这个 独立性,可能需要修改一个或多个字段 在返回它之前由 super.clone 返回的对象。通常,这 意味着复制任何包含内部“深 被克隆的对象的结构”并替换对 这些对象与副本的引用。如果一个类只包含 原始字段或对不可变对象的引用,那么它是 通常情况下 super.clone 返回的对象中没有字段 需要修改。

类 Object 的方法 clone 执行特定的克隆 手术。首先,如果这个对象的类没有实现 接口 Cloneable,然后抛出 CloneNotSupportedException。笔记 所有数组都被认为实现了接口 Cloneable 并且数组类型 T[] 的克隆方法的返回类型是 T[] 其中 T 是任何引用或原始类型。否则,这个方法 创建此对象的类的新实例并初始化所有 它的字段与相应字段的内容完全相同 这个对象,好像是通过赋值;字段的内容不是 自己克隆。因此,此方法执行此方法的“浅拷贝” 对象,而不是“深拷贝”操作。

Object类本身并没有实现接口Cloneable,所以 在类为 Object 的对象上调用 clone 方法将 导致在运行时抛出异常。

这意味着您必须重写 clone() 方法并实现 Cloneable 或直接使用 clone() 处理抛出的 CloneNotSupportedException

【讨论】:

    猜你喜欢
    • 2012-04-16
    • 2019-02-13
    • 2011-01-18
    • 2019-04-25
    • 1970-01-01
    • 2015-10-01
    • 2018-09-26
    相关资源
    最近更新 更多