java只有值传递,没有引用传递;基本类型传递数值副本,引用类型传递地址副本,二者均不改变实参本身指向。

Java 中没有引用传递,只有值传递。这个结论不是经验之谈,而是 Java 语言规范明确规定的。区分的关键不在于“传的是什么类型”,而在于“传的是什么内容”——所有参数,无论基本类型还是对象,传递的都是值的副本;差别只在于这个“值”本身是什么。
基本类型:传递的是数值本身的副本
比如 int a = 5,变量 a 在栈中直接存着数字 5。当把它传进方法时,JVM 复制一个 5 给形参,两个变量各自独立占用不同内存空间。
- 方法内修改形参,不影响原始变量
- 因为改的只是副本,和原值毫无关系
例如:
void change(int x) { x = 100; }
int a = 5;
change(a);
System.out.println(a); // 输出仍是 5
引用类型:传递的是对象地址的副本
比如 Person p = new Person("Alice"),变量 p 存的不是对象本身,而是堆中那个 Person 实例的内存地址(如 0x7f8a)。传参时,JVM 复制的是这个地址值,不是对象,也不是“引用本身”。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 形参和实参持有相同的地址 → 能通过它访问并修改同一个对象的内容(如
p.name = "Bob") - 但若在方法内让形参指向新对象(如
p = new Person("Charlie")),不会改变实参原来的指向
例如:
void modify(Person p) {
p.name = "Bob"; // ✅ 修改成功,外部可见
p = new Person("New"); // ❌ 外部 p 仍指向原对象
}
判断是否为引用传递的唯一标准
看能否在方法内让实参变量本身指向另一个对象或变为 null:
- 如果可以 → 是引用传递(如 C++ 的
int& x、C# 的ref) - 如果不可以 → 是值传递(Java 属于这一类)
Java 中,你永远无法通过形参让实参“换掉原来指向的对象”,只能用它去操作那个对象内部的状态。这正是“传递地址副本”与“传递地址本身”的本质区别。
本质上,Java 的“引用”是数据,和 int 一样可被复制、赋值、丢弃——它只是个保存地址的变量。把“引用”当成一种数据类型,把“引用传递”当成一种机制,就不会混淆了。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










