在 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);
}
}