答案是堆內存。
之前明明看過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;
Person p1 = new Person();第一次使用Person類,系統在堆內存爲Person類分配空間,其中也包括了靜態成員變量eyeNum(初始值爲0)。
然後,在堆內存new一個Person對象,其中name爲null,然後將p1指向這個對象。
接着new p2時,因爲類已經初始化了,只需重複第2步就行了。
p1.name = "A"; 讓堆內存中p1對象的name指向一個"A"字符串。
p1.eyeNem = 2;此時通過Person對象修改Person的類屬性(因爲是靜態成員變量),Person類的eyeNum屬性被賦值爲2。
Person類 | |||||||||
eyeNum →2 | |||||||||
p1 | ------ | -- | ---------------- | --- | → | ||||
→ | 第二個Person對象 | 第一個Person對象 | |||||||
p2 | ------ | name → | "B" | name → | "A" | ||||
棧內存 | 堆 | 內 | 存 |
畫的很難看,不過大概就是上面這樣。