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的值没有改变。
因为Integer
是不可变对象。将它发送给方法时,会创建对它的新引用。当你增加时,引用内部方法被重新分配给值为Integer
的新18
,但main
中的引用仍然引用值为Integer
的旧17
。
Integer
是不变的。 x++
创建了一个新对象,并重新引用x
来引用它。由于对原始x
的引用是按值传递的,因此更改不会传播回调用方。
任何包装类都是不可变类。
因为在Integer对象上的x++
实际上意味着:
int temp = x.intValue();
temp++;
x = Integer.valueOf(temp);
正在为x变量分配一个新的Integer实例。并且由于参数是按值传递的,因此原始引用保持不变。
这是因为Java通过值而不是通过引用将对象传递给方法。完成方法调用后,调用方法中的对象值与传递之前的对象值相同。在被调用的方法中,值可以更改,但更改的范围是传递它的方法。
这是因为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());
}
这是因为在方法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)