我有两个类:父类 A 和一些子类 B,它扩展了 A 并且比 A 多了几个字段。我希望能够克隆这两个类,所以我重写了 clone( )
Object
类中的方法。
由于 B 类基本上是具有一些额外字段的 A 类,我想在 B 类的 clone()
实现中使用 A 类的克隆。我已经尝试了一些类似的方法:
public class A
{
public Object clone()
{
A cloneA = new A();
cloneA.foo = this.foo;
cloneA.bar = this.bar;
return cloneA;
}
}
public class B extends B
{
public Object clone()
{
Object cloneA = super.clone();
B cloneB = (B)cloneA;
cloneB.fieldSpecificForB = this.fieldSpecificForB;
return cloneB;
}
}
这样我就不必在 B 的 clone()
方法中复制 A 的 clone()
方法的所有克隆逻辑。不幸的是,这不起作用,因为 Java 不允许将 A 类对象转换为 B 类对象。我四处搜索如何执行此操作的答案,但似乎无法重用来自A、这是不是意味着我每次给A增加一个字段,我都要手动把这个字段的复制添加到所有子类的clone()
方法中。这似乎很容易出错......
最佳答案
clone
的工作方式是,它会自动为您复制所有字段。但是,您必须调用 super.clone()
才能使其工作:
public class A implements Cloneable // add 'implements'
{
public Object clone()
{
A cloneA = super.clone(); // this copies all fields and returns something of *the same type* as 'this'...
return cloneA;
}
}
public class B extends A //supposed to extend 'A' right?
{
public Object clone()
{
Object cloneA = super.clone(); // this returns object of runtime type B
B cloneB = (B)cloneA; // will work
return cloneB;
}
}
编辑:实际上你的 clone
方法现在什么都不做,所以它等同于写:
public class A implements Cloneable //add 'implements'
{
}
public class B extends A //supposed to extend 'A' right?
{
}
implements Cloneable
部分可以解决问题。另见 Cloneable .
关于java - 在子类中实现 clone(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12213369/