包装类对象在分配给另一个对象时是否取消装箱?

时间:2017-09-30 18:37:53

标签: java wrapper autoboxing

当我们将相同类型的对象彼此分配时,新对象存储分配给它的对象的地址。例如,如果我有自己的名为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并因此显示ob1的{​​{1}}。

然而, Wrapper类也不会发生同样的情况。当我将val对象分配给另一个时,操作的行为就像我们处理的是值而不是对象。与上面的代码相反,以下代码的输出为Integer

10


为什么会这样?

包装类对象在分配给另一个对象时是否取消装箱,以便传递值而不是地址?

2 个答案:

答案 0 :(得分:1)

执行x++时,它与x = x + 1相同,因此它实际上是分配给x的Integer的新实例,但y仍然指向旧实例,其值为10

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

答案 1 :(得分:1)

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

因此,它不会使Integer10之前指向的值x修改x++对象,它会创建一个新{{1}值Integer的对象独立于原始11整数,并将此10整数分配给11

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

y示例的不同之处在于,您不会使用CLA引入新实例,而是修改单个实例。如果ob1.val++类有公共字段Integer,则value会显示您预期的行为 - 但x.value++字段(出于正当理由)私有 - 无法访问外面。