csusky

          常用鏈接

          統計

          最新評論

          JDK1.5的自動裝箱功能

          在JAVA JDK1.5以后具有的自動裝箱與拆箱的功能,所謂的自動裝箱
          與拆箱也就是把基本的數據類型自動的轉為封裝類型。

          如:自動裝箱,它可以直接把基本類型賦值給封裝類型

          Integer num = 10 ;

          Double d = 2d ;

          自動拆箱,它可以把封裝類型賦值給基本類型

          int num = new Integer(10);

          double d = new Double(2d);

          自動裝箱與拆箱的功能事實上是編譯器來幫您的忙,編譯器在編譯時期依您所編寫的語法,決定是否進行裝箱或拆箱動作。在自動裝箱時對于值從-128到127之間的值,它們被裝箱為Integer對象后,會存在內存中被重用,所以范例4.6中使用==進行比較時,i1 與 i2實際上參考至同一個對象。如果超過了從-128到127之間的值,被裝箱后的Integer對象并不會被重用,即相當于每次裝箱時都新建一個Integer對象,所以范例4.7使用==進行比較時,i1與i2參考的是不同的對象。所以不要過分依賴自動裝箱與拆箱,您還是必須知道基本數據類型與對象的差異。

              public void testBoxingUnboxing() {

                  int i = 10;

                  Integer inta = i;

                  inta++;

                  inta += 1;

                  int j = inta;

                  assertTrue(j == inta);結果是:true//junit里面的方法

                  assertTrue(j == new Integer(j)); 結果是:true

                  assertTrue(10000 == new Integer(10000)); 結果是:true

              }

          Integer i = 100.相當于編譯器自動為您作以下的語法編譯:

          Integer i = new Integer(100).所以自動裝箱與拆箱的功能是所謂的“編譯器蜜糖”(Compiler Sugar),雖然使用這個功能很方便,但在程序運行階段您得了解Java的語義。例如下面的程序是可以通過編譯的:

          Integer i = null.int j = i.這樣的語法在編譯時期是合法的,但是在運行時期會有錯誤,因為這種寫法相當于:

          Integer i = null.int j = i.intValue().null表示i沒有參考至任何的對象實體,它可以合法地指定給對象參考名稱。由于實際上i并沒有參考至任何的對象,所以也就不可能操作intValue()方法,這樣上面的寫法在運行時會出現NullPointerException錯誤。

          自動裝箱、拆箱的功能提供了方便性,但隱藏了一些細節,所以必須小心。再來看范例4.6,您認為結果是什么呢?

          Ü. 范例4.6 AutoBoxDemo2.java

          public class AutoBoxDemo2 {

          public static void main(String[] args) {
          Integer i1 = 100;

          Integer i2 = 100;

          if (i1 == i2)

          System.out.println("i1 == i2");

          else

          System.out.println("i1 != i2").

          }

          }

          從自動裝箱與拆箱的機制來看,可能會覺得結果是顯示i1 == i2,您是對的。那么范例4.7的這個程序,您覺得結果是什么?

          Ü. 范例4.7 AutoBoxDemo3.java

          public class AutoBoxDemo3 {

          public static void main(String[] args) {

          Integer i1 = 200;

          Integer i2 = 200;

          if (i1 == i2)

          System.out.println("i1 == i2");

          else

          System.out.println("i1 != i2");

          }

          }

          結果是顯示i1 != i2這有些令人驚訝,兩個范例語法完全一樣,只不過改個數值而已,結果卻相反。

          其實這與==運算符的比較有關,在第3章中介紹過==是用來比較兩個基本數據類型的變量值是否相等,事實上==也用于判斷兩個對象引用名稱是否參考至同一個對象。

          在自動裝箱時對于值從–128127之間的值,它們被裝箱為Integer對象后,會存在內存中被重用,所以范例4.6中使用==進行比較時,i1 i2實際上參考至同一個對象。如果超過了從–128127之間的值,被裝箱后的Integer對象并不會被重用,即相當于每次裝箱時都新建一個Integer對象,所以范例4.7使用==進行比較時,i1i2參考的是不同的對象。

          所以不要過分依賴自動裝箱與拆箱,您還是必須知道基本數據類型與對象的差異。范例4.7最好還是依正規的方式來寫,而不是依賴編譯器蜜糖(Compiler Sugar)。例如范例4.7必須改寫為范例4.8才是正確的。

          Ü. 范例4.8 AutoBoxDemo4.java

          public class AutoBoxDemo4 {
          public static void main(String[] args) {

          Integer i1 = 200;

          Integer i2 = 200;

          if (i1.equals(i2))

          System.out.println("i1 == i2");

          else

          System.out.println("i1 != i2");

          }

          }

          結果這次是顯示i1 == i2。使用這樣的寫法,相信也會比較放心一些,對于這些方便但隱藏細節的功能到底要不要用呢?基本上只有一個原則:如果您不確定就不要用。

          posted on 2008-05-16 11:33 曉宇 閱讀(451) 評論(0)  編輯  收藏 所屬分類: JAVA基礎

          主站蜘蛛池模板: 宁化县| 沈阳市| 绿春县| 宁都县| 丹阳市| 酒泉市| 芜湖县| 乐业县| 托里县| 英德市| 措勤县| 长治县| 横峰县| 甘洛县| 湛江市| 江川县| 平乐县| 确山县| 新兴县| 治县。| 阳新县| 宁海县| 乌鲁木齐市| 突泉县| 桓仁| 海晏县| 昂仁县| 巴中市| 台东县| 镇远县| 安图县| 腾冲县| 兰西县| 衡山县| 滦南县| 迁安市| 邢台市| 青阳县| 上犹县| 汝城县| 公安县|