值传递(Pass by Value)和引用传递(Pass by Reference)是两种参数传递的方式。
值传递
是指在调用函数或方法时,将参数的值复制给一个临时变量然后传递给函数或方法。在函数或方法内部,对参数进行修改不会影响到原始变量。
引用传递
是指在调用函数或方法时,将参数的引用(内存地址)传递给函数或方法。在函数或方法内部,对参数进行修改会改变原始变量。
在 Java 中,参数传递采用的是值传递
。具体来说:
对于基本数据类型(如int、float等),值本身会被复制,传递的是该值的副本。修改函数或方法内的参数不会影响原始变量。
对于引用类型(如数组、类的实例等),传递的是对象的引用的副本。原始变量和函数或方法内的参数指向同一个对象,对参数的修改会影响原始对象,但如果参数重新分配了一个新的对象,不会影响原始对象。
需要注意的是,虽然 Java 中的参数传递是值传递,但在传递引用类型时,由于传递的是引用的副本,可能产生误解,让人以为是引用传递。但从底层实现来看,仍然是值传递的机制。
public class Example {
public static void main(String[] args) {
int x = 10;
changeValue(x);
System.out.println("x: " + x); // 输出: x: 10
}
public static void changeValue(int value) {
value = 20;
}
}
在上面的示例中,我们将变量x的值传递给changeValue()方法。在方法内部,参数value接收到x的值的副本,然后将其修改为20。但这个修改不会影响到原始的变量x,因此打印出的值仍然是10。
public class Example {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
changeArray(arr);
System.out.println("arr[0]: " + arr[0]); // 输出: arr[0]: 100
}
public static void changeArray(int[] array) {
array[0] = 100;
}
}
在这个示例中,我们将一个包含了3个元素的整数数组传递给changeArray()方法。在方法内部,参数array接收到了该数组的引用的副本。通过修改array数组的第一个元素,也就是原始数组的第一个元素,将其改为100。由于在方法之外仍然引用着相同的数组,所以在打印时会显示修改后的值。
虽然第二个示例中看起来像是传递了一个引用,但从底层来讲,实际上是传递了一个引用的副本,因此仍然可以归类为值传递。