2014-12-03 32 views
0

Java in a Nutshell, 2.10 Reference TypesJava中的基元包装类作为引用类型处理?

Java不直接操作对象和数组。相反,它操纵对对象和数组的引用。因为Java通过引用处理对象和数组,所以类和数组类型被称为 引用类型。相比之下,Java直接或通过值处理原始类型 类型的值。

但从以下,看来原始的包装类(对象)实际上是由价值而不是引用处理,

> Integer foo = new Integer(1); 
> Integer bar = foo; 
> bar = new Integer(2); 
> foo 
1 

所以这是真的,从上面的报价是不完全正确?


UPDATE:我的困惑来自误解像下面的我的代码段以上和东西之间的区别来了:

> import java.util.LinkedList; 
> LinkedList<Integer> foo = new LinkedList<Integer>(); 
> foo.add(1); 
> LinkedList<Integer> bar = foo; 
> bar.remove(); 
> System.out.println(foo.size()); 
0 
> System.out.println(bar.size()); 
0 

凡在后一种情况下,bar.remove()在LinkedList的实际操作,其foobar参考。

+2

您分配给'bar',而'foo'不变。这不区分参考和值。 – 2014-12-03 22:46:36

回答

1

基元类包装是对象引用,而不是基元类型。

在您的示例中,您将为变量分配新值,而不是更新状态。这就是为什么foo保持其值(旧的,因为它从来没有改变):

Integer a = 128; 
Integer b = 128; 
System.out.println(a == b); //false 
System.out.println(a.equals(b)); //true 
+0

使用'=='来确定事情时要非常小心;包装类型有一个内置缓存,用于范围在-128和127范围内的值。因此,用127替换上例中的128将为两者打印“true”。 – 2014-12-03 22:55:52

+0

@ SanjayT.Sharma我知道。这就是为什么我使用128而不是127,这是在其他Q/A中解释的。 – 2014-12-03 22:57:24

1

您的代码片段不表明:

Integer foo = new Integer(1); 
Integer bar = foo; //bar and foo "points" to the same location 
bar = new Integer(2); //now bar only "points" to a new location, foo is unaffected 
System.out.println(foo); 

您可以轻松地通过使用==equals对比测试此包装器的行为类似于值类型:事实上,它们是引用类型,它们是不可变的。

Integer foo = new Integer(1); // foo references an object wrapping 1 
Integer bar = foo;   // bar references the same object as foo 
bar = new Integer(2);   // bar references an object wrapping 2; 
           // continues to reference 1 

一个简单的方法看到原始包装会发生什么是使用==运营商而不是调用equals比较它们是否相等。不过,您需要小心避免比较小数字的包装,因为它们是出于性能原因而被缓存的。

0

你链接到的引用是指字段访问和数组访问表达式。那些需要通过参考值来确定潜在的对象。

=操作者是被称为assignment operator.对你来说,这不是一个字段访问表达,也不是一个数组访问的表达,所以我们掉在第三种情况

  • 首先,左手评估操作数以产生变量。如果此评估突然完成,则由于同样的原因,分配表达式 会突然完成;右边的操作数不是 评估和没有分配发生。
  • 否则,评估右侧操作数。如果此评估突然完成,则由于同样的原因,分配表达式突然完成 ,并且不会发生分配。
  • 否则,将右侧操作数的值转换为左侧变量的类型,将值集转换 (§5.1.13)转换为相应的标准值集(而不是 extended-指数值集合),并且转换的结果是 存储到变量中。

所以在

bar = new Integer(2); 

bar进行评价,并产生一个变量,它本身。然后,必须评估new Integer(2)。那是一个new instance creation expression。它产生一个实例,其值是一个reference value

参考值(通常仅引用)是指向这些对象 ,和一个特殊的空引用,这是指没有对象。

一旦该值生成,它将被分配到bar

请注意foo从未涉及过。