Java函数参数传递的两种方式是什么?
在Java中,函数参数传递有两种方式:值传递和引用传递。这两种方式的区别在于,值传递是将实参的值复制给形参,形参在函数中操作的是复制后的值,而不是实参本身。而引用传递是将实参的地址传递给形参,形参在函数中操作的是实参本身所在的地址,也就是操作的是实参本身。
1. 值传递
值传递是将实参的值复制给形参,形参在函数中操作的是复制后的值,而不是实参本身。在函数中对形参的任何修改都不会对实参产生影响。在Java中,基本类型的传递就是值传递。
例如,下面这个函数依次输出2和1:
public static void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
System.out.println("a=" + a);
System.out.println("b=" + b);
}
public static void main(String[] args) {
int x = 1;
int y = 2;
swap(x, y);
System.out.println("x=" + x);
System.out.println("y=" + y);
}
其中,swap函数中的a和b是形参,x和y是实参。在主函数中,我们调用了swap函数,并将x和y作为实参传递给了swap函数。然而,最终的输出结果是:
a=2 b=1 x=1 y=2
这证明了swap函数对x和y是没有任何影响的。这就是因为swap函数中的a和b只是x和y的值的复制品,我们对a和b的修改并不会改变x和y的值。
2. 引用传递
在Java中,对象是存储在堆内存中的,而栈内存中存储的是对象的地址。因此,在Java中,我们可以将对象的地址作为参数传递给函数,这种方式就是引用传递。在函数中对形参的修改会直接修改实参所指向的对象,也就是说,在函数中对对象的任何修改都会影响实参。
例如,下面这个函数将数组中所有元素的值都加一:
public static void addOne(int[] arr) {
for (int i = 0; i < arr.length; i++) {
arr[i]++;
}
}
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
addOne(arr);
System.out.println(Arrays.toString(arr));
}
其中,addOne函数的形参arr接收了实参arr的地址。在addOne函数中,我们对arr数组的每个元素都加了一,这个过程对实参arr也产生了影响。由于arr和实参指向的是同一个数组对象,因此在主函数中输出arr数组时,我们可以看到数组中的每一个元素都加了一。
总结
Java中函数参数传递有两种方式:值传递和引用传递。在值传递中,将实参的值复制给形参,在函数中对形参的任何修改都不会对实参产生影响。在引用传递中,将实参的地址传递给形参,在函数中对形参所指向的对象的任何修改都会直接修改实参所指向的对象,也就是说,对实参的任何修改都会影响实参本身。在Java中,基本类型的传递就是值传递,而对象的传递就是引用传递。
