修改调用方法的值
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
时,你实际上返回的是同一个指针,所以实际上 t
和 t2
指向对象的同一个实例。
是的,它是按值传递的。该值是参考。 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;
}
在您原来的修复方法中,您只是改变传入的对象。
在下面的代码中,为什么输出是 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
时,你实际上返回的是同一个指针,所以实际上 t
和 t2
指向对象的同一个实例。
是的,它是按值传递的。该值是参考。 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;
}
在您原来的修复方法中,您只是改变传入的对象。