我在其中一个Java项目中遇到问题,导致错误。 问题听起来如下:
我有两个数组。我们先将它们命名为Array和secondArray。在这种情况下,对象是由我创建的单独类。它可以工作,数组可以填充这种类型的对象。
Object[] firstArray= new Object[];
Object[] secondArray = new Object[];
现在,当我从第一个数组中获取一个元素,编辑它然后在第二个数组中复制它时,第一个数组中的对象也会被更改。
tempObj = firstArray[3];
tempObj.modifySomething();
secondArray[3] = tempObj;
每当我这样做时,第一个数组的(在这种情况下)第3个元素(实际上是第4个)得到修改。我不想要这个。我希望第一个数组保持不变,未经修改,我从第一个数组中提取然后修改的对象应存储在第二个数组中,以便第二个数组实际上是运行某些代码后的第一个数组。
P.S。即使我使用Array.get(Array,index)从第一个数组中获取元素然后修改它,该元素仍会在第一个数组中被修改。
希望你理解我想说的话,如果是的话,请帮我一把:)
谢谢!
答案 0 :(得分:10)
您将不得不创建一个新对象。
问题是modifySomething
电话。当你这样做时,它改变了它被调用的对象。因此,如果您只有一个对象(即使是两个名字),则无法调用modifySomething
,否则它们都会发生变化。
当您说secondArray[3] = firstArray[3]
时,您没有创建新对象:您只是在指定引用。通过中间临时引用不会改变它。
您需要看起来像这样的代码:
Object tempObj = firstArray[3].clone();
tempObj.modifySomething();
secondArray[3] = tempObj;
clone()
方法必须返回与原始对象分离但具有相同属性的新对象。
答案 1 :(得分:1)
从数组中检索元素时,您可以引用它。因此,如果您修改它,修改将通过所有对象的引用进行剪切。
为了保持原样,你应该使用像Object.clone()这样的方法,或者创建一个新的Object并使用它的构造函数初始化它的字段。
答案 2 :(得分:1)
需要克隆从第一个数组中提取的对象,以创建一个单独的新实例。否则,修改将影响第一个数组中的对象,因为它是同一个对象。
答案 3 :(得分:1)
在Java中,当你执行此操作secondArray[3] = tempObj;
时,实际上是对数组的引用,而不是真实对象
所以firstArray[3]
和secondArray[3]
指向同一个真实对象
您需要做的是创建一个与原始对象相同的新对象,并将新对象的引用放到secondArray
值得指出的是,默认clone()
函数只执行浅拷贝,因此如果对象的字段中有可变对象,则可能会导致一些问题。请查看此article,了解如何执行深层复制
答案 4 :(得分:1)
从数组中检索元素时,会得到对它的引用。因此,如果您修改它,则通过所有对象的引用共享修改。
为了保持原样,你应该使用像Object.clone()
这样的方法,或者创建一个新的方法,输入你检索到的对象并返回一个新的方法。