2011-10-06 109 views
10

我們有兩個分類堆棧。當一個對象被創建時,對象的內存被存儲在堆中。如果該類具有可以使用類名稱調用的靜態方法,該怎麼辦?如果沒有創建對象,那麼它將如何分配內存,如果它確實在哪裏分配內存?靜態方法內存分配

+1

哪種語言? – NPE

+2

這是什麼分配內存的目的是爲了? –

+0

從他的評論中可以清楚看出它是Java,所以我添加了一個Java標記。 –

回答

1

方法(即代碼)不存儲在對象中;一個類的所有對象將共享一個方法的代碼。不管語言如何(Java,C++或幾乎任何其他語言),任何方法的代碼只有一個副本,不管是否是靜態的。通常有一個特定的內存區域 - 即C++等本地語言中的代碼段,或Java中的特殊堆區 - 加載代碼的地方。

+0

對象的確定內存與類一起創建。即在堆中只創建類的內存(java)只有當我們使用new運算符時,我們才能創建內存。但是對於像Math這樣的類,我們不能實例化。在這種情況下,內存在哪裏創建? – Harini

+0

正如我所說(但我不確定你是否理解),代碼不存儲在對象中,所以這根本不是問題。事實上,它不存儲在任何你可以到達的地方。它存儲在堆的特殊部分的其他地方。 JVM從類文件中加載字節碼,並以某種實現相關的方式對其進行轉換,並使這些方法可用於您的程序。 –

+0

@ user980918 java.lang.Math在運行時不需要太多的內存 - 我能想到的唯一一件事就是包含一個Random對象的靜態變量。類的靜態變量與'Class'對象一起存儲在堆中。 (方法中的局部變量在堆棧中,與方法的靜態無關。) –

2

它依賴於JVM,但靜態字段通常存儲在堆上的特殊對象中。 (你可以在堆轉儲中看到它)當ClassLoader被卸載時,它的類和靜態「對象」/字段也被清除。

關於靜態「對象」的唯一不同之處是您無法獲得對它的引用。 (但你可以使用反射來訪問字段)