Java 中的参数传递是按值还是按引用?
在 Java 中,参数传递是按值传递的(Pass by Value),但这个概念需要根据传递的参数类型来具体理解。
基本类型参数
对于基本类型(如 int
、char
、boolean
等),参数传递确实是按值传递。这意味着方法接收的是传入参数的一个副本,对这个副本的任何修改都不会影响原始变量。
引用类型参数
对于引用类型(如对象、数组等),参数传递也是按值传递,但传递的是引用的副本。这意味着方法接收的是一个指向对象的引用的副本,而不是对象本身。因此,通过这个引用可以修改对象的状态,但不能改变引用本身所指向的对象。
示例代码
public class ParameterPassingExample { public static void main(String[] args) { int num = 10; changeValue(num); System.out.println("num: " + num); // 输出: num: 10 StringBuilder sb = new StringBuilder("Hello"); changeReference(sb); System.out.println("sb: " + sb); // 输出: sb: Hello changeContent(sb); System.out.println("sb: " + sb); // 输出: sb: Hello World } // 修改基本类型参数 public static void changeValue(int value) { value = 20; } // 修改引用类型参数的引用 public static void changeReference(StringBuilder sb) { sb = new StringBuilder("World"); } // 修改引用类型参数的内容 public static void changeContent(StringBuilder sb) { sb.append(" World"); } }
解释
- 基本类型参数:changeValue 方法接收 num 的副本,并将其修改为 20。但主方法中的 num 仍然是 10,因为方法中修改的是副本。
- 引用类型参数:changeReference 方法接收 sb 的引用副本,并将其重新指向一个新的 StringBuilder 对象。但主方法中的 sb 仍然指向原来的对象,因此输出仍然是 “Hello”。changeContent 方法接收 sb 的引用副本,并通过这个引用修改了对象的内容。因此,主方法中的 sb 的内容被修改为 “Hello World”。
总结
- 基本类型:按值传递,方法中修改的是副本,不影响原始变量。
- 引用类型:按值传递,方法中传递的是引用的副本,可以通过这个引用修改对象的内容,但不能改变引用本身所指向的对象。