java avoid对象通过引用传递

时间:2014-12-18 05:57:43

标签: java oop

我在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;提供全新的引用。但还有其他有效的方法吗?

1 个答案:

答案 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);