参数传递
Java 只有值传递(Pass by Value),但根据参数类型不同,表现出不同的效果。
| 类型 | 传递方式 | 说明 |
|---|---|---|
| 基本类型 | 值传递 | 传递副本,原值不变 |
| 引用类型 | 值传递 | 传递引用副本,可修改对象内容 |
基本类型传递
传递的是值的副本,方法内部修改不影响原值。
java
public class PrimitivePassDemo {
public static void main(String[] args) {
int num = 10;
modify(num);
System.out.println("main 中 num: " + num); // 10,未改变
}
static void modify(int num) {
num = 20;
System.out.println("modify 中 num: " + num); // 20
}
}引用类型传递
传递的是引用的副本,方法内部可以通过引用副本修改对象内容。
java
public class ReferencePassDemo {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
modify(arr);
System.out.println("main 中 arr[0]: " + arr[0]); // 100,改变了
}
static void modify(int[] arr) {
arr[0] = 100; // 通过引用副本修改数组
}
}引用不变
如果在方法内部重新赋值引用变量,只是改变了局部变量的引用副本,原引用不受影响。
java
public class ReferenceNotChangeDemo {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("Hello");
reassign(sb);
System.out.println("main 中 sb: " + sb); // Hello,未改变
}
static void reassign(StringBuilder sb) {
sb = new StringBuilder("World"); // 重新赋值,引用副本指向新对象
// 原来的 sb 引用副本不受影响
}
}要点总结
- 值传递:Java 总是传递值的副本
- 引用副本:引用类型传的是引用的副本,而非引用本身
- 修改内容:通过引用副本可以修改对象内容
- 重新赋值:重新赋值引用变量不影响原引用
