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

4

7 回答 7

3

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

于 2012-11-30T21:15:44.133 回答
2

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

于 2012-11-30T21:14:59.637 回答
1

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

于 2012-11-30T21:14:59.513 回答
1

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

要解决这个问题,您需要另一个级别的间接 - 您可以使用数组、来自 apache commons 的可变 int或滚动您自己的适当设计的类。

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());
}
于 2012-11-30T21:15:14.100 回答
1

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

于 2012-11-30T21:16:15.563 回答
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。Integer 比 int 大得多。它有点像一个包含 int 的 Fedex 盒子。整数是不可变的(来源

于 2012-11-30T21:16:16.537 回答
1

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

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

x 变量被分配了一个新的 Integer 实例。而且由于参数是按值传递的,所以原始引用保持不变。

于 2012-11-30T21:19:08.017 回答