首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包装类对象是否在分配给另一个对象时被取消装箱?

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

Stack Overflow用户
提问于 2017-09-30 18:37:53
回答 2查看 159关注 0票数 0

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
Integer x = 10; //auto-boxed as new Integer(10)
Integer y = x;
x++;
System.out.printf("%d", y.intValue());

这一切为什么要发生?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-30 18:45:53

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

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

票数 1
EN

Stack Overflow用户

发布于 2017-09-30 19:04:15

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

因此,它不使用Integer指向的值10修改x++对象,而是创建一个新的Integer对象,其值11独立于原始10整数,并将此11整数分配给x

但是x++表达式中没有任何东西可以使y指向不同的Integer实例。因此,y仍然指向原来的10。

这与CLA示例的不同之处在于,您不使用ob1.val++引入新实例,而是修改单个实例。如果Integer类有一个公共字段value,那么x.value++将显示您期望的行为--但是value字段(出于很好的理由)是私有的--外部无法访问。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46505896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档