gui应用程序的问题,其中对象数组已传递给构造函数,但是当初始化新轮次时,它会以某种方式修改const_AnimalFamily数组,其中我想在每一轮中使其保持不变,但是此处不能使用final。其他类初始化这个类,但这是我的主要。有什么建议?谢谢!
为什么每次修改animalFamily都会改变它,即使我没有对它做任何事情,const_AnimalFamily也会受到影响?
答案 0 :(得分:0)
根据您的观察结果是正确的“gui应用程序的问题,其中对象数组已传递给构造函数,但是当初始化新轮次时,它会以某种方式修改const_AnimalFamily数组,我希望在每一轮中使其保持不变”。
看到你的代码:
public AnimalGUI(Animal[] temp) {
System.out.println("INSIDE CONSTRUCTOR");
const_AnimalFamily = temp;
您正在将const_AnimalFamily的引用更改为temp。所以现在每当你修改temp(从传递的任何地方),你将在常量数组中进行相同的更改。
我建议您执行以下操作:
您执行临时数组的深层复制,而不是更改引用。
OR
当您传递临时数组时,您传递的是克隆(Arrays.copyOf)版本的数组而不是原始数组。
答案 1 :(得分:0)
您的代码太大而无法进行分析。但是当你声明两个数组分配它们对字段的引用时,我只是假设你曾经将一个字段分配给另一个字段。
确实你有这条线:
animalFamily = const_AnimalFamily;
我进一步假设您要复制从const_AnimalFamily
到animalFamily
的所有内容。但事实并非如此。
在Java中,此类分配只是将引用分配给变量(或字段)。这意味着,这两个字段现在都引用相同的数组。实际上,之前由字段const_AnimalFamily
引用的数组现在已经过时,不能再使用了。
如果您现在访问某些数组内容,例如
animalFamily[0] = ...
和后来的读物
... = const_AnimalFamily[0]
您将获得之前写入数组的相同对象。
解决方案:如果您确实想要复制数组,请执行以下操作:
animalFamily = Arrays.copyOf(const_AnimalFamily, const_AnimalFamily.length);
另一个(更好的)解决方案是使用集合。