用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