java所有参数传递都是值传递:基本类型传数值副本,引用类型传地址副本,形参与实参内存隔离、互不影响。

因为Java所有参数传递都是值传递,基本类型传的是数值本身的副本,形参和实参各自占用独立内存空间,互不关联。
形参是独立的局部变量
方法定义时写的参数(比如 int x)不是外部变量的别名,而是一个全新分配在栈上的局部变量。调用时,系统把实参当前的值(如 5)复制一份给它。就像把黑板上的数字抄到笔记本上——改笔记本,黑板不会变。
- 实参变量(如 int a = 5;)有自己的栈地址
- 形参 x 有另一个完全不同的栈地址
- 两者初始值相同,但内存位置、生命周期、作用域彼此隔离
栈帧隔离保证物理断开
每次方法调用都会创建一个独立的栈帧,里面存放本次调用的所有形参和局部变量。main 方法里的 a 在自己的栈帧中,被调方法里的 x 在另一个栈帧中。两个栈帧之间没有指针、不共享内存、也不允许越界访问。
- 方法执行完,对应栈帧立即销毁,形参内存随之释放
- 实参所在的栈帧不受任何影响,值保持原样
- 这种机制既是语言规范强制要求,也是安全设计的基础
和引用类型对比更清楚本质
Java统一采用值传递,区别只在于所传“值”的含义:
- 基本类型:传的是数据本身(5、true、'c')→ 改副本,原数据不动
- 引用类型:传的是对象地址(如 0x1a2b3c)→ 可顺着地址修改对象内容,但给形参重新赋地址(如 list = new ArrayList()),不会改变实参持有的旧地址
所以不是“基本类型特殊”,而是所有类型都传值,只是所传之“值”的含义不同。
直接赋值操作只动形参自己
像 x = x + 1、x--、x = 100 这类语句,都是对形参变量自身内存单元的写入。编译器明确知道操作目标是当前栈帧里的那个变量,不会、也不能去寻址外部变量。
- 哪怕形参和实参名字相同(如都叫 num),它们仍是两个实体
- 没有语言机制支持通过形参反向定位或修改调用方的变量
- 这种单向、不可逆的数据流向,是值传递最核心的表现











