java如何传递引用
理解Java的引用传递机制
Java中所有对象变量的传递都是通过值传递,但传递的值是对象的引用(即内存地址)。基本数据类型(如int、float)直接传递值,而对象类型传递引用的副本。
通过对象引用修改内容
尽管传递的是引用的副本,但通过该引用可以修改对象内部的状态。例如:
class MyObject {
int value;
}
public class Main {
static void modifyObject(MyObject obj) {
obj.value = 100; // 修改引用指向的对象内容
}
public static void main(String[] args) {
MyObject obj = new MyObject();
obj.value = 50;
modifyObject(obj);
System.out.println(obj.value); // 输出100
}
}
引用副本的特性
方法内对引用本身重新赋值不会影响原始引用。例如:
static void reassignReference(MyObject obj) {
obj = new MyObject(); // 仅影响局部变量
obj.value = 200;
}
public static void main(String[] args) {
MyObject obj = new MyObject();
obj.value = 50;
reassignReference(obj);
System.out.println(obj.value); // 仍输出50
}
使用数组或集合传递多个引用
数组和集合本身也是对象,可以通过引用传递来修改其内容:
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
}
通过包装类模拟引用传递
对于基本数据类型,可以使用包装类(如Integer)来模拟引用行为,但需注意包装类的不可变性:
static void modifyWrapper(IntegerHolder holder) {
holder.value = 30;
}
static class IntegerHolder {
int value;
}
public static void main(String[] args) {
IntegerHolder holder = new IntegerHolder();
holder.value = 10;
modifyWrapper(holder);
System.out.println(holder.value); // 输出30
}
实现自定义引用容器
创建包含引用的容器类可更灵活地控制引用传递:
class Reference<T> {
T value;
Reference(T value) {
this.value = value;
}
}
static void changeReference(Reference<String> ref) {
ref.value = "Modified";
}
public static void main(String[] args) {
Reference<String> ref = new Reference<>("Original");
changeReference(ref);
System.out.println(ref.value); // 输出"Modified"
}






