对象值不会改变

问题描述 投票:1回答:7
class smth{
    public static void main(String[] args){
        private Integer x = new Integer(17);
        inc(x);
        System.out.print("x="+x);
    }
    public static void inc(Integer x){
        x++;
        System.out.println("n="+x);
    }
}

输出:n = 18; X = 17;

整数是一个对象,我不明白为什么在这种情况下x的值没有改变。

java
7个回答
3
投票

因为Integer是不可变对象。将它发送给方法时,会创建对它的新引用。当你增加时,引用内部方法被重新分配给值为Integer的新18,但main中的引用仍然引用值为Integer的旧17


1
投票

Integer是不变的。 x++创建了一个新对象,并重新引用x来引用它。由于对原始x的引用是按值传递的,因此更改不会传播回调用方。


1
投票

任何包装类都是不可变类。


1
投票

因为在Integer对象上的x++实际上意味着:

int temp = x.intValue();
temp++;
x = Integer.valueOf(temp);

正在为x变量分配一个新的Integer实例。并且由于参数是按值传递的,因此原始引用保持不变。


1
投票

这是因为Java通过值而不是通过引用将对象传递给方法。完成方法调用后,调用方法中的对象值与传递之前的对象值相同。在被调用的方法中,值可以更改,但更改的范围是传递它的方法。


1
投票

这是因为Integer是原始int的包装器,它是不可变的,Java通过值传递对象引用。对方法内的对象引用所做的任何更改都不会影响传入的对象:引用将替换为对新对象的引用,但原始文件保持不变,因为它是不可变的。

要解决此问题,您需要另一级别的间接 - 您可以使用数组,a mutable int from apache commons,或者滚动您自己设计合适的类。

public static void main(String argv[])
    MutableInt x = new MutableInt (17);
    inc(x);
    System.out.print("x="+x.intValue());  
}
public static void inc(MutableInt x){
    x.add(1);
    System.out.println("n="+x.intValue());
}

1
投票

这是因为在方法inc中修改的对象与在此方法之外打印的对象不同。

在方法内部,inc x是指向一个物体的参考。运行x ++时,会重新分配X以引用具有不同值的新Integer对象。因此,您不会修改在main上声明的原始“x”变量。

您必须将“指针”返回到新的整数对象:

public static int inc(Integer x){
          x++;
          System.out.println("n="+x);
          return x;
      }

  public static void main(String argv[])

              Integer x = new Integer(17);
              x = inc(x);
              System.out.print("x="+x);  
  }

Integer是一个包含单个int字段的Object。整数比int更笨重。它类似于包含int的Fedex框。整数是不可变的(source

© www.soinside.com 2019 - 2024. All rights reserved.