面向对象学习笔记2 - Java类的实例化与内存解析

前言

在Java编程中,理解对象实例化的内存机制是掌握面向对象编程的核心。本文将以Person类为例,结合内存模型(栈、堆、方法区),深入剖析单个对象、多个对象以及引用赋值的底层内存变化。


一、内存模型基础概念

  • 栈(Stack):存储方法调用和局部变量(如基本类型变量、对象引用地址)
  • 堆(Heap):存放所有new创建的对象实体(包括对象属性)
  • 方法区(Method Area):存储类结构信息(如类模板、常量池)

二、代码案例与内存解析

1. 单个对象的内存分配

Person p1 = new Person();
p1.name = "杰克";
p1.age = 24;
p1.gender = '男';

内存变化过程

  1. main()方法被调用时,其栈帧压入栈内存
  2. new Person()在堆中开辟内存空间(假设地址0x2333),成员属性初始化为默认值:
    • name = null
    • age = 0
    • gender = '\u0000'
  3. 栈中局部变量p1存储堆地址0x2333
  4. 通过p1.xxx赋值操作覆盖默认值:
    • 0x2333地址的name指向字符串常量池中的"杰克"
    • agegender被更新为24和'男'

2. 多个独立对象的内存分配

Person p1 = new Person(); // 地址0x2333
p1.name = "杰克";
//...其他赋值

Person p2 = new Person(); // 地址0x2233
p2.name = "露丝";
//...其他赋值

p1.age = 26; // 修改0x2333的age

关键点

  • 每个new操作都会在堆中开辟独立内存空间
  • p1p2指向不同地址(0x23330x2233),彼此属性互不影响
  • 修改p1.age仅影响0x2333地址对应的数据

3. 引用赋值引发的内存共享

Person p3 = p1; 
p3.age = 28;

内存行为解析

  • p3 = p1使p3指向p1的堆地址0x2333
  • 通过p3修改age时,实际修改的是0x2333地址的数据
  • 此时p1.age也会变为28,因为二者指向同一内存空间

三、关键总结与注意事项

  1. 对象实体唯一性:每个new语句创建一个独立堆对象
  2. 引用变量的本质:局部变量存储的是堆地址,而非对象本身
  3. 内存共享陷阱:多个引用指向同一对象时,修改行为会相互影响
  4. 默认值规则:未显式赋值的对象属性遵循:
    • 引用类型:null
    • 数值类型:0
    • 布尔类型:false
    • 字符类型:'\u0000'

四、思考题

  1. 如果执行Person p4 = null; p4.age = 10;会发生什么?
  2. 如何理解字符串"杰克"在内存中的存储位置?

理解内存模型是调试复杂程序的基础,建议通过调试工具(如IDEA的Memory View)实际观察内存变化。

posted @   谁来着?  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示