在以下代码中,为什么输出为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;
}
}
答案 0 :(得分:2)
因为在Java中传递的是指向对象的指针的值。因此,当您执行tt.x=42
时,您要将原始t.x
更改为42
。当你return tt
实际上返回相同的指针时,所以实际上t
和t2
指向对象的同一个实例。
答案 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;
}
在原始修复方法中,您只是改变传入的对象。