2013-02-25 46 views
1

在Java中,讓自定義對象o的類型爲CustomObject。然後CustomObject o2 = o;會作參考,但不會將o的內容複製到o2。但是,將這種行爲仍然爲CustomObject秒的數組:對象引用數組

CustomObject[] os = new CustomObject[2]; 
os[1] = o; 
os[2] = o; 

os[1]os[2]是引用或者他們會因而單獨對象o直接複製?

+1

爲什麼不檢查,看看你的自我? – yurib 2013-02-25 21:26:55

回答

7

嗯,實際上你的意思是os[0]os[1],因爲數組在Java中是基於0的......但是,它們將是引用。這兩個數組元素都會引用同一個對象。

重要的是,o不是一個對象之一:

  • o可變:它有一個名稱和一個值
  • o的值是一個參考:它或者空,或者它指的是一個對象
  • 一個對象有字段,是一定的執行時間類型等

表達式的值(無論它是一個簡單的變量值,方法調用或任何的結果)是從未 Java中的object - 它總是任一個的提及或原始值。

方式Java語言規範defines arrays是一樣的變量的集合:

數組對象包含多個變量。變量的數量可以是零,在這種情況下,數組被稱爲空。包含在數組中的變量沒有名稱;相反,它們由使用非負整數索引值的數組訪問表達式引用。這些變量被稱爲數組的組件。如果一個數組有n個分量,我們說n是數組的長度;數組的組成部分使用0到n - 1之間的整數索引進行引用。

所以真的有點像做:

// Creating the pseudo-array 
CustomObject o0 = null; 
CustomObject o1 = null; 

// Populating it 
o0 = o; 
o1 = o; 

與以往一樣,賦值運算符只是複製右側向左側的值。該值是一個參考。

+0

我問的原因是我有一個很大的'Graph'對象,其中節點的類型也是'Graph'。當我遍歷圖時,我需要將一些節點放入一個'Graph []'數組中,我想知道這是否昂貴,這就是爲什麼擔心將對象隱藏到陣列位置的原因。那麼這是否意味着我的數組的創建速度與C++中類似的指針數組一樣快? – 2013-02-25 21:38:03

+0

@SophieSperner:是的,非常相似。 – 2013-02-25 21:40:12

+0

啊哈,所以Java並沒有那麼糟糕。接受的答案:) – 2013-02-25 21:41:54