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