对拳击的澄清

时间:2013-12-17 14:16:13

标签: java boxing

我可以在装箱后调用原始包装类作为参考类型吗?

我也知道AtomicIntegerAtomicLongAtomicBooleanAtomicReference<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

我同意原语及其包装是不可变的。  但拳击的目的是什么呢?

从维基百科复制:

  

拳击,也称为包装,是在对象中放置基本类型的过程,以便基元可以用作参考对象

4 个答案:

答案 0 :(得分:1)

如果您使用了原语,您的程序将以相同的方式工作(第二个分配使用自动装箱,因此它不会改变任何东西)。 Wrappers确实是引用类型,但你无法利用它,因为Java中定义的原语的所有包装类都是不可变的

因此,您不能将一个包装的int发送到方法中,在那里修改它,并期望调用者看到原始包装器的修改。如果您需要此功能,则必须编写自己的可变包装器。

答案 1 :(得分:1)

添加了拳击(或自动装箱),因为不小心的goofball不愿意(或许无法)认识到需要代码,其中左值的类型在涉及原始类型和原始包装类的情况下与rvalue的类型匹配。

在您的代码中,这是编译器在age = 24行思考的假设成绩单。

  1. 左值是年龄,它是对整数的引用。
  2. 等号是分配。
  3. 24是字面整数值。
  4. hangon,这个goof试图将一个原始值分配给一个不会成立的对象引用。
  5. 让我们创建一个新的Integer对象并使用值24对其进行初始化,然后将其分配给左值。
  6. 该行

    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} }}