【发布时间】:2018-10-23 11:11:10
【问题描述】:
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 中的值也会发生变化。 但是,那并没有发生。 我在这里想念什么?
【问题讨论】:
-
浅拷贝意味着它们有单独的字段,但这些字段引用相同的实例。这就像您将朋友的电话号码复制到新手机上:您只有两个电话号码副本,但他们拨打的是同一个电话。
-
String 是不可变类型。这意味着当您想要复制或克隆它时,您有一个字符串的 new 实例,其中包含复制的值。如果更改克隆的字符串,它不会影响原始字符串。
-
@AndyTurner 因此,在这种情况下,P3 是 P1 的克隆。他们不应该都引用同一个名字字段吗?
-
@Sara 继续电话类比:您已将电话号码复制到另一部电话上。他们在两个地方存储相同的东西;两部手机没有将内容放入同一个电话簿。如果你在一个地方更新它,它不会在另一个地方更新。
-
@KarelG 不完全是:克隆对象不会克隆字符串:它们都共享相同的实例,但是如果 - 克隆后 - 您更新原始字符串,它只会在克隆时指向另一个字符串将继续指向初始字符串值。