在 Java 中,参数的传递类型是按值传递(Pass by Value),这意味着在调用方法时,传递给方法的参数实际上是该值的副本,而不是原始变量的引用或地址。因此,无论传递的是基本数据类型还是对象的引用,都是将它们的“值”传递给方法。
1. 基本数据类型的传递
对于 基本数据类型(例如 int
、double
、boolean
等),Java 会将值的副本传递给方法。因此,在方法内部修改该参数的值不会影响到原始变量。
示例:
public class PassByValueExample {
public static void main(String[] args) {
int number = 10;
modifyPrimitive(number);
System.out.println("After modifyPrimitive: " + number); // 输出 10,值未改变
}
public static void modifyPrimitive(int num) {
num = 20; // 仅仅修改了 num 的副本,原始变量不受影响
}
}
输出:
After modifyPrimitive: 10
在上面的代码中,modifyPrimitive
方法中对 num
的修改不会影响到原始变量 number
,因为 num
是 number
值的副本。
2. 引用数据类型的传递
对于 引用数据类型(例如 String
、Array
、List
等),传递的仍然是引用的值(即对象的内存地址的副本),因此传递的实际是对象引用的副本,而不是对象本身。因为传递的是引用的副本,方法内部对该引用的修改不会改变原始引用,但可以通过引用修改对象的内部数据。
示例:
import java.util.ArrayList;
import java.util.List;
public class PassByValueExample {
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("Alice");
modifyList(names);
System.out.println("After modifyList: " + names); // 输出 ["Alice", "Bob"]
}
public static void modifyList(List<String> list) {
list.add("Bob"); // 修改了 list 引用指向的对象,原始对象被修改
}
}
输出:
After modifyList: [Alice, Bob]
在这个例子中,names
引用指向的 List
对象被传递给了 modifyList
方法。虽然 names
引用本身没有被修改,但由于 list
和 names
指向同一个对象,所以在 list
上的修改反映在了 names
上。
引用的重新赋值不会影响原始对象
如果在方法内部将引用重新赋值,那么这只会改变局部引用的值,而不会影响原始引用。
示例:
public class PassByValueExample {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("Hello");
modifyReference(sb);
System.out.println("After modifyReference: " + sb); // 输出 "Hello",没有改变
}
public static void modifyReference(StringBuilder sb) {
sb = new StringBuilder("Goodbye"); // 重新赋值,不影响原始对象
}
}
输出:
After modifyReference: Hello
在这个例子中,modifyReference
方法中重新给 sb
赋值,但这不会影响 main
方法中的原始 sb
,因为 sb
的重新赋值只是改变了 modifyReference
方法中局部引用的值。
总结
- Java 中只有按值传递。
- 基本数据类型:传递的是值的副本,方法内部的修改不会影响原始变量。
- 引用数据类型:传递的是引用的副本,可以通过引用修改对象的内容,但重新赋值不会影响原始引用。