【问题标题】:Copying fields with clone() vs copy constructor Java使用 clone() 复制字段与复制构造函数 Java
【发布时间】:2015-10-10 14:55:24
【问题描述】:

我最近开始学习 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()有什么区别?为什么只有一个可以正常工作?

【问题讨论】:

  • 这一切似乎都错了,例如当字符串不可变时,为什么要在复制构造函数中创建一个新的String,我想不出适用于clone() 并且无法在复制构造函数中完成的条件,但是在某些情况下@987654326 @不工作。你在哪里找到的?
  • @Andreas 我更改了复制构造函数以创建一个新字符串,以确保它可以正常工作,因为我是 Java 新手。其余的来自课程材料。
  • 当某些属性的类型是接口或抽象类时,复制构造函数不能用于深度克隆。

标签: java clone copy-constructor


【解决方案1】:

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

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

【讨论】:

  • 即使有继承,你的陈述也很好,因为无论哪种方式,超类都必须实现复制构造函数或clone()
猜你喜欢
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
  • 2013-10-13
  • 2015-03-06
相关资源
最近更新 更多