程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java JDK之小心使用boxing

Java JDK之小心使用boxing

編輯:關於JAVA

自動裝箱與拆箱的功能事實上是編譯器來幫您的忙,編譯器在編譯時期依您所編寫的語法,決定是否進行裝箱或拆箱動作。例如: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)
        .out.println("i1 == i2");
      else
        .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)
        .out.println("i1 == i2");
      else
        .out.println("i1 != i2");
    }
}

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

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

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

所以不要過分依賴自動裝箱與拆箱,您還是必須知道基本數據類型與對象的差異。范例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))
        .out.println("i1 == i2");
      else
        .out.println("i1 != i2");
    }
}

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

建議新手不要使用自動裝箱、拆箱的語法,在這裡說明這個功能是為了要完整性介紹Java SE 6的特性,新手入門的話,最好在對對象有較深入了解之後,再來使用這個功能。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved