java類中成員變量初始化後存放在堆內存中還是棧內存中?

答案是堆內存。


之前明明看過java類初始化過程的,

但一下子看到這樣的題目,還是懵了。

百度後,那些帖子的回覆各有各說,

腦袋都看得要塞住了,還是看書求證吧。


李剛的《瘋狂Java》第128頁開始,有一個類從初始化開始,

在內存發生什麼變化的詳細過程,這裏簡單記錄一下。

class Person{
    String name;
    static int eyeNum;
}


上面這個Person類,有成員變量name和靜態成員變量eyeNum了,

當執行下面語句:

Person p1 = new Person();
Person p2 = new Person();
p1.name = "A";
p2.name = "B"
p1.eyeNum = 2;
p2.eyeNum = 3;


  1. Person p1 = new Person();第一次使用Person類,系統在堆內存爲Person類分配空間,其中也包括了靜態成員變量eyeNum(初始值爲0)。

  2. 然後,在堆內存new一個Person對象,其中name爲null,然後將p1指向這個對象。

  3. 接着new p2時,因爲類已經初始化了,只需重複第2步就行了。

  4. p1.name = "A"; 讓堆內存中p1對象的name指向一個"A"字符串。

  5. p1.eyeNem = 2;此時通過Person對象修改Person的類屬性(因爲是靜態成員變量),Person類的eyeNum屬性被賦值爲2。





Person類









eyeNum →2






p1
------
---------------------





第二個Person對象


第一個Person對象



p2
------

name →
"B"
name →
"A"











棧內存











畫的很難看,不過大概就是上面這樣。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章