Java 调用方法的值已修改
在下面的代码中,为什么输出是0 42而不是0 42 在Java中,对象不是通过引用传递的,所以为什么t.x的值被修改为42Java 调用方法的值已修改,java,output,Java,Output,在下面的代码中,为什么输出是0 42而不是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.
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
。当您返回tt
时,实际上返回的是同一个指针,因此实际上t
和t2
指向对象的同一个实例。因为Java中传递的是指向对象的指针的值。因此,当您执行tt.x=42
时,您正在将原始t.x
更改为42
。当您返回tt
时,实际上返回的是同一个指针,因此实际上t
和t2
指向对象的同一实例。是,它是按值传递的。该值是引用t
是指向new Two()
的指针。您传递t
也引用的值,并用tt
指向该值。它是按值传递的。该值是引用t
是指向new Two()
的指针。传递t
也引用的值,并用tt
指向该值
在Java中,对象不是通过引用传递的,所以为什么t的值是
修改为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;
}
}
t
的值未修改为42<代码>t.x修改为42
Java总是按值传递。最难理解的是
Java将对象作为引用传递,并且这些引用被传递
按价值计算
在Java中,对象不是通过引用传递的,所以为什么t的值是
修改为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;
}
}
t
的值未修改为42<代码>t.x修改为42
Java总是按值传递。最难理解的是
Java将对象作为引用传递,并且这些引用被传递
按价值计算
您的方法修复并不是真正的测试通过值遵从性。如果您确实在测试通过值的遵从性,那么方法应该如下所示:
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;
}
在最初的修复方法中,您只是对传入的对象进行了修改。您的方法修复并不是真正测试按值传递的一致性。如果您确实在测试通过值的遵从性,那么方法应该如下所示:
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;
}
在最初的fix方法中,您只是对传入的对象进行了修改。
t
和t2
是对Two
的同一实例的引用。t
和t2
是对Two
的同一实例的引用。在下面的代码void start(){Integer t=0;System.out.print(t+“”);fix(t);System.out.println(t+“”);}void fix(Integer tt){tt=42;}这里t是Integer类的对象。为什么在这种情况下得到输出0?@RohitManglik,因为您正在将tt
设置为Integer
类的新实例(通过自动装箱)值为42
,因此不再指向前面的t
。在下面的代码中void start(){Integer t=0;System.out.print(t+);fix(t);System.out.println(t+);}void fix(Integer tt){tt=42;}这里t是Integer类的对象。为什么在这种情况下得到输出0?@RohitManglik,因为您正在将tt
设置为Integer
类的一个新实例(通过自动装箱),其值为42
,因此不再指向以前的t
。