【发布时间】: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