2010-09-07 52 views
8

由於C#中的枚舉在堆棧中,我想知道在哪裏創建了Java的枚舉。在堆棧上?在堆上?在一些神祕的其他地方?Java的枚舉...它們在哪裏創建?

枚舉在C#中比在Java中更原始,這或許可以解釋爲什麼他們在棧上創建...

他們在哪裏?我找不到他們!

感謝

+4

C#*中的枚舉可以放在堆棧上,但它們也可以放在堆上。這一切都取決於他們在哪裏使用(現場/參數/局部變量)。儘管它們是價值類型,也許這就是混淆來自何處?此外,在.NET中,變量的內容存儲在哪裏並不重要;這只是一個實現細節(並且可能會在CLR的不同實現中進行更改)。 – 2010-09-07 16:23:48

+1

出於野性的好奇心,爲什麼你想知道他們是堆棧還是堆? – whaley 2010-09-07 16:26:35

+1

@whaley簡單的好奇心 – ALOToverflow 2010-09-07 16:30:56

回答

9

枚舉在Java中也是對象:例如,枚舉可以有實例變量/方法/構造函數和實現接口。所有這些讓我認爲他們像jvm一樣處理其他對象。

+1

這意味着......他們在堆上。 – romacafe 2010-09-07 18:54:42

6

由於Java枚舉了extendjava.lang.Enum,它們像所有其他Java對象一樣在堆上創建。

+1

從技術上講,它們確實擴展了'Enum'。但它是它們作爲對象的地位(即:它們間接擴展的「對象」),使它們成爲引用類型。 – cHao 2010-09-07 16:31:47

+0

@ 0xA3:它們擴展自己擴展java.lang.Object的java.lang.Enum。 – LukeH 2010-09-07 16:33:35

+0

不,0xA3,我的意思是我說的。看看我發佈的javadocs鏈接。它們擴展java.lang.Enum,該擴展繼而擴展java.lang.Object。 – duffymo 2010-09-07 16:41:56

2

枚舉是Java中的對象,因此它們在堆中。但是,每種類型只有一個固定的數量。 客戶端代碼正在處理這些枚舉對象的引用,所以實際上並沒有在堆上創建任何東西。從規範的角度來看:局部變量引用在堆棧上;對象字段引用位於堆上。

+0

第一句 - 「所以他們在堆棧中」 - 我想你打算打字「讓他們在堆上」;) – serg10 2010-09-07 16:56:44

+0

@ serg10是的。不想要那個#要麼。 – 2010-09-07 17:36:26

2

它們是對象,就像任何其他對象一樣,所以枚舉本身就在堆上。如果一個變量是一個函數變量,那麼保存對枚舉的引用的變量可以在堆棧上,或者如果它是對象的成員,則它可能位於某個其他對象的堆內。