2013-02-25 29 views
5

的陣列如果我有一個類說A,和我聲明這個類作爲的10個元素的陣列,創建引用

A [] arr=new A[10];

然後A的10個新的對象被創建並存儲在所述陣列。

但是,我想能夠做一些A arr[10];的行,其中數組只持有對空對象的引用。

我需要這個的原因是因爲我只需要數組來保存稍後在代碼中填寫的實例。所以上面聲明創建的對象無論如何都會丟失,因爲我知道對象的創建非常昂貴。

那麼,有什麼辦法可以讓我有一個引用數組,我可以指向我後來想要的對象嗎?或者這是不可能的,我應該訴諸使用ArrayList

回答

12

如果我有一個類說A,我聲明這個類作爲的10個元素的陣列,

A [] arr=new A[10]; 

然後被創建並存儲在數組中A的10級新的對象。

這是不正確的。這裏,創建了十個引用的數組,每個引用設置爲null。此代碼不會創建A的實例。

換句話說,代碼已經完全按照你的意願去做了。

+2

@akashasia只創建一個對象,即數組本身。 – 2013-02-25 10:10:53

+0

所以我不是在浪費記憶?很高興知道。看着新的關鍵字,我假定正在創建對象。謝謝:) – Akash 2013-02-25 10:12:38

+0

@TheodorosChatzigiannakis啊,這是有道理的。感謝您的洞察力。 – Akash 2013-02-25 10:13:25

4

如果你做A [] arr=new A[10];那麼除了你的數組之外不會創建任何對象,每個字段將會是null,直到你初始化它爲止。

A [] arr=new A[10];只創建地點來存儲引用A類對象。儘管數組arr已創建,但它不引用任何對象,並且您不能像arr[i].someMethod()那樣執行操作。

爲了校正它,在陣列的個別存儲器分配對象這樣做:

A [] arr=new A[10]; 
arr[0] = new A(); 
arr[1] = new A(); 
: 
: 

或在一個循環中,如:

for(i=0; i<10; i++){ 
     arr[i] = new A(); 
    } 

之後有arr即參考陣列,是指到一個有效的A類對象。在此表達式arr[i].someMethod()之後不會導致錯誤。

+1

我在你的答案中添加了。如果你不喜歡,你可以恢復。 – 2013-02-25 10:25:09

1

JLS Kinds of Variables:

陣列組件是被創建和初始化到默認值(§4.12.5)無名變量每當一個新的對象,它是一個數組被創建(§10§15.10)。當數組不再被引用時,數組組件不再有效。

而且從4.12.5. Initial Values of Variables

對於所有引用類型(§4.3),默認值是空

所以,當你說:

如果我有一類說A,我宣佈這個類爲10個元素的數組
A [] ARR =新的A [10] ;
然後創建A的10個新對象並存儲在數組中。

這是不正確的。但是你想要的是正確的。

那麼,有沒有什麼辦法可以有一個引用數組,我可以指向我後來想要的對象?