2014-12-03 67 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從未涉及過。