我不明白为什么15 0然后20出现

时间:2014-01-19 23:54:32

标签: java

这是我无法理解的代码为什么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 */

3 个答案:

答案 0 :(得分:2)

这是因为在Java中,您按值传递对象的引用。您无法更改此引用指向的位置。您认为自己正在将vfirst()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中的原始数据。