调用方法的值被修改

时间:2015-01-08 04:22:04

标签: java output

在以下代码中,为什么输出为0 42 42而不是0 0 42。

在Java对象中没有通过引用传递,那么为什么t.x的值被修改为42?

class Two 
{
   byte x;
}

  class PassO 
{
  public static void main(String [] args) 
{
    PassO p = new PassO();
    p.start();
}

void start() 
{
    Two t = new Two();
    System.out.print(t.x + " ");
    Two t2 = fix(t);
    System.out.println(t.x + " " + t2.x);
}

Two fix(Two tt) 
{
    tt.x = 42;
    return tt;
}
}

4 个答案:

答案 0 :(得分:2)

因为在Java中传递的是指向对象的指针的值。因此,当您执行tt.x=42时,您要将原始t.x更改为42。当你return tt实际上返回相同的指针时,所以实际上tt2指向对象的同一个实例。

答案 1 :(得分:2)

  

在Java对象中没有通过引用传递,所以为什么t的值是   修改为42?

t的值未修改为42. t.x被修改为42。

  

Java始终是按值传递的。难以理解的是   Java将对象作为引用传递,并传递这些引用   按价值。

答案 2 :(得分:1)

是的,它是按值传递的。该值是参考。 t是指向new Two()的指针。您传递了t所引用的值,并使用tt指向它。

答案 3 :(得分:0)

您的方法修复程序并非真正通过值依从性进行测试。如果你真的测试通过值依从性,那么方法应该如下所示:

Two fix(Two tt) 
{
    // Create a brand new instance of Two
    Two newTwo = new Two();
    newTwo.x = 42;
    // Assign the new reference to the passed in value.
    tt = newTwo;    
    return tt;
}

在原始修复方法中,您只是改变传入的对象。