2012-02-27 174 views
0

對象存儲在堆中,當它是一個類實例變量,並在堆棧中時,它是一個函數變量?那是對的嗎?存儲對象實例在哪裏?

+1

存儲對象的位置是實現細節。依靠它自己的危險。 – cHao 2012-02-27 07:12:21

+0

@cHao:的確如此。我不知道.Net的引擎,但Google的V8 JavaScript引擎(JavaScript是另一個垃圾回收環境)足夠聰明,可以對代碼進行靜態分析,並確定對象只在函數中使用,然後纔會發佈 - 並將它們放在堆棧上,以便在返回時立即回收。 – 2012-02-27 07:31:28

回答

0

引用存儲在堆棧(不是全部,雖然情況)

注:只有局部變量。對於實例和類變量,它們是對象的一部分,因此也是堆。

雖然對象存儲在堆上。

  • 類對象,包括方法代碼和靜態字段:堆。
  • 對象,包括實例字段:堆。
  • 局部變量和調用方法:堆棧
+0

非常真實..所以它意味着他們將被存儲在堆 – BlackFire27 2012-02-27 07:11:54

+0

不。值類型有些古怪(它們仍然是對象,但通常可以在堆棧中找到)。 – cHao 2012-02-27 07:13:43

+0

看看我已經更新了答案...... – 2012-02-27 07:18:19

2

棧是地方的方法和局部變量存儲。

堆是存儲對象及其實例變量的存儲位置。

現在實例變量是任何變量,沒有「靜態」字段修飾符,它們是在類主體內部以及任何類的方法主體之外定義的。

只要它們的封閉對象在範圍內,實例變量就在範圍內。實例變量是包含它的對象的一部分,不能獨立於它。

希望所以它會清除你的概念。

+0

沒有清理我的。它似乎只是回答一切,但實際的問題。 – cHao 2012-02-27 07:18:18

+0

哪部分未清除? – Java 2012-02-27 07:20:02

+0

實際上是在問題的部分? :P你周圍有點跳舞,畫出各種漂亮的點,但你並沒有真正想過以真正回答問題的方式連接它們。 – cHao 2012-02-27 07:22:41