package Animal;
public class TransferTest {
public static void main(String[] args) {
TransferTest test = new TransferTest();
test.first();
}
public void first() {
int i = 10;
Value v = new Value();
v.i = 25;
second(v, i);
System.out.println(v.i);
}
public void second(Value v, int i) {
i = 0;
v.i = 20;
Value val = new Value();
v = val;
System.out.println(v.i + " " + i);
}
}
class Value {
int i = 15;
}
这一道题目,算是比较全面的覆盖了java值传递的问题点;
首先我们调用first函数时,生成了一个Value类, 这时我们的v.i = 15, i = 10;
由于我们v.i = 25, 所以v.i的值变为了25;
然后我们值传递传进去second函数,我们的参数一个是引用数据类型,另外一个是基本数据类型,第一个传的是一个实参存储数据的地址,第二个传的是实参真实存储的数据值。
所以我们进入second时间,我们的i 和 原来的i 只是数值一样,但是 second里面的i无论怎么变化都不会影响原有的i值, 然而,v.i的值发生了变化,变成了20, 但是我们又Value val = new Value(); 然后让v=val, 这个时候,我们的v已经变成了val,不是原来的v了, 所以我们输出的时候,输出的是val.i ,然后i由于变成0, 会输出0;
那么回到了first函数中,我们可以看到v.i这时候的值还是v.i = 20;
结果就是,
不得不说,这个值传递确实很容易引起歧义;
如果我们改一改代码:Value val = new Value();去掉
那么答案就变成了
多想多试,java天下第一