Java只有值传递,因为方法调用时复制的是实参变量的值:基本类型复制数值,引用类型复制地址;形参重赋值不影响实参指向,但可通过相同地址修改对象状态。

Java中只有值传递,没有引用传递——这不是一个拗口的教条,而是由Java的参数传递机制决定的本质事实。理解它,关键不在“引用”这个词本身,而是看**传递过程中,方法内部能否改变实参变量所指向的对象地址**。答案是:不能。方法内对形参的重新赋值(比如 obj = new SomeClass()),不会影响调用方的原始变量。
值传递的本质:复制的是变量的值,不是对象本身
Java里所有变量(包括引用类型变量)都存放在栈上,它们保存的要么是基本类型的值(如 int 的 10),要么是对象在堆中的内存地址(比如 0x7a8b)。当调用方法时,JVM会把实参变量的“当前值”复制一份给形参——这个过程就是值传递。
- 对基本类型:复制的是数值本身(如
int a = 5→ 形参得到独立的 5) - 对引用类型:复制的是那个地址值(如
String s = "hello"→ 形参得到一模一样的地址,指向同一个字符串对象)
为什么修改对象内容看起来像“引用传递”?
因为形参和实参持有相同的地址,所以通过形参调用对象的方法(如 list.add("x")、sb.append("y"))确实能改变堆中对象的状态。但这不等于改变了实参变量本身——它仍然指着原来的地址。
注意区分:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- ✅ 修改对象状态(
obj.setName("Alice"))→ 可见效果,因为操作的是同一块堆内存 - ❌ 修改引用本身(
obj = new Person())→ 实参变量不受影响,它还指着旧对象
一个直观的例子帮你锁定关键点
看这段代码:
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("Hello");
changeRef(sb);
System.out.println(sb.toString()); // 输出 "Hello",不是 "World"
}
static void changeRef(StringBuilder s) {
s = new StringBuilder("World"); // ✅ 改变形参s的指向
// 此时s指向新对象,但main里的sb变量仍指向原对象
}
如果Java是引用传递,sb 应该变成指向 "World";但它没有。这说明:传进去的不是“引用的引用”,只是“引用的值”(即地址)。
类比帮助记忆:就像你把房屋地址写在纸上交给别人
你有一张写着“XX路123号”的纸(引用变量),你把这张纸的复印件交给朋友(值传递)。朋友拿着复印件可以进门装修房子(修改对象内容),但他把复印件涂改成“YY路456号”(s = new ...),并不会让你手上的原件变掉——你还是知道原来那栋房子在哪。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










