对于 基本数据类型(例如 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
值的副本。
示例:
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
方法中局部引用的值。
因篇幅问题不能全部显示,请点此查看更多更全内容