java中类与对象的内存分配机制核心是“栈存引用、堆存对象、方法区存结构”:成员变量默认初始化后存于堆;对象变量名(如cat1)作为引用存于栈,仅保存堆中地址;类的方法、字段类型等结构信息存于方法区(元空间),加载一次全局共享。
java中类与对象的内存分配机制,核心在于理解“栈存引用、堆存对象、方法区存结构”这三者分工。掌握它,才能真正看懂变量为什么有时改了没效果、对象传参为何能改变原值、null异常从何而来。
成员变量存在哪?堆里默认初始化
成员变量(也叫属性、字段)属于类的一部分,但它的值只在对象创建时才实际分配空间——这个空间就在堆内存中。
- 每次用
new Cat()创建对象,JVM 就在堆中划出一块区域,存放该对象的所有成员变量 - 即使你没写
name = "小黄",系统也会按规则给它们默认值:int是 0、String是null、boolean是false - 这些默认值不是写死的,而是由 JVM 按照数据类型统一设定,和数组初始化规则一致
对象变量名在哪?栈里只存地址
像 Cat cat1; 或 Cat cat1 = new Cat(); 中的 cat1,它本身不存对象,只存一个指向堆中对象的地址,这个变量就放在栈内存里。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 栈中的
cat1是局部变量,生命周期绑定当前方法;方法结束,cat1这个引用就消失了 - 只要还有其他变量(比如另一个
cat2)也指向同一个堆地址,对象就不会被回收 -
cat1 = null;的作用,就是把栈里的地址擦掉,让堆中对象变成“可能被回收”的状态
方法和代码在哪?方法区加载一次就够了
类的定义信息——包括所有方法签名、成员变量类型、静态常量、字节码——都存在方法区(HotSpot 中叫元空间)。这部分内容在类第一次被使用(如 new 对象或调用静态方法)时加载,之后重复使用不再加载。
- 你写一百个
Cat对象,方法区里只有一份public void miaow()的结构信息 - 每次调用
cat1.miaow(),JVM 才会在栈中为这次调用单独开辟一个栈帧,存放形参、局部变量等 - 方法执行完,栈帧弹出,局部变量消失,但方法区里的定义一直都在
传参怎么影响对象?基本类型传值,引用类型传地址
方法调用时的参数传递,本质是“拷贝”:拷贝的是值,只是这个“值”对不同类型含义不同。
- 传
int a:拷贝的是数字本身(比如 10),方法内改它,不影响外面的a - 传
Cat c:拷贝的是对象地址(比如 0x7a8b),方法内通过这个地址修改c.name,原对象就被改了 - 但如果在方法里写了
c = new Cat(),那就相当于把栈帧里的“地址变量”重新指向新堆地址,原对象不受影响
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










