当我们将相同类型的对象分配给另一个对象时,新对象存储分配给它的对象的地址。例如,如果我有自己的类名为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());这一切为什么要发生?
是否在分配给另一个对象时取消包装类对象的装箱,从而传递值而不是地址?。
发布于 2017-09-30 18:45:53
当您执行x++时,它与x = x + 1相同,因此它实际上是分配给x的Integer的一个新实例,但y仍然指向值为10的旧实例。
请记住,包装器实例是不可变的。
发布于 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字段(出于很好的理由)是私有的--外部无法访问。
https://stackoverflow.com/questions/46505896
复制相似问题