Java 调用方法的值已修改

Java 调用方法的值已修改,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.

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