Java所有方法参数均为值传递:基本类型传数值副本,修改不影响原变量;引用类型传引用副本,可修改对象内容但重赋值不影响原引用。

Java里所有方法参数都是值传递,没有引用传递。所谓“值传递”,是指调用方法时,把实参的值(即变量中存储的内容)复制一份传给形参;方法内部对形参的修改,不会影响原始变量本身。
基本类型参数:传递的是数值副本
对于 int、double、boolean 等基本类型,实参的值就是具体的数字或真假值。方法接收的是这个值的拷贝,修改形参不影响原变量。
- 例如:int a = 10; method(a); —— 传入的是 10 的副本,method 内部改 a 不会影响外面的 a
- 即使在 method 中执行 a = 20;,也只改变形参 a,原始变量仍为 10
引用类型参数:传递的是引用(地址)的副本
对于 String、ArrayList、自定义对象等引用类型,变量中存储的其实是一个指向堆内存对象的引用(可理解为内存地址)。值传递机制下,传入的是这个引用的副本,而不是对象本身。
- 所以方法内通过形参调用对象方法(如 list.add()),会真实修改原对象,因为两个引用指向同一个对象
- 但如果在方法内让形参指向新对象(如 list = new ArrayList();),则只是改变了形参引用的指向,原变量仍指向旧对象
常见误解澄清:String 为什么不可变?
String 是引用类型,但它是不可变类(immutable)。每次“修改”字符串(如 s += "abc")都会生成新对象,原引用不变。因此即使传入 String,方法内重新赋值也不会影响外部变量。
立即学习“Java免费学习笔记(深入)”;
- String s = "hello"; change(s); → change 方法里写 s = "world";,外部 s 还是 "hello"
- 这不是因为 String 是值类型,而是因为 String 对象内容不可变 + 引用被重新赋值
如何真正实现“类似引用传递”的效果?
如果希望方法能改变外部变量所指向的对象内容,有几种实用方式:
- 使用可变容器:比如传入 StringBuilder 或 AtomicReference,在方法内调用其修改方法
- 返回新值并由调用方重新赋值:obj = modify(obj);
- 封装多个值到一个对象中传入,统一修改其字段(即“出参”思想)










