我已经知道,这是一个浅薄的副本,但我无法暗示它。这是一个简短的例子。
public class Shallow {
String name;
int number;
public Shallow (Shallow s) {
this.name = s.name;
this.number = s.number;
}
}
测试实施......
public class ShallowTest {
public static void main (String[] args) {
Shallow shallow = new Shallow("Shallow", 123);
Shallow shallowClone = new Shallow(shallow);
shallowClone.name = 'Peter';
shallowClone.number = 321;
System.out.println(shallow.name + " - " + shallow.number);
}
}
按照我的目的,只复制非原始数据类型String的引用,以便通过调用“shallowClone.name ='Peter';”我也会更改“浅”的名称。我对吗?但不知何故,它只是不想工作....
答案 0 :(得分:5)
字符串和整数是不可变的。修改您的数据结构以使用包含引用的可变结构,例如数组或集合。 E.g。
public class Shallow {
private Object[] properties = new Object[2];
public Shallow(String name, int number) {
this.properties[0] = name;
this.properties[1] = number;
}
public Shallow(Shallow s) {
this.properties = s.properties;
}
public String getName() {
return (String) properties[0];
}
public void setName(String name) {
this.properties[0] = name;
}
public int getNumber() {
return (Integer) properties[1];
}
public void setNumber(int number) {
this.properties[1] = number;
}
}
使用getter / setter而不是直接访问属性。
Shallow shallow = new Shallow("Shallow", 123);
Shallow shallowClone = new Shallow(shallow);
shallowClone.setName("Peter");
shallowClone.setNumber(321);
System.out.println(shallow.getName() + " - " + shallow.getNumber()); // Peter - 321
另请注意,字符串通常用双引号引用。将来,请从编辑器中复制实际的,可编译的和可用的代码,而不是在头顶或顶部输入。避免红鲱鱼。