首页 > 编程语言 > 详细

java类中成员变量初始化后存放在堆内存中还是栈内存中?

时间:2014-12-04 15:08:18      阅读:107      评论:0      收藏:0      [点我收藏+]

答案是堆内存。

?

之前明明看过java类初始化过程的,

但一下子看到这样的题目,还是懵了。

百度后,那些帖子的回复各有各说,

脑袋都看得要塞住了,还是看书求证吧。

?

李刚的《疯狂Java》第128页开始,有一个类从初始化开始,

在内存发生什么变化的详细过程,这里简单记录一下。

1
2
3
4
class?Person{
????String?name;
????static?int?eyeNum;
}

?

上面这个Person类,有成员变量name和静态成员变量eyeNum了,

当执行下面语句:

1
2
3
4
5
6
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" ? ?
? ? ? ? ? ? ? ? ? ?
栈内存 ? ? ? ? ? ?

?

?

画的很难看,不过大概就是上面这样。

?

bubuko.com,布布扣

欢迎大家访问我的个人网站 萌萌的IT人

java类中成员变量初始化后存放在堆内存中还是栈内存中?

原文:http://aijuans.iteye.com/blog/2162856

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!