使用clone()与复制构造函数Java复制字段
我最近开始学习Java编程语言。在讲课过程中,我发现这两张幻灯片让我感到困惑: 一, 如果类具有复制构造函数,则clone()可以使用复制构造函数 创建并返回对象的副本 二, 即使复制构造函数和克隆()执行相同的操作(当 如前所示实现),在某些情况下仅克隆() 能行 这是所示的示例(销售和折扣销售在其他地方实施):使用clone()与复制构造函数Java复制字段,java,clone,copy-constructor,Java,Clone,Copy Constructor,我最近开始学习Java编程语言。在讲课过程中,我发现这两张幻灯片让我感到困惑: 一, 如果类具有复制构造函数,则clone()可以使用复制构造函数 创建并返回对象的副本 二, 即使复制构造函数和克隆()执行相同的操作(当 如前所示实现),在某些情况下仅克隆() 能行 这是所示的示例(销售和折扣销售在其他地方实施): 公共类CopyTest{ 公开静态销售[]不良副本(销售[]a){ 销售[]b=新销售[a.长度]; for(int i=0;i
公共类CopyTest{
公开静态销售[]不良副本(销售[]a){
销售[]b=新销售[a.长度];
for(int i=0;i
当clone()在其实现中使用复制构造函数时,复制构造函数和clone()之间有什么区别?为什么只有一个可以正常工作?只要组合对象没有任何继承层次结构,最好使用复制构造函数
克隆不调用构造函数。当对象组成的层次结构复杂时,首选克隆。如果没有,请坚持使用复制构造函数。这一切似乎都是错误的,例如,当字符串不可变时,为什么要在复制构造函数中创建一个新的
String
,我想不出一个条件可以与clone()
一起工作,并且不能在复制构造函数中完成,但是在某些情况下clone()
不起作用。你在哪里找到的?@Andreas我更改了复制构造函数来创建一个新字符串,只是为了确保它能正常工作,因为我对Java是新手。其余部分来自课程资料。当某些属性的类型是接口或抽象类时,Copy costructor不能用于深度克隆。即使使用继承,您的语句也很好,因为无论哪种方式,超类都必须实现Copy构造函数或clone()
。
public Sale(Sale obj) {
this.itemName = new String(obj.itemName);
this.itemPrice = obj.itemPrice;
}
public Sale clone() {
return new Sale(this);
}
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]);
}
}
}