我們有兩個分類堆棧。當一個對象被創建時,對象的內存被存儲在堆中。如果該類具有可以使用類名稱調用的靜態方法,該怎麼辦?如果沒有創建對象,那麼它將如何分配內存,如果它確實在哪裏分配內存?靜態方法內存分配
靜態方法內存分配
回答
方法(即代碼)不存儲在對象中;一個類的所有對象將共享一個方法的代碼。不管語言如何(Java,C++或幾乎任何其他語言),任何方法的代碼只有一個副本,不管是否是靜態的。通常有一個特定的內存區域 - 即C++等本地語言中的代碼段,或Java中的特殊堆區 - 加載代碼的地方。
對象的確定內存與類一起創建。即在堆中只創建類的內存(java)只有當我們使用new運算符時,我們才能創建內存。但是對於像Math這樣的類,我們不能實例化。在這種情況下,內存在哪裏創建? – Harini
正如我所說(但我不確定你是否理解),代碼不存儲在對象中,所以這根本不是問題。事實上,它不存儲在任何你可以到達的地方。它存儲在堆的特殊部分的其他地方。 JVM從類文件中加載字節碼,並以某種實現相關的方式對其進行轉換,並使這些方法可用於您的程序。 –
@ user980918 java.lang.Math在運行時不需要太多的內存 - 我能想到的唯一一件事就是包含一個Random對象的靜態變量。類的靜態變量與'Class'對象一起存儲在堆中。 (方法中的局部變量在堆棧中,與方法的靜態無關。) –
它依賴於JVM,但靜態字段通常存儲在堆上的特殊對象中。 (你可以在堆轉儲中看到它)當ClassLoader被卸載時,它的類和靜態「對象」/字段也被清除。
關於靜態「對象」的唯一不同之處是您無法獲得對它的引用。 (但你可以使用反射來訪問字段)
- 1. 動態與靜態內存分配
- 2. gfortran:強制靜態內存分配
- 3. 靜態變量內存分配
- 4. 內存分配靜態變量在非靜態類在.net
- 5. JavaScript類靜態方法內存消耗
- 6. 靜態方法內存消耗
- 7. 靜態內聯方法?
- 8. 線程的靜態和動態內存分配
- 9. 在內核啓動時分配(靜態地)內存
- 10. 主函數內部大量內存的靜態分配
- 11. 靜態類內存分配存儲在哪裏C#
- 12. 內存中的靜態方法和實例方法
- 13. java動態內存分配
- 14. RECV動態內存分配
- 15. 動態分配內存
- 16. 動態內存分配
- 17. 動態內存分配
- 18. 動態內存分配
- 19. 動態內存分配
- 20. Java內存分配解決方法
- 21. 虛擬方法和靜態/動態分配
- 22. 靜態類分配
- 23. 靜態靜態方法?
- 24. 動態分配和重新分配樹中的內存算法
- 25. 靜態鏈接囤積內存分配器
- 26. 計算靜態分配內存的數量
- 27. 如何爲靜態變量分配內存?
- 28. 靜態內存分配和可移植性
- 29. 不能在靜態TLS塊中分配內存
- 30. 類中的靜態變量和內存分配及其使用
哪種語言? – NPE
這是什麼分配內存的目的是爲了? –
從他的評論中可以清楚看出它是Java,所以我添加了一個Java標記。 –