在 Java 中新建一个类Test:
class Test {int a;
}
在Main方法中创建两个 Test 对象,并给 a 赋不同的值。
写一个 exchange 方法,在方法中交换两个Test 对象,最后输出两个对象中 a 的值。
public class Main {public static void main(String[] args) {Test test = new Test();Test test1 = new Test();test.a = 1;test1.a = 2;exchange(test, test1);System.out.println(test.a + ", " + test1.a);}public static void exchange(Test a, Test b) {Test temp = a;a = b;b = temp;}
}
最后输出的结果是多少?
很神奇!交换居然失效了!
我们画个图来探究一下运行时的情况:
代码开始运行时, new 两个 Test 对象, 会创建一个栈帧放入栈中,栈帧中存着两个对象的地址,分别指向存在堆中的数据。
在运行到exchange方法时,Java 会新建一个栈帧,并把 test 和 test1 都复制一份过去。
在exchenge方法运行后:
在exchange方法运行结束后,该方法的栈帧出栈:
所以最后输出为 1, 2。
如果这样写的话最后输出结果就是2, 1了。
public class Main {public static void main(String[] args) {Test test = new Test();Test test1 = new Test();test.a = 1;test1.a = 2;Test temp = test;test = test1;test1 = temp;System.out.println(test.a + ", " + test1.a);}
}