使用clone()与复制构造函数Java复制字段

时间:2015-10-10 14:55:25

标签: java clone copy-constructor

我最近开始学习Java编程语言。通过讲座,我发现这两张幻灯片让我感到困惑:

1

  

如果类具有复制构造函数,clone()可以使用复制构造函数   创建并返回该对象的副本。

public Sale(Sale obj) {
        this.itemName = new String(obj.itemName);
        this.itemPrice = obj.itemPrice;
}
public Sale clone() {
        return new Sale(this);
}

2

  

即使复制构造函数和clone()做同样的事情(当时   实现如前所示),在某些情况下只有clone()   可以工作

这是显示的示例(Sale和DiscountSale在其他地方实施):

public class CopyTest {

    public static Sale[] badCopy(Sale[] a) {
        Sale[] b = new Sale[a.length];
        for (int i = 0; i < a.length; i++)
            b[i] = new Sale(a[i]);
        return b;
    }

    public static Sale[] goodCopy(Sale[] a) {
        Sale[] b = new Sale[a.length];
        for (int i = 0; i < a.length; i++)
            b[i] = a[i].clone();
        return b;
    }

    public static void main(String[] args) {
        Sale[] a = new Sale[2];
        a[0] = new Sale("atomic coffee mug", 130.00);
        a[1] = new DiscountSale("invisible paint", 5.00, 10);
        int i;

        Sale[] b = badCopy(a);

        System.out.println("With copy constructors: ");
        for (i = 0; i < a.length; i++) {
            System.out.println("a[" + i + "] = " + a[i]);
            System.out.println("b[" + i + "] = " + b[i]);
        }

        b = goodCopy(a);

        System.out.println("With clone(): ");
        for (i = 0; i < a.length; i++) {
            System.out.println("a[" + i + "] = " + a[i]);
            System.out.println("b[" + i + "] = " + b[i]);
        }
    }

}

当clone()在其实现中使用复制构造函数时,复制构造函数和clone()之间有什么区别?为什么只有一个正常工作?

1 个答案:

答案 0 :(得分:1)

只要组合对象没有任何继承层次结构,最好使用复制构造函数。

克隆不会调用构造函数。当您具有复杂的对象组合层次结构时,首选克隆。如果没有,请坚持复制构造函数。