如何对对象进行Java深层复制?

时间:2011-12-21 10:30:34

标签: java clone

我有一个班级(Literal)。我需要能够在整个应用程序中将完整的Literal实例保存在内存中,并拥有一份我可以更改的副本。我用两种方法来做到这一点:

  1. Literal实现Cloneable并覆盖Object.clone()方法。
  2. 工厂构造函数:

    public Literal(Literal lit){
         this = lit;
    }
    
  3. 在这两种情况下,复制都不起作用。我对副本所做的每一项更改都会更改原件。有没有人知道我做错了什么?

2 个答案:

答案 0 :(得分:5)

由于Literal不是整数类型,Literal类型的变量对实际值包含引用,因此this = lit只复制引用,因此你的行为。

您必须递归复制所有成员字段以执行“真实”复制。

这个article与Umesh在评论中关联的问题的接受答案中有关联,我认为它可以解决您遇到的问题所带来的概念性问题。

答案 1 :(得分:1)

如果您打算使用复制构造函数,那么您需要对每个可变成员变量进行深层复制。

假设你的Literal有这样的成员变量:

private String[] args;
private String s;

然后你的拷贝构造函数需要做这样的事情

public Literal(Literal l) {
  // have to deep copy the array, otherwise both instances are sharing the reference
  this.args = Arrays.copyOf(l.args, l.args.length);

  // safe to just copy the reference, String is immutable
  this.s = l.s;
}