创建复制构造函数和重写的clone()方法

时间:2012-12-04 10:22:14

标签: java constructor copy override clone

我无法理解如何创建和实现复制构造函数,以及重写的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()”会使编译器错误消失,但很明显,这并没有让我任何地方。

感谢您的帮助!

2 个答案:

答案 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);
}

}

希望有帮助....