2014-11-15 102 views
0

什麼我真的不知道的是這個代碼:這是一個引用類型的實例變量?

arrInt .....是一個整數數組和
listArr() ...是整數數組的動態列表

arrInt = {1, 2} 

listArr.add(arrInt) 

arrInt = {3, 4} 

listArr.add(arrInt) 

結果:
listArr(0)= {1,2}
listArr(1)= {3,4}

雖然我肯定的結果將是:
listArr(0)= {3,4}
listArr(1)= {3,4}

這將表明的每個元素listArr是強類型數組是實例化的副本arrInt
而不是arrInt也不一如即往參考arrInt, 因此值的參考,你可能會認爲這是一個NA ive查詢,〜>所有元素列表< T>創建爲對象的副本?

+3

第三行創建一個新的數組對象。 –

+0

...以及第一個... –

+3

如果您詢問代碼,您應該發佈編譯的代碼。 –

回答

4

是作爲對象的副本創建的列表中的所有元素?

不,他們不是。你正在創建新的數組而不是修改同一個數組。

arrInt = {3, 4}是語法糖arrInt = new [] {3, 4}這是句法糖arrInt = new int[] {3, 4}。你現在可以看到新的數組分配嗎?

要獲得

listArr(0) = {3, 4} 
listArr(1) = {3, 4} 

你需要更改初始數組的內容:

arrInt = {1, 2}; 

listArr.add(arrInt); 

arrInt[0] = 3; 
arrInt[1] = 4; 

listArr.add(arrInt); 

這將導致INT兩個listArr[0]listArr[1]相同的值。

+1

'{3,4}'並不總是''new [] {3,4}'的語法糖。 '{3,4}'是數組初始值設定項,它的數組類型是被聲明的字段或變量的類型,而'new [] {3,4}'是數組創建表達式,數組類型緊接在初始化程序之前,或者從數組初始值設定項中的表達式推斷出來。典型的例子:'object [] arrInt = {3,4}'(可以被編譯)是完全不同的'object [] arrInt = new [] {3,4}'(無法編譯) –

+0

@marcin是的。你在正確的軌道上。 thx –

0

如果沒有長時間的對話,實際上無法確切知道這一系列陳述的哪一部分讓您感到困惑。但在我看來,這些操作你得到錯誤的重要方面大概是這樣的:執行該語句listArr.Add(arrInt);時,被添加到列表中的事情是arrInt被引用的對象的引用,而不是你似乎認爲的變量arrInt本身。

一旦語句完成,在列表中的元素無論在什麼方面的變量arrInt沒有關係。該變量包含一個值,該值是對數組{ 1, 2 }的引用。當您執行listArr.Add(arrInt);時,添加到列表中的東西是該變量包含的,即對該數組的引用。

當您爲變量arrInt指定一個新值時,即對完全不同的數組{ 3, 4 }的引用時,該變量本身將採用該新值。但是因爲列表中的元素只是變量的前一個值,與變量本身無關,所以不受影響。

+0

換句話說,當語句「listArr.Add(arrInt)」被執行時,它們都以獨立的方式指向相同的對象?如果對象發生變化,那麼變化會反映在指向它的任何變量中? –

+0

對不起,我不確定他們在這裏指的是什麼。但是:如果任何_reference type_對象發生變化,那麼當前引用該對象的任何變量將會隨着它而改變。當然,變量本身並沒有真正改變;只是語言表達對任何對象的訪問方式是通過引用該對象的表達式,而當表達式只是一個變量時,它看起來就像是變化的變量。 –

相關問題