java方法参数传递只有值传递:基本类型传数值副本,修改不影响原变量;引用类型传地址副本,修改对象内容会影响外部,但重赋值不会改变原引用指向。

Java 方法参数传递只有值传递一种机制,区别不在于“传值还是传引用”,而在于“值”本身是什么:基本类型传的是数据值的副本,引用类型传的是对象地址的副本。
基本数据类型:传的是数值本身
变量直接在栈中存值(比如 int a = 5,栈里就放着数字 5)。调用方法时,JVM 把这个值完整复制一份给形参,两个变量在栈中是独立空间。
- 方法内修改形参(如 x = 100),只改副本,原始变量完全不受影响
- 交换操作无效:swap(int x, int y) 交换的只是两份数值副本,原变量地址和值都不变
- 生命周期、内存位置、修改动作三者全无关联
引用数据类型:传的是地址值
变量存的是堆中对象的内存地址(比如 List
- 形参和实参的地址副本指向同一个堆对象 → 调用 list.add()、obj.setName() 等会改变外部可见状态
- 若在方法内执行 list = new ArrayList() 或 obj = null,只是让形参副本指向新地址,原变量仍指向旧对象
- String、Integer 等不可变类也遵循此规则:“修改”实际是创建新对象并让副本指向它,原引用不变
关键判断依据:看操作目标是什么
一句话区分行为结果:
- 外部能感知变化 → 操作的是堆中对象的内容(如 set、add、setName)
- 外部无变化 → 操作的是形参引用副本自身(如 = 赋值、new、null)
验证方式:在方法末尾打印实参对象的 hashCode(),若与外部一致,说明指向没变;若内部重赋值,不影响外部结果。
别被表象误导:Java 没有引用传递
C++ 的引用传递(void f(Person& p))允许在方法内写 p = new Person() 直接改变外部变量指向;Java 做不到——这正是本质区别。Java 设计上更安全,避免方法意外篡改调用方的引用指向。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











