2012-01-05 91 views
-1
for(int i = 0; i < 3; i++){ 

Object obj = new Object(); 

} 

將在3個對象來創建或唯一一個被重新實例3倍的對象? 引擎蓋下發生了什麼?使用此for循環時將創建多少個對象?

+0

是指在循環執行完成後將創建多少個對象或將在內存中存儲多少個對象? – StuperUser 2012-01-05 14:53:57

回答

7

三個對象將被創建,因爲new Object()將被調用三次。

有沒有這樣的概念作爲一個對象是「重新實例化」。

現在同樣的堆棧空間很可能被用來存儲從構造函數返回的引用,所以你可能會說,在某些方面,只有一個變量 ,這是對循環的每個迭代重新初始化。 ..但變量和對象是非常不同的,重要的是你在腦海中分開這兩個概念。


在其他方面真的有三個獨立的變量,所以請不要認爲這太過分了。你使用「new」關鍵字

+1

使用轉義分析,您可能會發現沒有任何對象被創建,因爲它們沒有做任何事情,也沒有被使用。我相信JRockit的優化可以消除這些代碼。 – 2012-01-05 14:54:34

+0

一旦第二次分配發生,在循環的第二次迭代開始時由'obj'引用的內存中的對象會發生什麼?是在循環的所有迭代的執行完成後還是在第二次迭代結束時收集的?或方法的結束?有關係嗎? – StuperUser 2012-01-05 14:56:23

+1

@StuperUser:你是指對象本身?它立即成爲垃圾收集的*符合條件*,但可以立即或稍後收集......不保證。 – 2012-01-05 15:05:29

1

你不能「重新實例化」一個對象。每次調用new關鍵字時,都會創建一個新對象,因此會創建3個對象。

1

任何時候,你會得到一個新的對象。由於引用位於本地範圍內,因此該對象將在循環條件之後超出範圍,併成爲垃圾回收的候選對象。

0

你正在創建的堆內存三個不同的對象,但在循環後,你只能在你創造的最後一個對象訪問。

編輯:對於「你可以」我的意思是通過指針你只能訪問最後一個對象。每當這個詞new使用新的對象

+0

實際上,考慮到聲明變量的範圍,他可以'在循環完成後訪問任何對象我猜你可以說零對象被創建了! – Perception 2012-01-05 15:02:32

+0

噢,你是完全正確的,但我的意思是,在範圍是「正確」的不同情況下,他只能訪問在創建的「最後」對象上 – DonCallisto 2012-01-05 15:03:47

0

創建,所以您要創建3個對象。雖然給定了聲明變量的範圍,但是一旦循環完成,就不能使用任何對象。