2013-12-17 125 views
3

拳击后我们可以将基本包装类作为参考类型吗?关于拳击的澄清

我也知道AtomicInteger,AtomicLong,AtomicBooleanAtomicReference<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 

我认为,原始的,它的包装是不可变的。 但这里拳击的意义\目的是什么?

维基百科复制:

拳击,也被称为包装,是放置一个基本类型的对象内的过程中,使得原始可以用作参考对象

回答

1

如果您使用原语(第二个作业使用自动装箱,因此它不会更改任何内容),您的程序将以相同的方式工作。包装器的确是引用类型,但是你不能利用它,因为在Java中定义的基元的所有包装器类都是不变的

因此,例如,您不能将包装的int发送到方法中,在那里对其进行修改,并期望调用方看到原始包装器的修改。如果你需要这个功能,你将不得不编写你自己的可变包装器。

+0

我同意你的看法,原始的和它的包装是不变的。但这里拳击的意义\目的是什么? 复制自维基百科 “拳击,也称为包裹,是在对象中放置原始类型的过程,这样该原语可以用作参考对象。” – BDR

+0

@BalajiReddy在这个特定情况下它没有区别。你需要拳击的最常见的地方是当你想在集合中使用基元。由于Java集合仅包含引用对象,因此可以通过将您的基元“装箱”为包装来解决此限制。 Autoboxing可以让你隐式地做到这一点(你在'age = 24;'作业中的做法)。 – dasblinkenlight

+0

明白了你的观点。我也想补充“原语”不是OOP的一部分!当我做拳击时,我将值类型转换为引用类型。如果我真的在这里然后“例如,发送一个包装的int到一个方法,在那里修改它,并期望调用者看到原始包装的修改”这应该是可能的权利(概念上讲).. – BDR

0

所有盒装包装类都是不可变的。当您将age的值更改为24时,您不会更改Integer对象age指向的值。您创建一个new Integer(24)并将其分配给age。变量old仍然指向Integer(23)

当您需要一个可变的盒装类型时,可以使用它们的原子*变量,如AtomicInteger

0

在这里,您明确创建的Integer一个新实例:

Integer age = new Integer(23); 

在这里,你将重新分配参考age。 Java的隐框24到Integer实例:

age = 24; 

所以没有参与第一种情况下拳,因为你不能改变一个值(因为它是不可变的)实际有两种Integer对象创建一个用于23和一个用于24

+0

我同意你的观点,原始的和它的包装是不变的。但这里拳击的意义\目的是什么?从维基百科复制“拳击,也称为包装,是在对象中放置基本类型的过程,以便基元可以用作参考对象。 – BDR

+0

在大多数情况下,在库中使用引用类型非常重要,或者能够区分具有/不具有值('null')。 –

1

因为粗心goofballs不愿意(可能无法)识别代码的需要,其中左值的类型与原始类型和原始包装类的情况下右值的类型相匹配的代码的需要。

在你的代码中,这里是一个假设的编译器脚本,在行age = 24处思考。

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

线

a = 24; 

在功能上相同

a = new Integer(24); 

也就是说含义和拳击的目的。