可以说我拥有超类A,具有克隆界面和深度重载克隆方法。通用java覆盖克隆方法
我也有一个子类B.
B Temp = new B();
B Temp_Clone = (B) Temp.clone();
方法Temp.clone()返回到克隆的超类A的引用,是吗?
从我的理解,我不能把一个超类的引用放在子类对象中,对吧?
那么我在这里写的代码是如何可能的?因为铸造?
谢谢。
可以说我拥有超类A,具有克隆界面和深度重载克隆方法。通用java覆盖克隆方法
我也有一个子类B.
B Temp = new B();
B Temp_Clone = (B) Temp.clone();
方法Temp.clone()返回到克隆的超类A的引用,是吗?
从我的理解,我不能把一个超类的引用放在子类对象中,对吧?
那么我在这里写的代码是如何可能的?因为铸造?
谢谢。
的类对象的clone()方法创建并返回 对象的副本,具有相同的类和与具有相同 值的所有字段。但是,Object.clone()将引发CloneNotSupportedException异常 ,除非对象是实现标记为 接口Cloneable的类的实例。
方法Temp.clone()返回到克隆的超类A的引用,是吗?
没错。
从我的理解,我不能在子类对象中引用超类,对吧?
错误。
那么我在这里写的代码是如何可能的?因为铸造?
我不知道你认为这是不可能的,但铸件肯定是必需的。
那么,因为B Temp_Clone是一个子类,另一方面,Temp.clone()是一个超类,你怎么能够引用一个超类到一个子类对象呢? – user2102697 2013-04-06 15:06:38
@ user2102697 A.clone()返回当前对象的一个克隆,无论它的类型是什么,它必须是定义的或扩展的A,但它被类型为object的类型*再次定义,所以类型转换是必要的。这一切都直接来自方法签名及其在Javadoc中的规范。 – EJP 2013-04-24 10:35:15
@onepotato OP表示A是B的超类。 – EJP 2013-04-24 10:35:44
那么,如果A中的代码调用super.clone,那么在调用Temp.clone时创建的对象就是B类型的对象,因为clone不会调用构造函数!克隆方法在对象类中实现为本地类和预成形智能副本并创建与此对象相同的对象。所以ClonedTemp来自B型。
为什么不移除转换以查看编译器是否返回错误或不知道最后一个问题?无论如何,我想如果你这样做,你会得到一个编译错误;当通过子对象引用变量引用超级对象时需要进行转换。并看看下面的@EJP答案,我认为这是你的问题的最佳答案。 – 2013-04-06 11:27:09