Java函数参数的传递方式比较
Java中函数参数的传递方式主要有两种:值传递和引用传递。
值传递(Pass by Value)是指在函数调用时,将实际参数的值复制给形式参数,即在函数内部修改形式参数的值不会影响到实际参数的值。
在Java中,基本数据类型(如int、float、boolean等)都是通过值传递来传递参数的。例如:
public class PassByValueExample {
public static void main(String[] args) {
int num = 10;
changeValue(num);
System.out.println("Num after function call: " + num);
}
public static void changeValue(int num) {
num = 20;
}
}
输出结果为:“Num after function call: 10”,说明在changeValue函数中修改了形式参数num的值,并没有影响到实际参数num的值。
引用传递(Pass by Reference)是指在函数调用时,将实际参数的地址传递给形式参数。通过引用传递,可以在函数内部修改实际参数的值。
在Java中,对象(包括数组)是通过引用传递来传递参数的。例如:
public class PassByReferenceExample {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
changeValue(arr);
System.out.println("Array after function call: " + Arrays.toString(arr));
}
public static void changeValue(int[] arr) {
arr[0] = 10;
}
}
输出结果为:“Array after function call: [10, 2, 3]”,说明在changeValue函数中修改了实际参数arr的值,修改结果被保留了下来。
需要注意的是,Java中的引用传递只是将一个变量的地址传递给函数,函数中修改的是实际参数指向的对象的值,而不是修改实际参数本身所指向的地址。所以,如果在函数内部重新为形式参数赋值,它只会影响形式参数的指向,而不会影响实际参数。
例如:
public class PassByReferenceExample2 {
public static void main(String[] args) {
StringBuilder str = new StringBuilder("Hello");
changeValue(str);
System.out.println("String after function call: " + str);
}
public static void changeValue(StringBuilder str) {
str = new StringBuilder("World");
}
}
输出结果为:“String after function call: Hello”,说明在changeValue函数中重新为形式参数str赋值,并没有影响实际参数str所指向的对象。
总结来说,Java中的函数参数传递方式有值传递和引用传递两种。基本数据类型通过值传递来传递参数,对象通过引用传递来传递参数,引用传递只是将变量的地址传递给函数,函数中修改的是实际参数指向的对象的值。如果在函数内部重新为形式参数赋值,不会影响实际参数。
