欢迎访问宙启技术站
智能推送

Java函数的参数传递方式:按值调用和按引用调用有何不同?

发布时间:2023-06-21 18:05:39

Java函数的参数传递方式可以分为按值调用和按引用调用两种。

1. 按值调用

按值调用是指在调用函数时,将实参的值复制到形参中。也就是说,形参和实参是两个不同的变量,它们在内存中分别占据不同的位置。因此,在函数内部对形参的修改不会影响到实参的值。

举个例子:假设有如下函数

public static int add(int a, int b) {
    a = a + 1;
    b = b + 1;
    return a + b;
}

当我们调用函数add(2, 3)时,实参a的值为2,实参b的值为3。这两个实参的值会被复制到函数的形参a和b中。在函数内部,我们对形参a和b分别执行了加1操作,并返回它们的和。当函数执行完毕后,形参a和b所占用的内存被释放,对它们的修改也就随之消失了。因此,函数add返回的结果为7,而不是预期的8。

2. 按引用调用

按引用调用是指在调用函数时,将实参的引用(即地址)复制到形参中。也就是说,形参和实参指向同一个对象,它们在内存中占据的位置是相同的。因此,在函数内部对形参的修改会影响到实参的值。

举个例子:假设有如下函数

public static void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

当我们调用函数swap(arr, 0, 1)时,实参arr引用的是一个int数组对象,它在内存中的地址为0x1234。实参i和j的值分别为0和1。在函数内部,形参arr指向了同一个int数组对象,我们对形参arr所指向的数组执行了交换操作,并没有对形参本身进行修改。但是,由于形参arr和实参arr指向同一个对象,所以对形参arr的修改会影响到实参arr引用的那个数组对象。因此,当函数执行完毕后,实参arr引用的int数组已经被交换了第0个和第1个元素。

总结:

按值调用和按引用调用的区别在于函数对形参的修改是否会影响到实参的值。按值调用会复制实参的值到形参中,在函数内部对形参的修改不会影响到实参的值;按引用调用会复制实参的引用到形参中,在函数内部对形参的修改会影响到实参所引用的对象的值。理解这两种参数传递方式的区别可以对程序设计和调试有所帮助。