包装器 class 对象在分配给另一个对象时会被拆箱吗?

Do wrapper class objects get unboxed while being assigned to another object?

当我们将同一类型的对象相互分配时,新对象会存储分配给它的对象的地址。例如,如果我有自己的 class 命名为 CLA 那么下面的代码将产生 11 作为输出:

public class CLA{
    int val;
    public static void main(String...args){
        CLA ob1 = new CLA();
        ob1.val = 10;
        CLA ob2 = ob1;
        ob1.val++;
        System.out.printf("%d", ob2.val);
    }
}

因为 ob2 会引用 ob1 并因此显示 ob1val

但是,Wrapper classes 不会发生同样的情况。当我将一个 Integer 对象分配给另一个对象时,该操作的行为就像我们正在处理值而不是对象一样。与上面的代码相反,下面代码的输出是 10:

Integer x = 10; //auto-boxed as new Integer(10)
Integer y = x;
x++;
System.out.printf("%d", y.intValue());


为什么会这样?

包装器 class 对象在分配给另一个对象时会被拆箱,以便传递值而不是地址吗??

当你做x++时,它和x = x + 1一样所以它实际上是Integer的一个新实例分配给x但y仍然指向旧实例which value是 10.

请记住,包装器实例是不可变的。

对于整数 x,表达式 x++ 可以理解为 x = new Integer(x.intValue() + 1);。不完全一样,但有助于理解

因此,它不会用 xx++ 之前指向的值 10 修改 Integer 对象,它会创建一个新的 [=13] =]对象的值11独立于原来的10整数,并将这个11整数赋值给x.

但是 x++ 表达式中没有任何内容可以使 y 指向不同的 Integer 实例。所以y还是指向原来的10.

这就是与 CLA 示例的区别,您不使用 ob1.val++ 引入新实例,而是修改单个实例。如果 Integer class 有一个 public 字段 value,那么 x.value++ 将显示您预期的行为 - 但 value 字段是(对于很好的理由)私有 - 外部无法访问。