[英]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类的工作原理相同。为什么会有区别?
类中的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.