我已经知道,什么是浅表副本,但是我无法暗示它。这是一个简短的例子。
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';”。我还将更改“浅”的名称。我对吗?但是不知何故,它只是不想工作....
最佳答案
字符串和整数是不可变的。修改数据结构以使用包含引用的可变结构,例如数组或集合。例如。
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;
}
}
并使用getters / setters代替直接访问属性。
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
还要注意,字符串通常用双引号引起来。将来,请不要从编辑器中粘贴实际的,可编译的且可工作的代码,而不要在顶部或顶部键入该代码。避免红鲱鱼。