这样做会调用Asub的clone方法吗?或者Asub深度克隆是否正确?如果没有的话,有没有办法通过这种方法来深度克隆Asub?
abstract class Top extends TopMost {
protected Object clone() {
Object obj = super.clone();
// deep copy and try catch
}
}
abstract class A extends Top {
protected Object clone() {
Object obj = super.clone();
// deep copy and try catch
}
}
class Asub extends A {
protected Object clone() {
Object obj = super.clone();
// deep copy and try catch
}
public void doSomethingNew() {
}
}
abstract class TopMost {
public void someMethod() {
Top a = (Top) super.clone();
// more code here
}
}
public class Main {
public static void main(String... args) {
Asub class1 = new Asub();
class1.someMethod();
}
}
最佳答案
首先,请注意 the clone() interface is broken ,因此不应在新代码中使用。最好实现复制构造函数。
但是,如果您确实需要这样做,正确的方法是让TopMost
实现Cloneable
。为什么? 《Effective Java》第二版第 11 条说道:
So what does
Cloneable
do, given that it contains no methods? It determines the behavior ofObject
’s protectedclone
implementation: if a class implementsCloneable
,Object
’s clone method returns a field-by-field copy of the object; otherwise it throwsCloneNotSupportedException
.This is a highly atypical use of interfaces and not one to be emulated. Normally, implementing an interface says something about what a class can do for its clients. In the case ofCloneable
, it modifies the behavior of a protected method on a superclass.
此外,Asub.clone
应声明为public
,而不是protected
- 否则您无法从外部世界调用它。另外,如果您使用的是 Java5 或更高版本,则 Asub.clone
返回 Asub
而不是 Object
是合法且可取的(对于它的父类(super class))。
您不会在类中显示任何成员 - 各个类中的 clone
实现可能会有很大不同,具体取决于该类中成员的类型。也就是说,如果一个类有任何可变成员,您需要仔细地深度复制所有这些成员,否则您最终会得到共享其内部状态的不同对象。
但是,假设您的类只有原始字段或不可变字段,则克隆会按预期工作,尽管您的抽象类中有很多不必要的 clone
方法,所有这些方法都只需调用 super.clone()
- 仅使用 Asub.clone()
可能会更好。
顺便说一句,如果 Top a = (Top) super.clone()
没有拼写错误,那么您就引入了从基类到派生类的依赖关系,这不是一个好主意。
关于java - 在 Java 中克隆对象 [3 个问题],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3652748/