我无法理解如何创建和实现复制构造函数,以及重写的clone()方法(不在同一个类中)。
我知道对于“实际副本”,你必须深度克隆而不是简单的克隆(这花了我很长时间才弄明白......)。我在这里发现的一个比较明显的解决方案是制作复制构造函数。
为了简洁起见,假设我有一个拥有两个整数的Dog对象。在另一个类Cat中,我有一个Cat对象,它由100个Dog对象组成(例如,Dog [] cat = new Dog [100])。到目前为止,我尝试了以下内容:
// for a copy constructor
public Cat(Cat cat) {
Dog[] copy = new Dog[100];
for (int i = 0; i < 100; i++) {
copy[i] = cat[i];
}
}
这样的东西总是会给我一个类型不匹配(“表达式的类型必须是数组类型,但它解析为Cat”和“无法从Cat转换为Dog”)。这可能是因为它是我所在的早上5点,但我不明白为什么这不起作用。是不是同类型的副本和猫?
如果我尝试使用自己的clone()方法覆盖,我会得到相同的错误。我之前从未使用过clone()(或者看过它),所以我想在尝试提出自己之前看看我不理解的东西。但是,对于它的价值,我之前已经注释了以下内容,并且编译器在return语句中抛出:
protected Cat clone() {
Dog[] copy = new Dog[100];
int count = 0;
(while (count < cat.length) {
copy[count] = (Dog) cat[count];
count++;
}
return copy;
}
相同类型不匹配错误。将标题更改为“受保护的Dog [] clone()”会使编译器错误消失,但很明显,这并没有让我任何地方。
感谢您的帮助!
答案 0 :(得分:1)
在您的情况下,您正在尝试复制Dog
对象中的Cat
数组。但是,您尝试将Cat
对象用作数组(使用[]
和length
)
你可能的意思是将猫的内容复制到新猫身上。然后你的构造函数会变成:
private Dogs[] myCatsDogs;
// for a copy constructor
public Cat(Cat otherCat) {
this.myCatsDogs = new Dog[100];
for (int i = 0; i < 100; i++) {
this.myCatsDogs[i] = otherCat.myCatsDogs[i];
}
}
对于clone()
方法,同样适用。另请注意,克隆不经常使用(因为它很难正确实现,另请参阅Bloch的Effective Java第10项)。如果可以,请始终使用复制构造函数。
答案 1 :(得分:0)
这是我在Stand copy Constructor下的简单示例....
public class Dog {
public final List<String> names;
public int age;
public int weight;
public Dog() {
names = new ArrayList<String>();
}
protected Dog(Dog original) {
names = new ArrayList<String>(original.names);
age = original.age;
weight = original.weight;
}
public Dog copy() {
return new Dog(this);
}
}
public class Dalmatian extends Dog {
public int spots;
public Dalmatian() { }
protected Dalmatian(Dalmatian original) {
super(original);
spots = original.spots;
}
public Dalmatian copy() {
return new Dalmation(this);
}
}
希望有帮助....