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的值没有改变。
答案 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实例。由于参数是按值传递的,因此原始引用保持不变。