【问题标题】:Do wrapper class objects get unboxed while being assigned to another object?包装类对象在分配给另一个对象时会被拆箱吗?
【发布时间】:2017-09-30 18:37:53
【问题描述】:

当我们将相同类型的对象分配给另一个对象时,新对象会存储分配给它的对象的地址。例如,如果我有自己的名为 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

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

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


为什么会这样?

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

【问题讨论】:

  • Java 原始包装类型是不可变的。
  • @ElliottFrisch 但是如果我显示 x 的值,则输出为 11
  • x++ 等价于x = Integer.valueOf(x.intValue() + 1)。它不会改变 x 引用的 Integer 的状态。它将另一个整数分配给 x。包装类都是不可变的:它们的状态不能改变。
  • @JBNizet “它不会改变 x 引用的整数的状态;它会为 x 分配另一个整数。” 我没明白:没有这意味着 x 上有两个值???
  • x 是对给定 Integer 对象的引用,包含值 10。在执行 x++ 之后,x 引用了不同的 Integer 对象,包含值 11。我不知道我是怎么做到的可以不同的解释。而且我不知道您所说的“x 上有两个值”是什么意思。

标签: java wrapper autoboxing


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-25
      • 2016-06-24
      • 2012-01-06
      • 1970-01-01
      • 2020-11-10
      • 2011-12-24
      • 1970-01-01
      • 2019-12-27
      相关资源
      最近更新 更多