我可以在装箱后调用原始包装类作为参考类型吗?
我也知道AtomicInteger
,AtomicLong
,AtomicBoolean
和AtomicReference<V>
是可变的。
Integer age = new Integer(23);
Integer old = age;
System.out.println("Age : "+age);
System.out.println("Old : "+ old);
System.out.println("*************");
age = 24;
System.out.println("Age : "+age);
System.out.println("Old : "+ old);
结果
Age : 23
Old : 23
After update ****
Age : 24
Old : 23
我同意原语及其包装是不可变的。 但拳击的目的是什么呢?
从维基百科复制:
拳击,也称为包装,是在对象中放置基本类型的过程,以便基元可以用作参考对象。
答案 0 :(得分:1)
如果您使用了原语,您的程序将以相同的方式工作(第二个分配使用自动装箱,因此它不会改变任何东西)。 Wrappers确实是引用类型,但你无法利用它,因为Java中定义的原语的所有包装类都是不可变的。
因此,您不能将一个包装的int
发送到方法中,在那里修改它,并期望调用者看到原始包装器的修改。如果您需要此功能,则必须编写自己的可变包装器。
答案 1 :(得分:1)
添加了拳击(或自动装箱),因为不小心的goofball不愿意(或许无法)认识到需要代码,其中左值的类型在涉及原始类型和原始包装类的情况下与rvalue的类型匹配。
在您的代码中,这是编译器在age = 24
行思考的假设成绩单。
该行
a = 24;
在功能上与
相同a = new Integer(24);
这就是拳击的意义和目的。
答案 2 :(得分:0)
所有盒装包装类都是不可变的。将age
的值更改为24时,不要将Integer对象age
更改为。您创建了new Integer(24)
并将此分配给age
。变量old
仍然指向Integer(23)
。
当你需要一个可变的盒装类型时,可以使用它们的原子*变量,如AtomicInteger
。
答案 3 :(得分:0)
您在此处明确创建Integer
的新实例:
Integer age = new Integer(23);
在此您将参考重新分配给age
。 Java隐式地将24封装到Integer
实例:
age = 24;
所以第一种情况没有涉及装箱,因为你不能改变一个值(因为它是不可变的),实际上有两个Integer
对象为23
创建了一个,{1为{{1} }}