理解Java wrapper類

Java Wrapper類可將Java的原始數據類型處理爲對象的方式。特別是當我們需要一個原始值的對象引用時,這是必需的,因爲它們的原形式所需的功能類型(如int,char,double,boolean等)不夠。 本文比較詳細的介紹了標準API庫中提供的這些類的概念。


Java中的原類型和引用類型


在Java中,類型被指定爲基本類型引用類型

       原類型一次存儲單個聲明類型的值。 例如,定義爲int的變量可以一次存儲一個整數。 在存儲另一個值的情況下,初始值被新的值替換。
        在Java中,默認情況下會初始化原始變量。 如果它是一個數字類型,例如由byte,short,int,long,float和double指定,則將其初始化爲0(零),將char類型初始化爲數值-1,布爾類型爲 默認情況下初始化爲false。 初始默認值可能會在其聲明中分配一個值來覆蓋。

int intvalue = 102;

        但是,請注意,默認情況下,本地聲明的原始值不會初始化。 任何嘗試訪問本地未初始化變量的都產生是編譯錯誤。

        非原類型的所有其他變量實際上是引用類型。 引用類型保存對內存對象的引用。 每個引用對象可能包含許多實例變量。 它們默認會被初始化爲一個空值,意思是不引用任何內容或沒有內存對象。 引用類型變量通過聲明方法和屬性進行定義。 在通過new關鍵字調用的構造函數,對它們實例化; 通常,被創建的對象實例用於訪問它們中定義的方法。

Person person = new Person();


Java Wrapper類


        Java wrapper類旨在將原始類型存儲爲引用類型,並將其視爲實例化內存對象的引用。 這樣做的主要好處是,特定原始類型的相應wrapper類可以容納許多類型的信息,以便提供諸如從一種類型到另一種類型的轉換以及大量其他方便的功能。 因爲Java中有八個基本類型,這些wrapper類在java.lang包中的定義
 
        簡單來說,wrapper類是在Java中創建對象引用類型的原始類型的方式。我們可以說,通過提供wrapper類,使Java在面向對象技術的本質上擺脫了困境,即使是原類型沒有被保存。

        一個問題是,通過使用兩種類型的數據來管理(原始值和對象引用),Java在某些情況下不會產生問題? 答案是否定的,因爲這裏我們有兩個選擇。 在我們需要一個用作容器的對象來容納一個簡單的原始類型的情況下,除了簡單地保存該值之外,還提供了一組豐富的功能。而且除了使用wrapper類之外,沒有別的方法。 例如,由Integer類創建的對象存儲的單個int值還提供了許多靜態和非靜態功能。 其中幾個如下:

  •     一個構造函數,它使用所提供的值構造一個Integer對象:

    Integer(int value)

  •     還有一個構造函數創建一個具有int值的Integer對象,由String參數標示。 如果String參數不包含可解析整數,則會拋出異常 

    NumberFormatException。
    Integer(String s)

  • 一些成員的功能有:

    byte byteValue()
   double doubleValue()
    float floatValue()
    int intValue()
    long longValue()
    shortValue()
    這些成員函數返回由Integer對象引用表示的值的相應原類型值。

另外還有很多靜態方法,比如:
static int max(int a, int b)
static int min(int a, int b)

它們分別返回兩個int類型較大及較小的值。
        由整數wrapper類和其他wrapper類提供的相關完整函數列表,請參閱Java API文檔
鑑於其他類,此功能略微與wrapper類不同。 在Java 5之前,簡單的原類型轉換和適合wrapper類的數據結構有點不方便。 我們每次都必須創建包裝器的一個對象實例,然後才能將原始值插入到對象引用中。 還有類似的不便之處在於檢索該值。 例如,我們必須做這樣的事情:

Integer[] iArray = new Integer[10]
iArray[0] = new Integer(100);


而且,爲了檢索值,我們必須處理如下事項:
int value = iArray[0].intvalue();


隨着Java 5引入自動封箱和自動拆箱,上述條件可以通過較少的代碼實現,如下所示:
Integer[] iArray = new Integer[10];
iArray[0] = 100;
int value = iArray[0];


        在此,自動封箱意味着將原類型的值轉換爲相應的類型wrapper對象引用。 而且,自動拆箱是指將類型wrapper對象引用的對象轉換爲對應的原類型值。 因爲這是在沒有開發人員涉入的情況下自動完成的,所以操作分別稱爲自動裝箱和自動拆箱。

在上述代碼中,語句中會出現自動封箱
iArray[0] = 100;
int值100被自動打包成整數對象引用並存儲。 這樣存儲的值不再是原類型,但是對象引用。
同樣,語句中會出現自動拆箱
int value = iArray[0];

這裏,wrapper類Integer的對象引用被轉換爲原值並存儲在原類型int變量值中。


結論


        Wrapper類是個好用的類。 如果我們要比較使用wrapper類和原類型之間獲得的性能優勢,很明顯,必須使用原始類型。 另外要記住的一個重要點是,如果我們通過引用函數傳遞一個原始值,那麼我們必須使用一個對象引用(wrapper類),因爲Java將基本類型通過值傳遞給方法。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章