我在使用Java复制对象之前遇到过一个奇怪的问题。 所以,我在我的代码中编写了一个名为" State"的类。这包含一些整数,一个二维数组,一个字符串等...
因此,对于一个名为S的State实例,我想制作一个名为X的副本(我只是通过编写State X = S;来实现这一点)。然后我想对X进行更改,根据这些更改进行一些评估,然后扔掉X并继续使用S.但是,我得到的问题是S似乎正在进行我所做的更改X。 这对我来说似乎很奇怪,因为我觉得我以前做过这样的事情但从来没有遇到过这个问题。
有什么想法? (提前致谢)
答案 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界面。