2014-11-09 37 views
0

gui應用程序的問題,其中對象數組已傳遞給構造函數,但是當新一輪初始化時,它會修改const_AnimalFamily數組,但我希望在每一輪都使其保持不變,但最終在這裏不能使用。其他班級初始化這門課,但這裏是我的主要課程。有什麼建議麼?謝謝!JAVA gui:被意外修改的數組

爲什麼每次修改animalFamily都改變了它,即使我沒有對它做任何事情,const_AnimalFamily也會受到影響? 「

+2

爲了獲得更好的迴應機會,我建議您將代碼範圍縮小到可能導致問題的相關區域。 – 2014-11-09 07:52:47

+0

如果你真的想確保一個數組沒有改變,可以考慮使用Guava的ImmutableList。 – dnault 2014-11-09 07:55:40

+0

@isim有人抱怨說這裏沒有足夠的細節.. @ dnault我想知道爲什麼每次修改animalFamily時,它都會被改變,即使我沒有對它做任何事情,const_AnimalFamily也會受到影響? – ProgLearner 2014-11-09 07:58:41

回答

0

您的代碼太大而無法分析。但是,當你聲明兩個數組賦予它們對字段的引用時,我簡單地假設你曾經給另一個賦予一個字段。

事實上你也行:

animalFamily = const_AnimalFamily; 

我futher假設你想複製所有內容從const_AnimalFamilyanimalFamily。但這種情況並非如此。

在Java中,此類賦值只是將引用指定給變量(或字段)。這意味着,現在這兩個字段都指向相同的陣列。實際上,之前由const_AnimalFamily字段提及的陣列現在已經過時,不能再使用。

如果你現在訪問某些內容陣列,例如

animalFamily[0] = ... 

... = const_AnimalFamily[0] 

afterards讀,你會得到你以前寫爲陣列的同一個對象。

解決方法:如果你真的想要的陣列複製,請執行以下操作:

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

另一個(更好)的解決辦法是使用集合。

+0

複製數組確實工作,問題是與對象鏈接到同一個引用。謝謝你的明確解釋。 – ProgLearner 2014-11-09 08:16:23

0

根據你的觀察是正確的」對象數組已被傳遞給構造函數的問題,但是當新一輪被初始化時,它會修改const_AnimalFamily數組,我想在每一輪都使它保持不變。

看到這個代碼:

public AnimalGUI(Animal[] temp) { 

    System.out.println("INSIDE CONSTRUCTOR"); 

    const_AnimalFamily = temp; 

你正在改變const_AnimalFamily來臨時的參考。所以現在每當你修改temp(從它傳遞的任何地方)開始,你將會在你的常量數組中進行相同的修改。

我會建議你做這樣的事情:

你做你的臨時數組的深層副本,而不是改變參考。

OR

當你通過臨時數組

,你傳遞數組的克隆(Arrays.copyOf)版本而不是原始數組。