1.為什麼要使用封裝類
在Java中有兩種變數(Variable),一種是基本型別(primitive type)的變數,還有一種是類性別(class type)的變數,即對象與非對象兩種。有時候我們需要把基本型別封裝成對象來使用,例如ArrayList,我們想在其中存放int該怎麼辦?我們能否這樣申明一個ArrayList:ArrayList<int> list=new ArrayList<>(),答案是否定滴,:(。
幸運的是,java為每一個基本型別都提供了一個相應的封裝類(Wrapper)對其進行封裝,例如int對應Integer,double對應Double,char對應Character等等。我們可以把某個封裝類的一個對象當成其對應的基本型別的一個值來看,所不同的是它現在是一個對象了,可以利用reference來進行操作了。
2.封裝類的使用
以Integer為例進行講述。封裝類的使用比較簡單,特別是在JDK5.0中。
Integer i=new Integer(3),這樣我們就建立了一個封裝類,如果我們想得到它所代表的值就可以通過i.intValue()來獲得,其它更多的方法可以參看JDK5.0協助文檔,非常容易理解與使用。需要說明的是,所以的封裝類都是final類,並且都是恒定不變(immutable)的,這包含有兩個意思:a.任何類不得繼承封裝類;b.封裝類的一個對象一經建立,其所代表的值將不再變化,也就是說我們不能通過某個指向(refer to)它的reference來改變它的值了,直至它被記憶體回收行程回收,String類也是這樣的。
3.自動打包與解包(JDK5.0新特性)
在JDK5.0以前,我們是不能直接將一個基本型別的值直接賦給其對應封裝類的一個對象類的,例如Integer i=3,這樣做是錯誤的,但是在5.0中是可以做的了,這句話自動翻譯成Integer i=new Integer(3),這叫自動打包。我們還能夠直接寫i++對i進行自增,它的執行過程是首先將i解包成一個整數3(int j=i.intValue()),把它的值加1後再打包回去(j++;i=new Integer(j),此時i應該指向了一個新的Integer對象),這樣一來將大大簡化我們的代碼了。最後,強調一點,能夠自動打包與解包要感謝我們的編譯器,因為是編譯器在編譯的時候自動幫我們把打包與解包的代碼加進去了,然後編譯成位元組碼
4.自動打包(autoboxing)的一個特徵
在java中對boolean、byte、0~127的char、-128~127的byte/short/int/long進行自動打包時,同一個值都打包成同一個對象。翻譯的不好,還是以Integer為例來進行說明,看下面的代碼:
Integer i=4;
Integer j=4;
Integer k=new Integer(4);
System.out.println(i==j);//輸出將為true
System.out.println(i==k);//輸出將為false
輸出結果為true false,現在大家應該明白上面這段話的意思了吧,:)