当我有一个更改对象的函数时,我期望对象的值在调用函数中发生变化(如Is Java “pass-by-reference” or “pass-by-value”中所描述的,因为引用没有被更改)。但它似乎不适用于包装类(如Integer)。
以下代码:
public class Test
{
private static class MyInt
{
private int i;
public MyInt(int i)
{
this.i = i;
}
public int get()
{
return i;
}
public void set(int i)
{
this.i = i;
}
public void increment()
{
++this.i;
}
public String toString()
{
return Integer.toString(i);
}
}
public static void test(int a, Integer b, MyInt c)
{
++a;
++b;
System.out.println("b after increment is " + b);
c.increment();
}
public static void main(String[] args)
{
int a = 5;
Integer b = new Integer(5);
MyInt c = new MyInt(5);
test(a, b, c);
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}生成以下输出:
b after increment is 6
5
5
6从中我可以看到,Integer对象实际上在函数内部发生了变化,变为6,但它并没有改变b在main中的值。这里发生了什么事?包装器对象是否以常规对象以外的其他方式传递?
发布于 2021-04-21 11:35:33
当一个人做以下几行时所发生的事情实际上与你所期望的不同:
Integer b = Integer.valueOf(5);
System.out.println("code of b is " + System.identityHashCode(b));
++b;
System.out.println("code of b is " + System.identityHashCode(b));从增量后的输出可以看出,b实际上指向的是不同的对象,而不是改变现有对象中的内部值。
因此,++运算符可以用与c.increment()不同的代码行近似,而应该编写c = new MyInt(c.get() + 1);。
https://stackoverflow.com/questions/67195080
复制相似问题