java类中成员变量初始化后存放在堆内存中还是栈内存中?
2014-12-03 09:52
246 查看
答案是堆内存。
之前明明看过java类初始化过程的,
但一下子看到这样的题目,还是懵了。
百度后,那些帖子的回复各有各说,
脑袋都看得要塞住了,还是看书求证吧。
李刚的《疯狂Java》第128页开始,有一个类从初始化开始,
在内存发生什么变化的详细过程,这里简单记录一下。
上面这个Person类,有成员变量name和静态成员变量eyeNum了,
当执行下面语句:
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。
画的很难看,不过大概就是上面这样。
之前明明看过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" | ||||
栈内存 | 堆 | 内 | 存 |
相关文章推荐
- 【转】Java类成员变量默认初始化规则
- Java类中各成员的加载和内存存放位置
- Java类成员变量、普通成员变量、初始化块、构造方法的初始化和执行顺序
- java类同时引用父类和接口的成员变量,需要指明是父类的还是接口的
- 什么变量在堆内存里存放,什么变量在栈内存里存放
- 21:什么变量在堆内存里存放,什么变量在栈内存里存放
- 成员变量和局部变量的初始化和内存运行机制分析
- 什么变量在堆内存里存放,什么变量在栈内存里存放
- Java类成员变量、普通成员变量、初始化块、构造方法的初始化和执行顺序
- Java类成员变量的初始化顺序
- 不管结构变量在栈还是堆中分配。结构中成员的内存布局跟定义的是一样的
- java成员变量和局部变量的初始化和内存中的运行机制
- 【转】Java类成员变量默认初始化规则
- 《转载》什么变量在堆内存里存放,什么变量在栈内存里存放
- Java类成员变量、普通成员变量、初始化块、构造方法的初始化和执行顺序
- 5.3.2 成员变量的初始化和内存中的运行机制
- 成员变量的初始化和内存中的运行机制
- Java类成员变量、普通成员变量、初始化块、构造方法的初始化和执行顺序
- 什么变量在堆内存里存放,什么变量在栈内存里存放
- 全局变量,静态全局变量,静态局部变量,类静态成员内存分配与初始化问题