在学习方法部分的知识时,经常会碰到一道经典的面试题:下面代码中的运行结果是什么?换言之,a
、b
两个数是否通过 changeNum
方法进行了交换?
public class Test{
public static void main(String[] args){
int a = 10;
int b = 20;
System.out.println("输出交换前的两个数:" + a + "---" + b);
changeNum(a,b);
System.out.println("输出交换后的两个数:" + a + "---" + b);
}
public static void changeNum(int num1,int num2){
int t;
t = num1;
num1 = num2;
num2 = t;
}
}
实际上,上述代码运行的结果是:
输出交换前的两个数:10---20
输出交换后的两个数:10---20
可见 a
和 b
并没有交换成功,这是为什么呢?
这其实是因为:==Java中一切都是值传递==。
我们不妨通过画内存图来分析下上述代码:
上述代码主要发生在内存的栈部分,每个方法都会在其中生成一个栈帧。可以看到,发生了交换的其实是 changeNum
方法栈帧中的 num1
和 num2
,当该方法调用完成后,它的栈帧就会被销毁,最后打印的仍然是 main
方法栈帧中的 a
和 b
,所以对 a
和 b
来说并没有发生交换。