包装器 class 对象在分配给另一个对象时会被拆箱吗?
Do wrapper class objects get unboxed while being assigned to another object?
当我们将同一类型的对象相互分配时,新对象会存储分配给它的对象的地址。例如,如果我有自己的 class 命名为 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
。
但是,Wrapper classes 不会发生同样的情况。当我将一个 Integer
对象分配给另一个对象时,该操作的行为就像我们正在处理值而不是对象一样。与上面的代码相反,下面代码的输出是 10
:
Integer x = 10; //auto-boxed as new Integer(10)
Integer y = x;
x++;
System.out.printf("%d", y.intValue());
为什么会这样?
包装器 class 对象在分配给另一个对象时会被拆箱,以便传递值而不是地址吗??
当你做x++
时,它和x = x + 1
一样所以它实际上是Integer
的一个新实例分配给x但y仍然指向旧实例which value是 10.
请记住,包装器实例是不可变的。
对于整数 x
,表达式 x++
可以理解为 x = new Integer(x.intValue() + 1);
。不完全一样,但有助于理解
因此,它不会用 x
在 x++
之前指向的值 10
修改 Integer
对象,它会创建一个新的 [=13] =]对象的值11
独立于原来的10
整数,并将这个11
整数赋值给x
.
但是 x++
表达式中没有任何内容可以使 y
指向不同的 Integer 实例。所以y
还是指向原来的10.
这就是与 CLA
示例的区别,您不使用 ob1.val++
引入新实例,而是修改单个实例。如果 Integer
class 有一个 public 字段 value
,那么 x.value++
将显示您预期的行为 - 但 value
字段是(对于很好的理由)私有 - 外部无法访问。
当我们将同一类型的对象相互分配时,新对象会存储分配给它的对象的地址。例如,如果我有自己的 class 命名为 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
。
但是,Wrapper classes 不会发生同样的情况。当我将一个 Integer
对象分配给另一个对象时,该操作的行为就像我们正在处理值而不是对象一样。与上面的代码相反,下面代码的输出是 10
:
Integer x = 10; //auto-boxed as new Integer(10)
Integer y = x;
x++;
System.out.printf("%d", y.intValue());
为什么会这样?
包装器 class 对象在分配给另一个对象时会被拆箱,以便传递值而不是地址吗??
当你做x++
时,它和x = x + 1
一样所以它实际上是Integer
的一个新实例分配给x但y仍然指向旧实例which value是 10.
请记住,包装器实例是不可变的。
对于整数 x
,表达式 x++
可以理解为 x = new Integer(x.intValue() + 1);
。不完全一样,但有助于理解
因此,它不会用 x
在 x++
之前指向的值 10
修改 Integer
对象,它会创建一个新的 [=13] =]对象的值11
独立于原来的10
整数,并将这个11
整数赋值给x
.
但是 x++
表达式中没有任何内容可以使 y
指向不同的 Integer 实例。所以y
还是指向原来的10.
这就是与 CLA
示例的区别,您不使用 ob1.val++
引入新实例,而是修改单个实例。如果 Integer
class 有一个 public 字段 value
,那么 x.value++
将显示您预期的行为 - 但 value
字段是(对于很好的理由)私有 - 外部无法访问。