繁体   English   中英

可以在子类的对象上调用受保护的方法而不会覆盖它们。 为什么java.lang.Object中的clone方法不同?

[英]Protected methods can be called on the object of subclass without overriding. Why it's different for clone method in java.lang.Object?

如果我有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方法,则会收到类似以下错误:“ clone在对象中具有受保护的访问”。 我们知道Object默认是所有类的父级。 因此,这也应与Driver,A和B类的工作原理相同。为什么会有区别?

javadoc

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

按照约定,应该通过调用super.clone获得返回的对象。 如果一个类及其所有超类(对象除外)都遵守此约定,则x.clone()。getClass()== x.getClass()就是这种情况。

按照惯例,此方法返回的对象应独立于该对象(正在克隆)。 为了实现这种独立性,可能有必要在返回super.clone之前修改该对象的一个​​或多个字段。 通常,这意味着复制构成要克隆对象的内部“深度结构”的任何可变对象,并用对副本的引用替换对这些对象的引用。 如果一个类仅包含基本字段或对不可变对象的引用,则通常情况是无需修改super.clone返回的对象中的任何字段。

类Object的方法clone执行特定的克隆操作。 首先,如果该对象的类未实现Cloneable接口,则抛出CloneNotSupportedException。 注意,所有数组都被认为实现了Cloneable接口,并且数组类型T []的clone方法的返回类型为T [],其中T是任何引用或原始类型。 否则,此方法将创建此对象类的新实例,并使用该对象相应字段的内容完全初始化其所有字段,就像通过赋值一样; 字段的内容本身不会被克隆。 因此,此方法执行此对象的“浅复制”,而不是“深复制”操作。

Object类本身并不实现Cloneable接口,因此在其类为Object的对象上调用clone方法将导致在运行时引发异常。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM