基本类型参数传递的是值的副本,形参与实参内存独立、互不影响;java所有类型均为值传递,区别仅在于所传“值”的含义:基本类型传数据本身,引用类型传地址。

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










