在學校我的老師教我們關于物件和非靜態變數(在 Java 中),她解釋說,如果我們宣告一個非靜態全域變數,比如int a在一個類中并創建一個類的物件obj,那么我們可以使用該物件訪問非靜態變數a使用點運算子 ( obj.a)來創建靜態變數。
然后她說,如果我們創造另一個物件(比如,obj1同一類和訪問),a從它用obj1.a1,那么這將是獨立的obj.a,因為OBJ和OBJ1是不同的物件,因此obj.a,并obj1.a有不同的存盤位置。
我的問題是,系統是否有物件的真實記憶體位置/地址?比如,記憶體分配是否類似于為物件分配地址并在其下存盤各種非靜態變數(就像物件的記憶體位置被磁區以適應不同的非靜態變數)?或者物件只是一個假設元素,用于指向和訪問各種非靜態變數,這些變數實際上在存盤中具有真實的記憶體位置?
Tl; dr:存盤是為物件分配記憶體位置,還是僅為物件下的非靜態變數這樣做,并且物件是一個假設元素,在存盤中沒有實際記憶體位置?
如果回答這個問題的人保持對初學者的友好,我將不勝感激,因為我現在才 10 年級。
uj5u.com熱心網友回復:
一切都需要一個記憶體位置:每個物件,每個非靜態變數和靜態變數。
如果它們沒有記憶體位置,則它們基本上不存在。物件也需要一個記憶體位置,否則我們將不知道哪些非靜態變數與哪些物件相關。
uj5u.com熱心網友回復:
- 硬碟不分配任何東西。JVM 進行記憶體分配。
- 在記憶體分配方面,靜態無關緊要。靜態僅意味著該變數的值可用于該類的所有實體(如果是私有的)或任何訪問該變數的類(如果是公共的)。
例如:
public class MyClass {
private static String value = "myStaticVariable";
}
MyClass 的所有實體都可以訪問值并獲得“myStaticVariable”。如果這些實體中的任何一個更改了該值,則所有實體都將反映該更改。
至于如何執行記憶體分配,請將實體化中的所有內容視為指向記憶體位置的指標。如果它是一個原語,則分配適當大小的記憶體量,并且類實體指向該記憶體位置。Java 對我們隱藏了這一點,因為我們真的不需要知道內部作業原理。如果變數指向另一個類,那么它指向另一個實體,而該實體又指向它自己的成員變數。如果稍后重新分配變數,則原始記憶體分配將標記為垃圾回收,以便在以后某個不可預見的時間進行處理。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/315777.html
