2017-03-19 54 views
2

我想了解的是類引用以及該引用如何在程序運行的生命週期中進行更改。例如瞭解程序生命週期中的類引用

ClassRef ref = new ClassRef(); 
ref.setVariableOne(1); 
ref.setVariableTwo(2); 

所以我知道,這將創建一個對象命名ref,我可以在我的代碼繞過的地方,我需要它,我可以用序列化保存和加載它這是罰款。如果我要創造一些類型的輸出,將顯示ref = 1,2

可是你知道,如果我是這樣做

ArrayList<ClassRef> refArray = new ArrayList<ClassRef> 
refArray.add(ref); 
ref.setVariableOne(3); 

我已經加入我的對象的數組,然後改變的變量之一,數組中的對象是否也會更新,或者在添加時將其作爲快照「保存」,因此如果我要從數組中輸出,它會給出ref = 1,2或者它會顯示ref = 3,2

+0

你說的這個'ClassRef'類是什麼? –

回答

1

我已經將我的對象添加到數組中,然後更改了其中一個變量,數組中的對象是否也更新了,還是在保存時添加了「快照」如果我要輸出從陣列它將給REF = 1,2或這將表明,REF = 3,2

在陣列列表中的對象也將發生變化,因此,它輸出ref=3,2

要理解此行爲,您需要了解什麼是對象和引用。一個對象是你可以使用new創建的東西。在這裏,你創建了一個新的對象:

new ClassRef(); 

注意,因爲這部分是創建該對象的引用創建對象的過程中不包括ClassRef ref =部分。該部分表示「ref現在將引用新創建的ClassRef對象」。

當您將ref添加到數組列表中時,即將引用添加到數組列表中。因此,現在數組列表中的唯一元素引用您在第一個創建的對象,即相同的對象ref。請注意,不會創建新對象。

當變異ref

ref.setVariableOne(3); 

發生變異是ref指對象,這只是恰巧是在數組列表中的唯一元素指的是同一個對象。如果你現在做refArray.get(0),那就相當於只做ref

+0

謝謝你,我仍然在圍繞類和對象包裹頭,所以這使得很有意義。 – Fluke

+0

@Fluke我認爲我的答案回答你的問題,請考慮通過點擊該選中標記來接受它! – Sweeper

0

輸出將是ref=3,2

你需要明白的是,當你添加refrefArray即,你只是保持參照對象(通過ref指出)的refArray列表內。

因此,當您從refArray中檢索對象時,原始對象的任何更改也會被注意到。

1

你是有這樣的困惑,因爲你正在考慮ref對象,而ref參考對象。更多的它,here

因此,當傳遞ref的方法,你都沒有通過對象,但參考該對象。因此,ArrayList包含參考對象的。現在,即使您對該對象進行了更改,的引用仍保持不變

所以,當你做ref.setVariableOne(3),你不要改變參考。由於我們通過的是參考,所以這些更改甚至會影響到ArrayList

因此,輸出將是ref=3,2

+0

好的,那麼有道理,謝謝:) – Fluke