由於C#中的枚舉在堆棧中,我想知道在哪裏創建了Java的枚舉。在堆棧上?在堆上?在一些神祕的其他地方?Java的枚舉...它們在哪裏創建?
枚舉在C#中比在Java中更原始,這或許可以解釋爲什麼他們在棧上創建...
他們在哪裏?我找不到他們!
感謝
由於C#中的枚舉在堆棧中,我想知道在哪裏創建了Java的枚舉。在堆棧上?在堆上?在一些神祕的其他地方?Java的枚舉...它們在哪裏創建?
枚舉在C#中比在Java中更原始,這或許可以解釋爲什麼他們在棧上創建...
他們在哪裏?我找不到他們!
感謝
枚舉在Java中也是對象:例如,枚舉可以有實例變量/方法/構造函數和實現接口。所有這些讓我認爲他們像jvm一樣處理其他對象。
這意味着......他們在堆上。 – romacafe 2010-09-07 18:54:42
由於Java枚舉了extendjava.lang.Enum
,它們像所有其他Java對象一樣在堆上創建。
枚舉是Java中的對象,因此它們在堆中。但是,每種類型只有一個固定的數量。 客戶端代碼正在處理這些枚舉對象的引用,所以實際上並沒有在堆上創建任何東西。從規範的角度來看:局部變量引用在堆棧上;對象字段引用位於堆上。
第一句 - 「所以他們在堆棧中」 - 我想你打算打字「讓他們在堆上」;) – serg10 2010-09-07 16:56:44
@ serg10是的。不想要那個#要麼。 – 2010-09-07 17:36:26
它們是對象,就像任何其他對象一樣,所以枚舉本身就在堆上。如果一個變量是一個函數變量,那麼保存對枚舉的引用的變量可以在堆棧上,或者如果它是對象的成員,則它可能位於某個其他對象的堆內。
C#*中的枚舉可以放在堆棧上,但它們也可以放在堆上。這一切都取決於他們在哪裏使用(現場/參數/局部變量)。儘管它們是價值類型,也許這就是混淆來自何處?此外,在.NET中,變量的內容存儲在哪裏並不重要;這只是一個實現細節(並且可能會在CLR的不同實現中進行更改)。 – 2010-09-07 16:23:48
出於野性的好奇心,爲什麼你想知道他們是堆棧還是堆? – whaley 2010-09-07 16:26:35
@whaley簡單的好奇心 – ALOToverflow 2010-09-07 16:30:56