java参数传递本质是值传递:基本类型传值副本,互不影响;引用类型传地址副本,可修改堆中对象属性但重赋值形参不改变原引用。

基本类型参数传递:值的独立拷贝
当传入 int、double、boolean 等基本类型时,Java 在栈中为形参创建一个**完全独立的值副本**。原始变量和形参各自占用不同栈空间,互不影响。
例如:
int x = 10;
modify(x); // 调用时把 10 复制一份给形参 num
方法内修改 num = 20,只改了副本,main 栈帧里的 x 仍是 10。
关键点:
• 实参和形参在栈中是两块分离的内存
• 修改形参 = 修改副本,不触碰原始值
• 基本类型没有“共享对象”概念,纯数值搬运
引用类型参数传递:地址副本 + 共享堆对象
当传入 Person、String、ArrayList 等引用类型时,Java 传递的是**对象地址的副本**——不是对象本身,也不是直接引用,而是那个“指向堆中对象的指针”的拷贝。
内存布局示意:
栈中 person 变量 → 存储地址 0x01
↓
堆中 Person 对象(name="Alice")← 被多个栈变量可能共同指向
因此:
• 修改对象属性(如 p.name = "Bob")→ 操作的是堆中同一块内存 → 主调方可见变化
• 重赋值形参(如 p = new Person("Tom"))→ 仅改变副本地址 → 不影响原变量 person 的指向
图解核心:栈与堆的分工不可混淆
理解传递机制必须分清两层存储:
• 栈(Stack):存局部变量、方法参数、执行上下文。生命周期短,方法结束即销毁。
• 堆(Heap):存 new 出来的对象、数组。由 GC 管理,可被多个栈变量同时引用。
所谓“传递”,本质是把实参的内容(值 or 地址)复制进形参所在的栈空间;
而“能否影响外部”,取决于这个内容是否指向堆中同一块可变区域。
常见误区澄清:
• String 不可变 ≠ 传递机制特殊 → 它仍是引用类型,只是内部字符数组 final 且方法返回新对象
• 数组是引用类型 → arr[0] = 5 改的是堆中数组元素,主调方可感知
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











