【发布时间】:2013-07-10 14:54:27
【问题描述】:
我有这段 Java 代码。
public class CloneTest implements Cloneable{
String name;
int marks;
public CloneTest(String s, int i) {
name = s;
marks = i;
}
public void setName(String s) {
name = s;
}
public void setMarks(int i) {
marks = i;
}
@Override
public Object clone() {
return new CloneTest(this.name, this.marks);
}
}
我已经创建了这个类的一个对象,然后克隆了它。现在,当我在一个对象中更改 name 的值时,另一个对象中 name 的值保持不变。这里奇怪的是在构造函数中,我只是为name 使用了一个简单的引用,而不是为name 创建一个新的String。现在,由于Strings 是引用类型,我希望克隆中的String 也会被更改。谁能告诉我发生了什么事?提前致谢!
编辑
代码测试
CloneTest real = new CloneTest("Molly", 22);
CloneTest clone = real.clone();
real.setName("Dolly");
我使用 BlueJ 的“检查变量”功能来检查值。
【问题讨论】:
-
甚至 Wrapper 类都是 ;)
-
如果您在其中一个对象名称中设置了新名称,则会获得对传递字符串的新引用,而另一个对象保留该引用
-
字符串是不可变的,当你改变它时,会引用一个新的字符串
-
实际上,您对分配的工作方式感到困惑:每次使用“=”时,您都在更改引用。因此,当您使用 setXXX 时,您正在更改对新对象的引用