当我们将相同类型的对象彼此分配时,新对象存储分配给它的对象的地址。例如,如果我有自己的名为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
包装类对象在分配给另一个对象时是否取消装箱,以便传递值而不是地址?
答案 0 :(得分:1)
执行x++
时,它与x = x + 1
相同,因此它实际上是分配给x的Integer
的新实例,但y仍然指向旧实例,其值为10
请记住,包装器实例是不可变的。
答案 1 :(得分:1)
对于整数x
,表达式x++
可以理解为x = new Integer(x.intValue() + 1);
。它不完全相同,但有助于理解。
因此,它不会使Integer
在10
之前指向的值x
修改x++
对象,它会创建一个新{{1}值Integer
的对象独立于原始11
整数,并将此10
整数分配给11
。
但x
表达式中没有任何内容可以使x++
指向不同的Integer实例。所以y
仍然指向原来的10。
与y
示例的不同之处在于,您不会使用CLA
引入新实例,而是修改单个实例。如果ob1.val++
类有公共字段Integer
,则value
会显示您预期的行为 - 但x.value++
字段(出于正当理由)私有 - 无法访问外面。