java所有方法参数均为值传递:基本类型传数值副本,引用类型传地址副本。前者修改不影响原变量,后者可修改对象内容但无法改变原引用指向。

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











