<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 曉宇 閱讀(446) 評論(0)  編輯  收藏 所屬分類: JAVA基礎

    主站蜘蛛池模板: 亚洲 小说区 图片区 都市| 69精品免费视频| 日本一道高清不卡免费| 亚洲ts人妖网站| 国产a视频精品免费观看| 亚洲欧洲国产日韩精品| 国产成年无码久久久免费| 国产AⅤ无码专区亚洲AV| 可以免费观看的国产视频| 亚洲国产天堂久久综合网站| 99久久人妻精品免费二区| 久久国产亚洲精品无码| 亚洲网站免费观看| 久久久久se色偷偷亚洲精品av| 男女免费观看在线爽爽爽视频| 亚洲中文字幕无码久久| 午夜一级免费视频| 美女隐私免费视频看| 中文字幕日韩亚洲| 久久成人免费电影| 亚洲AV无码乱码在线观看代蜜桃 | 亚洲日产2021三区| 免费无码AV电影在线观看| 亚洲午夜无码毛片av久久京东热| 免费无码一区二区三区蜜桃大| 免费的黄网站男人的天堂| 亚洲精品无码AV人在线播放| 1000部拍拍拍18勿入免费视频下载 | 97超高清在线观看免费视频| 亚洲中文字幕无码日韩| 日韩内射激情视频在线播放免费 | 亚洲va中文字幕无码久久| 亚洲一区二区三区免费观看| 亚洲国产精品嫩草影院| 国产亚洲老熟女视频| 最近免费中文字幕大全免费版视频| 亚洲AV日韩综合一区尤物| 亚洲va中文字幕无码| 91久久精品国产免费一区| 亚洲av综合日韩| 人人狠狠综合久久亚洲88|