交换两个整型变量
错误示例
public class TestMethod { public static void main(String[] args) { int a = 10; int b = 20; swap(a, b); System.out.println("main: a = " + a + " b = " + b); } public static void swap(int x, int y) { int tmp = x; x = y; y = tmp; System.out.println("swap: x = " + x + " y = " + y); } } // 运行结果 swap: x = 20 y = 10 main: a = 10 b = 20
可以看到,在swap函数交换之后,形参x和y的值发生了改变,但是main方法中a和b还是交换之前的值,即没有交 换成功。
原因分析
实参a和b是main方法中的两个变量,其空间在main方法的栈(一块特殊的内存空间)中,而形参x和y是swap方法中 的两个变量,x和y的空间在swap方法运行时的栈中,因此:实参a和b 与 形参x和y是两个没有任何关联性的变量, 在swap方法调用时,只是将实参a和b中的值拷贝了一份传递给了形参x和y,因此对形参x和y操作不会对实参a和b 产生任何影响。
注意:对于基础类型来说, 形参相当于实参的拷贝. 即 传值调用
int a = 10; int b = 20; int x = a; int y = b; int tmp = x; x = y; y = tmp;
可以看到, 对 x 和 y 的修改, 不影响 a 和 b.
解决办法
传引用类型参数 (例如数组来解决这个问题)
public class TestMethod { public static void main(String[] args) { int[] arr = {10, 20}; swap(arr); System.out.println("arr[0] = " + arr[0] + " arr[1] = " + arr[1]); } public static void swap(int[] arr) { int tmp = arr[0]; arr[0] = arr[1]; arr[1] = tmp; } } // 运行结果 arr[0] = 20 arr[1] = 10