编程语言
首页 > 编程语言> > 用Java克隆

用Java克隆

作者:互联网

参见英文答案 > Why is the Object class’s clone() method giving a deep copy of object?                                    4个
>            Object Clone Shallow copy doesn’t change variable                                    3个

class Person implements Cloneable {

    String firstName;

    public String getFirstName() {
        return firstName;
     }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

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

    Person p1 = new Person();
    p1.setFirstName("P1 Sara");

    Person p3 = new Person();
    try {
        p3 = (Person) p1.clone();
    } catch (CloneNotSupportedException e) {
    }

    p3.setFirstName("cloned Sara");
    System.out.println("P3 : " + p3.getFirstName());
    System.out.println("P1: " + p1.getFirstName());

我已经读过clone()方法实际上是一个浅层复制.
因此,我假设当P3中的字段值改变时,P1中的字段值也会改变.
但是,这没有发生.
我在这里错过了什么?

解决方法:

clone()方法实际上是浅层复制.
以下是您的示例中发生的情况:

> person1引用了名称.让我们称之为引用A.引用指向堆内存中的某个位置.
>将person1复制到person3后,person3中的名称引用(我们称之为引用B)指向堆内存中的相同位置.但它不是同一个参考.它是2个不同的引用,指向堆内存中的相同位置.
>当您调用p3.setFirstName(“克隆Sara”)时,引用B将更新为指向堆内存中的另一个位置.没有理由更改引用A指向的值.

标签:java,clone,cloneable
来源: https://codeday.me/bug/20190705/1387678.html