Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.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
Java 使用对象类的clone()方法克隆对象_Java - Fatal编程技术网

Java 使用对象类的clone()方法克隆对象

Java 使用对象类的clone()方法克隆对象,java,Java,如果要克隆的对象所在的类包含与另一个类的对象类似的非基本数据类型,则此对象中所做的更改将反映在两个对象中(即原始对象和克隆对象)?虽然在基本数据类型中所做的更改只反映在克隆对象中,但为什么 import static java.lang.System.*; class Best { int x; int y; } class Test implements Cloneable { int a; int b; Best bt = new Best();

如果要克隆的对象所在的类包含与另一个类的对象类似的非基本数据类型,则此对象中所做的更改将反映在两个对象中(即原始对象和克隆对象)?虽然在基本数据类型中所做的更改只反映在克隆对象中,但为什么

import static java.lang.System.*;

class Best
{
    int x;
    int y;
}

class Test implements Cloneable
{
    int a;
    int b;
    Best bt = new Best();

    public Object clone()throws CloneNotSupportedException
    {
    return super.clone();   
    }
}

public class Check 
{
    public static void main(String [] args) throws CloneNotSupportedException
    {
        Test t1 = new Test();
        t1.a=20;
        t1.b=30;
        t1.bt.x = 300;
        t1.bt.y = 200;

        Test t2 = (Test)t1.clone();

        t2.a=50; //change reflects only in cloned object
        t2.bt.x = 500; //change reflects in both original and cloned object

        out.println(t1.a+" "+t1.b+" "+t1.bt.x+" "+t1.bt.y);
        out.println(t2.a+" "+t2.b+" "+t2.bt.x+" "+t2.bt.y);
    }
}
Java clone()方法只创建浅拷贝,这意味着原始数据类型字段的值被复制,而对象类型字段的引用被复制。在您的示例中,这将导致两个对象“共享”一个最佳对象

要完成深度复制,即创建新对象而不是引用现有对象,您需要在重写的clone()方法中创建一个新的Best对象,并手动指定值或使Best cloneable。我更喜欢使Best cloneable,因为更改Best类的字段不需要更改测试类的clone()方法。当试图以这种方式创建深度拷贝时,最重要的一点是,必须始终向下克隆,直到只到达原始数据字段,这并不总是合理/可能的。如果是这种情况,只需手动分配值

使最佳可克隆性:

class Best implements Cloneable
{
    int x;
    int y;
    public Object clone() throws CloneNotSupportedException
    {
        return super.clone();   
    }
}

class Test implements Cloneable
{
    int a;
    int b;
    Best bt = new Best();

    public Object clone()throws CloneNotSupportedException
    {
        Test t = (Test) super.clone();
        t.bt = (Best) this.bt.clone();
        return t;   
    }
}
手动分配值:

class Best
{
    int x;
    int y;
}

class Test implements Cloneable
{
    int a;
    int b;
    Best bt = new Best();

    public Object clone()throws CloneNotSupportedException
    {
        Test t = (Test) super.clone();
        t.bt.x = this.bt.x;
        t.bt.y = this.bt.y;
        return t;   
    }
}

因为克隆不会深度克隆。谷歌it:
Java中的深度复制与浅层复制