【发布时间】:2017-02-11 22:57:15
【问题描述】:
我正在测试 Object#clone 方法的行为,但我不明白为什么以下代码打印为 true, Diego, Diego,我期待它打印 true, Diego, Armando,因为 p.getName() == p2 .getName() 打印为真。请任何人解释为什么 p2.setName("Armando") 不修改 p 对象,如果它们指向相同的字符串?谢谢。
public class Main {
public static void main(String[] args) {
Person p = new Person();
p.setName("Diego");
Person p2 = null;
try {
p2 = (Person) p.clonar();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
System.out.println(p.getName() == p2.getName());
System.out.println(p.getName());
p2.setName("Armando");
System.out.println(p.getName());
}
}
class Person implements Cloneable {
private String name;
public Object clonar() throws CloneNotSupportedException {
return this.clone();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
【问题讨论】:
-
您设置的名称是
p2,而不是p,所以名称不会更改... -
但据我了解,克隆方法会进行浅拷贝,因此两个对象都指向同一个字符串
-
一个对象不等于它的克隆,所以
p2 != p。因此,设置p2的名称不会影响p的名称。 -
因为当时两个引用都指向同一个 String 对象。但是,当您调用 p2.setName 时,p2 的名称引用将指向另一个 String 对象。
-
应该是这样,是的。