2012-10-28 39 views
0

我正在使用以下代碼將新的StockRecord添加到我的stockRecords集合中。 StockRecord擴展股票。在Java中使用for-each循環時,對象變量是否創建對象的實例?

for (Stock s : stock) { 
    stockRecords.add(new StockRecord(s.get_storeID(), 
    s.get_sku(), s.get_itemCount())); 
} 

我有兩個StockStockRecord的構造一個println語句,。當我運行這段代碼,我得到以下輸出:

Stock() 
StockRecord() 
Stock() 
StockRecord() 
Stock() 
StockRecord() 
Stock() 
StockRecord() 

是否在for-each循環使用變量s實際創建的Stock一個實例?

+3

'StockRecord'是否延伸'Stock'?如果是這樣,實例化一個新的'StockRecord'將首先調用父'Stock'構造函數。 –

+0

@PaulBellora。你應該把它作爲答案。 –

+0

@RohitJain是的,但我傾向於不喜歡「精神」的答案 - 希望OP更新問題。 –

回答

0

Stock s拾取從收集/數組對象stock參考。它不會創建任何對象。

+0

如果'Stock'是'StockRecord'的超類。爲此,它可以打印。 –

1

你在s在每個迭代引用的Stock實例已經存在。但是,您每次都創建一個新的StockRecord實例(這可能會創建其他類的其他實例)。

3

事實並非如此。 For循環使用java迭代器。在循環的每次迭代中,對由stock.iterator()返回的對象調用Iterator.hasNextIterator.nextjava.util集合不會創建新對象,但如果您有自定義集合,它可能會。

另一種可能性是,你在你的電話到吸氣或StockRecord構造本身的身體創建對象。在那些地方尋找「新」。

+1

+1指出自定義的'Iterator'可能潛在實例化新對象。 –

+0

謝謝!我現在明白了。 – user1494530

2

每當一個新的對象被實例化,它的父構造函數被調用自身的構造函數之前(等達Object)。由於StockRecord延伸Stock,當你調用new StockRecord一定Stock構造函數指定StockRecord構造函數之前調用。這就是爲什麼你看到這些打印報告,並按此順序。