2

我在我的一个 Java 项目中遇到了一个问题,这会导致错误。问题听起来如下:

我有两个数组。我们将它们命名为 firstArray 和 secondArray。在这种情况下,对象是我创建的一个单独的类。它有效,数组可以填充该类型的对象。

Object[] firstArray= new Object[];
Object[] secondArray = new Object[];

现在,当我从第一个数组中取出一个元素,对其进行编辑然后将其复制到第二个数组中时,第一个数组中的对象也会被更改。

tempObj = firstArray[3];
tempObj.modifySomething();
secondArray[3] = tempObj;

每当我这样做时,第一个数组的(在这种情况下)第三个元素(实际上是第四个)都会得到修改。我不想要这个。我希望第一个数组保持完整、未修改,并且我从第一个数组中提取然后修改的对象应该存储在第二个数组中,以便第二个数组实际上是运行某些代码后的第一个数组。

PS 即使我使用 Array.get(Array, index) 从第一个数组中获取元素然后对其进行修改,该元素仍会在第一个数组中被修改。

希望你明白我想说的话,如果是这样,请帮帮我:)

谢谢!

4

5 回答 5

10

您将不得不创建一个新对象。

问题是modifySomething通话。当你这样做时,它会改变调用它的对象。所以如果你只有一个对象(即使是两个名字),你不能调用modifySomething,否则它们都会改变。

当你说 时secondArray[3] = firstArray[3],你并不是在创建一个新对象:你只是在分配一个引用。通过中间临时参考不会改变这一点。

您将需要如下所示的代码:

Object tempObj = firstArray[3].clone();
tempObj.modifySomething();
secondArray[3] = tempObj;

clone()方法必须返回一个与原始对象分离但具有相同属性的新对象。

于 2012-06-23T07:21:22.093 回答
1

当你从你的数组中检索一个元素时,你有一个对它的引用。因此,如果您修改它,修改将通过所有对象的引用进行。

为了保持它完好无损,您应该使用 Object.clone() 之类的方法或创建一个新对象并使用其构造函数来初始化其字段。

于 2012-06-23T07:20:39.357 回答
1

需要克隆从第一个数组中提取的对象以创建一个单独的新实例。否则修改将影响第一个数组中的对象,因为它是同一个对象。

于 2012-06-23T07:20:48.903 回答
1

在 Java 中,当你这样做时secondArray[3] = tempObj;,你实际上是把引用放到数组中,而不是真正的对象

所以firstArray[3]secondArray[3]指向同一个真实对象

您需要做的是创建一个与原始对象相同的新对象,并将新对象的引用放到您的secondArray

值得指出的是,默认clone()函数只做一个浅拷贝,所以如果你的对象字段中有可变对象,它可能会导致一些问题。看看这篇关于如何做深拷贝的文章

于 2012-06-23T07:20:54.053 回答
1

当您从数组中检索元素时,您会获得对它的引用。因此,如果您修改它,修改将通过所有对象的引用共享。

为了保持它完好无损,您应该使用类似的方法Object.clone()或创建一个新方法,该方法接受输入检索到的对象并返回一个类似的新方法。

于 2012-06-23T07:21:46.633 回答