gui應用程序的問題,其中對象數組已傳遞給構造函數,但是當新一輪初始化時,它會修改const_AnimalFamily數組,但我希望在每一輪都使其保持不變,但最終在這裏不能使用。其他班級初始化這門課,但這裏是我的主要課程。有什麼建議麼?謝謝!JAVA gui:被意外修改的數組
爲什麼每次修改animalFamily都改變了它,即使我沒有對它做任何事情,const_AnimalFamily也會受到影響? 「
gui應用程序的問題,其中對象數組已傳遞給構造函數,但是當新一輪初始化時,它會修改const_AnimalFamily數組,但我希望在每一輪都使其保持不變,但最終在這裏不能使用。其他班級初始化這門課,但這裏是我的主要課程。有什麼建議麼?謝謝!JAVA gui:被意外修改的數組
爲什麼每次修改animalFamily都改變了它,即使我沒有對它做任何事情,const_AnimalFamily也會受到影響? 「
您的代碼太大而無法分析。但是,當你聲明兩個數組賦予它們對字段的引用時,我簡單地假設你曾經給另一個賦予一個字段。
事實上你也行:
animalFamily = const_AnimalFamily;
我futher假設你想複製所有內容從const_AnimalFamily
到animalFamily
。但這種情況並非如此。
在Java中,此類賦值只是將引用指定給變量(或字段)。這意味着,現在這兩個字段都指向相同的陣列。實際上,之前由const_AnimalFamily
字段提及的陣列現在已經過時,不能再使用。
如果你現在訪問某些內容陣列,例如
animalFamily[0] = ...
和
... = const_AnimalFamily[0]
afterards讀,你會得到你以前寫爲陣列的同一個對象。
解決方法:如果你真的想要的陣列複製,請執行以下操作:
animalFamily = Arrays.copyOf(const_AnimalFamily, const_AnimalFamily.length);
另一個(更好)的解決辦法是使用集合。
複製數組確實工作,問題是與對象鏈接到同一個引用。謝謝你的明確解釋。 – ProgLearner 2014-11-09 08:16:23
根據你的觀察是正確的」對象數組已被傳遞給構造函數的問題,但是當新一輪被初始化時,它會修改const_AnimalFamily數組,我想在每一輪都使它保持不變。
看到這個代碼:
public AnimalGUI(Animal[] temp) {
System.out.println("INSIDE CONSTRUCTOR");
const_AnimalFamily = temp;
你正在改變const_AnimalFamily來臨時的參考。所以現在每當你修改temp(從它傳遞的任何地方)開始,你將會在你的常量數組中進行相同的修改。
我會建議你做這樣的事情:
你做你的臨時數組的深層副本,而不是改變參考。
OR
當你通過臨時數組,你傳遞數組的克隆(Arrays.copyOf)版本而不是原始數組。
爲了獲得更好的迴應機會,我建議您將代碼範圍縮小到可能導致問題的相關區域。 – 2014-11-09 07:52:47
如果你真的想確保一個數組沒有改變,可以考慮使用Guava的ImmutableList。 – dnault 2014-11-09 07:55:40
@isim有人抱怨說這裏沒有足夠的細節.. @ dnault我想知道爲什麼每次修改animalFamily時,它都會被改變,即使我沒有對它做任何事情,const_AnimalFamily也會受到影響? – ProgLearner 2014-11-09 07:58:41