修改调用方法的值

Value of calling method is modified

在下面的代码中,为什么输出是 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;
}
}

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

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

指向它

In Java object is not passed by reference so why value of t is modified to 42?

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

Java is always pass-by-value. The difficult thing to understand is that Java passes objects as references and those references are passed by value.

您的方法修复并没有真正通过价值遵守测试。如果您真的要测试按值传递的遵守情况,则该方法应该类似于以下内容:

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

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