面向对象学习笔记2 - Java类的实例化与内存解析
前言
在Java编程中,理解对象实例化的内存机制是掌握面向对象编程的核心。本文将以Person类为例,结合内存模型(栈、堆、方法区),深入剖析单个对象、多个对象以及引用赋值的底层内存变化。
一、内存模型基础概念
- 栈(Stack):存储方法调用和局部变量(如基本类型变量、对象引用地址)
- 堆(Heap):存放所有new创建的对象实体(包括对象属性)
- 方法区(Method Area):存储类结构信息(如类模板、常量池)
二、代码案例与内存解析
1. 单个对象的内存分配
Person p1 = new Person();
p1.name = "杰克";
p1.age = 24;
p1.gender = '男';
内存变化过程:
main()方法被调用时,其栈帧压入栈内存new Person()在堆中开辟内存空间(假设地址0x2333),成员属性初始化为默认值:name = nullage = 0gender = '\u0000'
- 栈中局部变量
p1存储堆地址0x2333 - 通过
p1.xxx赋值操作覆盖默认值:0x2333地址的name指向字符串常量池中的"杰克"age和gender被更新为24和'男'
2. 多个独立对象的内存分配
Person p1 = new Person(); // 地址0x2333
p1.name = "杰克";
//...其他赋值
Person p2 = new Person(); // 地址0x2233
p2.name = "露丝";
//...其他赋值
p1.age = 26; // 修改0x2333的age
关键点:
- 每个
new操作都会在堆中开辟独立内存空间 p1和p2指向不同地址(0x2333和0x2233),彼此属性互不影响- 修改
p1.age仅影响0x2333地址对应的数据
3. 引用赋值引发的内存共享
Person p3 = p1;
p3.age = 28;
内存行为解析:
p3 = p1使p3指向p1的堆地址0x2333- 通过
p3修改age时,实际修改的是0x2333地址的数据 - 此时
p1.age也会变为28,因为二者指向同一内存空间
三、关键总结与注意事项
- 对象实体唯一性:每个
new语句创建一个独立堆对象 - 引用变量的本质:局部变量存储的是堆地址,而非对象本身
- 内存共享陷阱:多个引用指向同一对象时,修改行为会相互影响
- 默认值规则:未显式赋值的对象属性遵循:
- 引用类型:
null - 数值类型:
0 - 布尔类型:
false - 字符类型:
'\u0000'
- 引用类型:
四、思考题
- 如果执行
Person p4 = null; p4.age = 10;会发生什么? - 如何理解字符串
"杰克"在内存中的存储位置?
理解内存模型是调试复杂程序的基础,建议通过调试工具(如IDEA的Memory View)实际观察内存变化。

浙公网安备 33010602011771号