我在java中遇到了对象克隆的问题。
public class TestClass {
private int count;
private List<Integer> list;
public final int getCount() {
return count;
}
public final void setCount(int count) {
this.count = count;
}
public final List<Integer> getList() {
return list;
}
public final void setList(List<Integer> list) {
this.list = list;
}
}
public class Main {
public static void main(String[] args) {
TestClass obj = new TestClass();
obj.setCount(5);
List<Integer> temp = new ArrayList<Integer>();
temp.add(1);
temp.add(2);
obj.setList(temp);
TestClass newObj= obj;
System.out.println(newObj.getList().size());
obj.getList().add(3);
System.out.println(newObj.getList().size());
}
}
我到这里的输出是2,3。但我想要的输出是2,2但是因为java分配参考&#34; obj&#34;到newObj。反正有没有避免这个?我已经看到序列化对象并反序列化它将为&#34; newObj&#34;提供全新的引用。但还有其他有效的方法吗?
答案 0 :(得分:6)
首先,您实际上并不是 cloning ,在java中,您意味着使用object.clone()
方法。 clone生成对象的浅副本。您刚刚对同一个对象进行了第二次引用。
在您的代码中,调用
obj.getList().add(3);
与
相同newObj.getList().add(3);
这就是它按原样打印的原因。
您需要制作对象的深副本,这样不仅TestClass
的实例不同,而且所有字段也不同。
最简单的方法是制作复制方法和/或复制构造函数
public class TestClass{
public TestClass(){
}
//copy constructor
public TestClass( TestClass copy){
this.list = new ArrayList<Integer>(copy.list);
this.count = copy.count;
}
...
}
然后使用它:
TestClass newObj= new TestClass(obj);