可以在子类的对象上调用受保护的方法,而无需重写。为什么java.lang.Object中的克隆方法不同?

可以在子类的对象上调用受保护的方法,而无需重写。为什么java.lang.Object中的克隆方法不同?,java,overriding,clone,subclass,protected,Java,Overriding,Clone,Subclass,Protected,如果我有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();

如果我有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();
          }
    }
这东西很好用。但为什么对象类中的克隆方法不同呢?如果我不使用公共修饰符重写clone方法,我会得到一个错误,如:clone在对象中具有受保护的访问权限。我们知道对象在默认情况下是所有类的父类。因此,这也应该与类驱动程序A和B的工作原理相同。为什么不同呢?

类中的克隆方法必须遵守某些约定:

按照约定,返回的对象应该通过调用 超级克隆。如果一个类及其除Object之外的所有超类 遵守此约定,x.clone.getClass== x、 去上课

按照约定,此方法返回的对象应为 独立于正在克隆的此对象。要做到这一点, 独立性,可能需要修改的一个或多个字段 对象在返回之前由super.clone返回。通常情况下 意味着复制任何组成内部深度的可变对象 要克隆的对象的结构并替换对的引用 这些对象包含对副本的引用。如果一个类只包含 原语字段或对不可变对象的引用,则 通常情况下,super.clone返回的对象中没有字段 需要修改

类对象的克隆方法执行特定的克隆 活动首先,如果这个对象的类没有实现 接口可克隆,则抛出CloneNotSupportedException。笔记 所有阵列都被认为实现了可克隆的接口 并且数组类型T[]的克隆方法的返回类型为 T[]其中T是任何引用或基元类型。否则,这种方法 创建此对象类的新实例并初始化所有 它的字段与 这个对象,好像通过赋值;字段的内容不正确 他们自己被克隆了。因此,此方法执行此文件的浅拷贝 对象,而不是深度复制操作

类对象本身并没有实现可克隆的接口,因此 对类为object的对象调用clone方法将 导致在运行时引发异常


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

驱动程序和a是否在同一个包中?如果a、B和驱动程序都位于不同的包中,则B.show也不会编译。我猜在您的示例中,A和驱动程序在同一个包中,因此没有错误。您能提供类的包吗?