7

可以说Class B扩展class A并且class A是可克隆的,如下所示:

public class A implements Cloneable {
    public Object clone() throws CloneNotSupportedException {
        A ac = (A) super.clone();
        return ac;
    }
}

public class B extends A {
    public Object clone() throws CloneNotSupportedException {
        B a = (B) super.clone();
        return a;
    }
}

为什么在下一行从 A 向下转换到 B 是合法的:

B a = (B) super.clone(); // (super of B is A)

而下一个向下转换是运行时错误?

A a = new A();
B b = (B) a.clone();

提前致谢!

4

1 回答 1

10

最终,这是Object.clone()用于创建对象 - 并且保证创建一个与调用它的对象具有相同执行时间类型的新对象:

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

因此,如果我们调用clone()在 的实例上执行Bsuper.clone()则将返回一个B(或一个子类) - 所以强制转换是有效的。

在第二种情况下,您正在创建 just 的实例A,它不是的实例B,因此强制转换失败。

于 2013-09-27T09:27:15.303 回答