这是我无法理解的代码为什么v.i需要20!此代码的结果是:
15 0
20
代码:
class Value {
public int i = 15;
}
class tes {
public static void main(String argv[]) {
tes t = new tes();
t.first();
}
public void first() /* methode first */
{
int i = 5;
Value v = new Value(); /* appel au classe Value */
v.i = 25;
second(v, i);
System.out.println(v.i);
} /* here it appears 20 ????? */
public void second(Value v, int i) {
i = 0;
v.i = 20;
Value val = new Value();
v = val;
System.out.println(v.i + " " + i);
}
} /* it appears 15 0 i understand this */
答案 0 :(得分:2)
这是因为在Java中,您按值传递对象的引用。您无法更改此引用指向的位置。您认为自己正在将v
点first()
从second()
点更改为second()
内部,但事实并非如此。有效地在v
的函数签名中,您只是声明一个变量v.i
,它最初指向传递的值。您正在更改该变量,而不是外部参考。
但是,当您分配给final
时,它确实有效并更新其值。 20是正确的结果。
创建所有参数{{1}},编译并查看错误。这将提供良好的洞察力。
这可能比我更好地解释:Is Java "pass-by-reference" or "pass-by-value"?。
答案 1 :(得分:0)
仔细检查您的代码:
v.i = 20; //Okay, pretty straightforward
然后你打电话:
Value val = new Value(); //Think about what val.i is
现在,当你调用它时,v
指向val
所指向的同一个对象:
v = val;
该对象中i
的价值是多少?
答案 2 :(得分:0)
v = val v只是val的引用,而不是原始v。
v-->i=25
然后在方法第二
v-->i=20
Value val = new Value();
为val
分配新的内存空间现在
v-->val.i = 15
之后,您可以根据需要修改v.i,而不会影响存储在v.i中的原始数据。