JAVA gui:数组被意外修改

时间:2014-11-09 07:49:30

标签: java arrays user-interface

gui应用程序的问题,其中对象数组已传递给构造函数,但是当初始化新轮次时,它会以某种方式修改const_AnimalFamily数组,其中我想在每一轮中使其保持不变,但是此处不能使用final。其他类初始化这个类,但这是我的主要。有什么建议?谢谢!

为什么每次修改animalFamily都会改变它,即使我没有对它做任何事情,const_AnimalFamily也会受到影响?

2 个答案:

答案 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_AnimalFamilyanimalFamily的所有内容。但事实并非如此。

在Java中,此类分配只是将引用分配给变量(或字段)。这意味着,这两个字段现在都引用相同的数组。实际上,之前由字段const_AnimalFamily引用的数组现在已经过时,不能再使用了。

如果您现在访问某些数组内容,例如

animalFamily[0] = ...

和后来的读物

... = const_AnimalFamily[0]

您将获得之前写入数组的相同对象。

解决方案:如果您确实想要复制数组,请执行以下操作:

animalFamily = Arrays.copyOf(const_AnimalFamily, const_AnimalFamily.length);

另一个(更好的)解决方案是使用集合。