复制对象并进行更改(使用Java)

时间:2015-02-24 14:41:18

标签: java object copy

我在使用Java复制对象之前遇到过一个奇怪的问题。 所以,我在我的代码中编写了一个名为" State"的类。这包含一些整数,一个二维数组,一个字符串等...

因此,对于一个名为S的State实例,我想制作一个名为X的副本(我只是通过编写State X = S;来实现这一点)。然后我想对X进行更改,根据这些更改进行一些评估,然后扔掉X并继续使用S.但是,我得到的问题是S似乎正在进行我所做的更改X。 这对我来说似乎很奇怪,因为我觉得我以前做过这样的事情但从来没有遇到过这个问题。

有什么想法? (提前致谢)

2 个答案:

答案 0 :(得分:2)

  

我想制作一个名为X的副本(我只是通过编写State X = S来实现这一点。)。

这不会复制该对象。

Java中的变量(非基本类型)是引用 - 它们本身不是对象。通过做

State X = S;

你没有复制一个对象,你只是复制引用 - 结果就是你现在有两个引用同一个对象的变量。如果您通过一个引用修改对象,您还将通过另一个引用看到更改。

复制对象的一种方法是使用clone()方法。为此,要尝试复制的对象的类必须实现接口Cloneable。另一种(可能更好)的方法是创建一个复制构造函数,并使用它来复制对象:

public class State {
    public State(State other) {
        // initialize this object by copying content from other
    }
}

// Make a copy
State X = new State(S);

答案 1 :(得分:0)

您的代码未创建对象的副本。你在做什么是创建一个新的引用并将其指向同一个对象。 搜索"如何克隆Java中的对象"。阅读Cloneable界面。