可以在子类的对象上调用受保护的方法,而无需重写。为什么java.lang.Object中的克隆方法不同?
如果我有a级可以在子类的对象上调用受保护的方法,而无需重写。为什么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();
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和驱动程序在同一个包中,因此没有错误。您能提供类的包吗?