【发布时间】: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 并因此显示ob1 的val。
但是,包装类不会发生同样的情况。当我将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