java如何引用传递
值传递与引用传递的区别
Java中参数传递机制是值传递,即传递的是变量的副本(基本类型直接传递值,对象类型传递引用的副本)。引用传递(如C++的&)在Java中不存在,但可以通过对象引用的特性模拟类似效果。
通过对象引用模拟引用传递
虽然Java无法直接修改原始引用的指向,但可以通过修改对象内部状态实现类似效果:
class Wrapper {
int value;
Wrapper(int value) { this.value = value; }
}
public class Main {
static void modifyValue(Wrapper wrapper) {
wrapper.value = 100; // 修改对象内部状态
}
public static void main(String[] args) {
Wrapper w = new Wrapper(10);
modifyValue(w);
System.out.println(w.value); // 输出100
}
}
数组作为参数传递
数组是对象,传递的是引用副本,修改数组内容会影响原始数组:
public class Main {
static void modifyArray(int[] arr) {
arr[0] = 99;
}
public static void main(String[] args) {
int[] array = {1, 2, 3};
modifyArray(array);
System.out.println(array[0]); // 输出99
}
}
不可变对象的局限性
String等不可变对象无法通过方法修改原始值,因为任何修改都会生成新对象:
public class Main {
static void modifyString(String str) {
str = "modified"; // 仅影响局部副本
}
public static void main(String[] args) {
String s = "original";
modifyString(s);
System.out.println(s); // 仍输出"original"
}
}
使用容器类实现间接修改
通过AtomicReference或自定义容器类持有可变状态:

import java.util.concurrent.atomic.AtomicReference;
public class Main {
static void modifyAtomic(AtomicReference<String> ref) {
ref.set("modified");
}
public static void main(String[] args) {
AtomicReference<String> atomicRef = new AtomicReference<>("original");
modifyAtomic(atomicRef);
System.out.println(atomicRef.get()); // 输出"modified"
}
}
关键总结
- Java严格采用值传递,对象类型传递的是引用副本。
- 修改对象内部状态会影响原始对象,但重新赋值引用不会。
- 需要完全模拟引用传递时,需使用包装类或容器对象。






