在学习方法部分的知识时,经常会碰到一道经典的面试题:下面代码中的运行结果是什么?换言之,ab 两个数是否通过 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

可见 ab 并没有交换成功,这是为什么呢?

这其实是因为:==Java中一切都是值传递==。

我们不妨通过画内存图来分析下上述代码:

JavaSE-20-1

上述代码主要发生在内存的栈部分,每个方法都会在其中生成一个栈帧。可以看到,发生了交换的其实是 changeNum 方法栈帧中的 num1num2 ,当该方法调用完成后,它的栈帧就会被销毁,最后打印的仍然是 main 方法栈帧中的 ab ,所以对 ab 来说并没有发生交换。