对象值不会改变

时间:2012-11-30 21:13:12

标签: java

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的值没有改变。

7 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分: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());
}

答案 4 :(得分:1)

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

答案 5 :(得分: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);  
  }
  

整数,是一个包含单个int字段的Object。一个   整数比int更笨重。它就像一个联邦快递箱子   包含int。整数是不可变的(source

答案 6 :(得分:1)

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

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

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