Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用clone()与复制构造函数Java复制字段_Java_Clone_Copy Constructor - Fatal编程技术网

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

使用clone()与复制构造函数Java复制字段,java,clone,copy-constructor,Java,Clone,Copy Constructor,我最近开始学习Java编程语言。在讲课过程中,我发现这两张幻灯片让我感到困惑: 一, 如果类具有复制构造函数,则clone()可以使用复制构造函数 创建并返回对象的副本 二, 即使复制构造函数和克隆()执行相同的操作(当 如前所示实现),在某些情况下仅克隆() 能行 这是所示的示例(销售和折扣销售在其他地方实施): 公共类CopyTest{ 公开静态销售[]不良副本(销售[]a){ 销售[]b=新销售[a.长度]; for(int i=0;i

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

一,

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

二,

即使复制构造函数和克隆()执行相同的操作(当 如前所示实现),在某些情况下仅克隆() 能行

这是所示的示例(销售和折扣销售在其他地方实施):

公共类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]);
        }
    }

}