[Java] 11.1. 外覆類別

關於基本資料,Java也準備了對應的外覆類別以提供更多更方便的功能。

 

image/svg+xml11.1. 外覆類別 - Wrapper class Main { public static void main( String [] args){ String ageStr = " 18 " ; int age = ageStr ; } } 編譯時錯誤 Main.java:5: error: incompatible types: String cannot be converted to int int age = ageStr; ^ 1 error class Main{ public static void main( String [] args){ String ageStr = " 18 " ; System.out.println( ageStr+ 1 ); int age = Integer.parseInt ( ageStr ); System.out.println( age+ 1 ); } } 執⾏結果 181 19 class Main{ public static void main( String [] args){ byte b1 = Byte.parseByte ( " 10 " ); short s = Short.parseShort ( " 100 " ); int i = Integer.parseInt ( " 1000 " ); long l = Long.parseLong ( " 10000 " ); float f = Float.parseFloat ( " 20.5F " ); double d = Double.parseDouble ( " 10.123 " ); boolean b2 = Boolean.parseBoolean ( " TRUE " ); System.out.println(b1); System.out.println(s); System.out.println(i); System.out.println(l); System.out.println(f); System.out.println(d); System.out.println(b2); } } 執⾏結果 10 100 1000 10000 20.5 10.123 true class Main{ public static void main( String [] args){ boolean b1 = Boolean.parseBoolean ( " TRUE " ); boolean b2 = Boolean.parseBoolean ( " True " ); boolean b3 = Boolean.parseBoolean ( " False " ); boolean b4 = Boolean.parseBoolean ( " 0 " ); boolean b5 = Boolean.parseBoolean ( " 1 " ); boolean b6 = Boolean.parseBoolean ( " -1 " ); boolean b7 = Boolean.parseBoolean ( " abc " ); System.out.println(b1); System.out.println(b2); System.out.println(b3); System.out.println(b4); System.out.println(b5); System.out.println(b6); System.out.println(b7); } } 執⾏結果 true true false false false false false class Main{ public static void main( String [] args){ boolean b = Boolean. parseBoolean ( " x " ); byte b1 = Byte. parseByte ( " a " ); short s = Short. parseShort ( " b " ); int i = Integer. parseInt ( " c " ); long l = Long. parseLong ( " d " ); float f = Float. parseFloat ( " e " ); double d = Double. parseDouble ( " f " ); } } 執⾏時異常 Exception in thread "main" java.lang.NumberFormatException: For input string: "a" at java.lang.NumberFormatException.forInputString(NumberForm atException.java:65) at java.lang.Integer.parseInt(Integer.java:580) at java.lang.Byte.parseByte(Byte.java:149) at java.lang.Byte.parseByte(Byte.java:175) at Main.main(Main.java:7) Java 針對每個基本資料型別,建立了對應的外覆類別,⽬的就是為了提供⼀些好⽤的功能,例如: parseXxx() 這類的⽅法是可以解析字串,並轉換為對應的基本資料型別的資料的。現在就讓我們來作 ⼀個簡單的整理。 外覆類別的命名⽅式,遵守下列兩個規則: 1. 第⼀個英⽂字⺟必須是⼤寫,並非像基本資料型別以⼩寫的字⺟當開頭。 2. 外覆類別的名稱皆是以完整的單字呈現,並未以縮寫的⽅式呈現。 class Main{ public static void main( String [] args){ Integer i1 = new Integer ( 18 ); Integer i2 = new Integer ( " 18 " ); System.out.println(i1); System.out.println(i2); } } 執⾏結果 18 18 class Main{ public static void main( String [] args){ Integer i1 = new Integer ( 1000 ); Long l1 = new Long ( 10000L ); Float f1 = new Float ( 20.5F ); Double d1 = new Double ( 10.123 ); Boolean b2 = new Boolean ( true ); Byte b1 = new Byte (( byte ) 10 ); Short s1 = new Short (( short ) 100 ); Byte b3 = new Byte ( " 10 " ); Short s2 = new Short ( " 100 " ); Integer i2 = new Integer ( " 1000 " ); Long l2 = new Long ( " 10000 " ); Float f2 = new Float ( " 20.5F " ); Double d2 = new Double ( " 10.123 " ); Boolean b4 = new Boolean ( " TRUE " ); Character c = new Character ( ' A ' ); } } class MainClass{ public static void main( String [] args){ Integer i1 = Integer.valueOf ( 1000 ); Long l1 = Long.valueOf ( 10000L ); Float f1 = Float.valueOf ( 20.5F ); Double d1 = Double.valueOf ( 10.123 ); Boolean b2 = Boolean.valueOf ( true ); Byte b1 = Byte.valueOf (( byte ) 10 ); Short s1 = Short.valueOf (( short ) 100 ); Byte b3 = Byte.valueOf ( " 10 " ); Short s2 = Short.valueOf ( " 100 " ); Integer i2 = Integer.valueOf ( " 1000 " ); Long l2 = Long.valueOf ( " 10000 " ); Float f2 = Float.valueOf ( " 20.5F " ); Double d2 = Double.valueOf ( " 10.123 " ); Boolean b4 = Boolean.valueOf ( " TRUE " ); Character c = Character.valueOf ( ' A ' ); } } class Main{ public static void main( String [] args){ int age1 = 18 ; Integer iObject = new Integer ( age1 ); int age2 = iObject.intValue (); } } class Main{ public static void main( String [] args){ int age1 = 18 ; Integer iObject = new Integer ( age1 ); byte b = iObject.byteValue (); short s = iObject.shortValue (); long l = iObject.longValue (); float f = iObject.floatValue (); double d = iObject.doubleValue (); System.out.println(b); System.out.println(s); System.out.println(l); System.out.println(f); System.out.println(d); } } 執⾏結果 18 18 18 18.0 18.0 數值類的基本資料型別皆可以透過轉型來改變型別。相對的,數值類別外覆類別,也提供了相關的轉 型服務。例如 Double 的外覆類別的物件,可以透過 xxxValue() ⽅法,將所包含的數值轉換另⼀種基本 資料型別的數值資料。 class Main{ public static void main( String [] args){ Double dObject = new Double ( 100.123 ); byte b = dObject.byteValue (); int i = dObject.intValue (); short s = dObject.shortValue (); long l = dObject.longValue (); float f = dObject.floatValue (); double d = dObject.doubleValue (); System.out.println(b); System.out.println(i); System.out.println(s); System.out.println(l); System.out.println(f); System.out.println(d); } } Java 的外覆類別提供的功能主要可分為下列3項: 1 、解析字串為基本資料型別的資料;2、將基本資 料或字串包覆為外覆類別; 3 、將外覆類別轉換為基本資料型別。 基本資料型別 外覆類別 byte Byte short Short int Integer long Long float Float double Double char Character boolean Boolean 外覆類別 ⽅法 回傳的基本資料型別 Byte Short Integer Long Float Double byteValue() byte shortValue() short intValue() int longValue() long floatValue() float doubleValue() double J11_1_1 – Main.java 2. 因此任何型別的資料,當與字串作連結運算 (+) 時, 所有的資料皆會被轉換為字串,然後連結在⼀起。 J11_1_2 – Main.java String "18" 轉換? 18 int 1. ageStr 變數,來模擬並裝載使⽤者輸入的年齡字串。 2. 加上雙引號的年齡資料,將會以字串的格式呈現。 3. 將字串的 "18" 轉放入 int 型別的 age 變數中,此時會發⽣ 編譯失敗,要如何將字串的 "18" 轉成 int 型別的 18 呢? 1. 加上雙引號的年齡資料,將會以字串的格式呈現。 3. 這時,可透過透過 Integer 類別的靜態⽅法- parseInt() 將字串格式的年齡資料轉換為整數型別 (int) 的資料。 4. 如此就可以使⽤⽤整數型別的年齡資料作算術運算,將年齡加上 1 J11_1_3 – Main.java 1. 基本上,每種基本資料型別皆有對應的類別,提供相關的 parseXxx() ⽅法,以將字串轉為對應型別的資料。 2. long 型別的資料,當使⽤字串的⽅式呈現時,千萬不可以在後⾯加上 ⼀個 L/l ,否則經由 Long 類別的 parseLong() ⽅法轉換時會發⽣異常。 3. float 型別的資料,當使⽤字串的⽅式呈現時,也是可以在後⾯ 加上⼀個 F/f ,並經由 Float 類別的 parseFloat() ⽅法轉換的。 4. 只要是 true 的英⽂字,不論⼤⼩寫,在經由 Boolean 類別的 parseBoolean() ⽅法轉換時,皆可 轉成對 true 值。當然 false 也是可以不分⼤⼩寫。 J11_1_4 – Main.java 1. 只有當字⾯意思為 "true" 時, parseBoolean() ⽅法才能成功的輸出 true 的布林值。 2. 只要字⾯不是 "true" 的意思,此時經由 parseBoolean() ⽅法所得到的布林值皆是 false J11_1_5 – Main.java 1. 記住,只有 parseBoolean() ⽅法是不會發⽣異常的。只要字⾯ 上不是 "true" (不分⼤⼩寫),最後皆會轉換成 false 的布林值。 2. 這些轉換數值類的 parseXxx() ⽅法,若給予的是非數值的字串內容, 則這時會發⽣數值格式異常物件( NumberFormatException ),告知我 們數值的格式出了錯,無法轉換成功。在此,因於 parseByte() ⽅法即發 ⽣錯誤,因此下列的異常訊息為 parseByte() ⽅法產⽣的異常。 J11_1_6 – Main.java 1. 您可以使⽤整數值作為 Integer 建構式的參數。 2. 基本上, Integer 的建構式是多載的,在此您也可以以字串的⽅式作為 Integer 的建構式參數,它會剖析這個字串的內容是不是⼀個整數,若是的話 會這個字串格式的整數轉換成整數值,以建立 Integer 類別的物件;但若剖析 失敗則會產⽣數值格式異常物件( NumberFormatException )。 J11_1_7 – Main.java 1. 基本上,每個基本資料型別皆有⼀個對應的外覆類別,當然,它 們皆有提供建構式,讓您可以裝基本資料包覆為外覆類別的物件。 2. 但需要特別注意建立 Byte Short 外覆類別的物件時,需要先將它 們轉型為 byte short 型別的資料才可建立成功。原因是整數的預設型 別是整數型別 (int) ,因此要強迫轉型為 byte short 型別的資料。 3. 外覆類別也透過多載的技術,讓建構式⽀援以字串的格式,當作參數來建立外覆類別的物件。 4. 唯獨字元的外覆類別 -Character ,只⽀援以字元當作建立字元外 覆類別建構式的參數。不⽀援字串為參數的原因是字元本來就是⽤來表 ⽰⼀個字元的,因此並不需要表⽰多個字元的字串作為建構式的參數。 J11_1_8 – Main.java 1. 要建立外覆類別的物件,也可以透過基本型別的資料作為 valueOf() ⽅法的參數來建立物件。 2. 但需要特別注意建立 Byte Short 外覆類別的物件時,需要先將它 們轉型為 byte short 型別的資料才可建立成功。原因是整數的預設型 別是整數型別 (int) ,因此要強迫轉型為 byte short 型別的資料。 3. 外覆類別也透過多載的技巧,⽀援以字串格式的資料當作 valueOf() ⽅法的參數,來建立外覆類別的物件,基本上以等同於外覆類別的建構式。 4. 唯獨字元的外覆類別 -Character ,只⽀援以字元當作 valueOf() ⽅法的參數。不⽀援字串為參數的原因是字元本來就是⽤來表⽰⼀個字 元的,因此並不需要表⽰多個字元的字串作為 valueOf() ⽅法的參數。 J11_1_9 – Main.java 1. 18 放入 age1 變數中, age1 是⼀個整數型別( int )的變數。 2. age1 是整數型別的變數,其中放 了值為 18 的年齡資料,在交由 Integer 的建構式後,即可將整數的 年齡資料包外在 Integer 物件之中。 3. 若要將包覆在 Integer 物件中的整數取出,且取出的型別是基本資料型別的整數 型別,這時可以使⽤ intValue() ⽅法,即可取得包覆在 Integer 物件中的整數資 料。⽽ intValue() ⽅法就如同字⾯上的意思, "to int" ,變為⼀個整數資料。 J11_1_10 – Main.java 1. 建立 Integer 類別的物件,其可以裝 int 型別的資料裝在其中保存。 2. byte short 是比整數型別( int )容量還要⼩的型別,因此需要強轉型才可以 將整數型別的資料變更為 byte short 型別的資料,但因為是透過 byteValue() shortValue() ⽅法執⾏的,因此在這兩個⽅法中,皆提供了強制轉型的功能。 3. float double 皆是有⼩數的型別,因此將整數轉型成 float double 型別後,皆會產⽣⼩數位數的部份。 J11_1_10 – Main.java 1. 只要是數值數的外覆類別的物件,皆提供 byteValue() shortValue() intValue() longValue() floatValue() doubleValue() 等⽅法,以取得對應的基本資料型別的資料,同時也 為您提供了轉型服務。在此以 Double 外覆類別為例。 xxxValue() 建構式 / valueOf() 建構式 / valueOf() 字串 parseXxx() 基本資料 外覆物件 以字串⽅式呈現的年齡資料, 如何將它轉成整數的資料呢? 1 1 parseInt() ,將年齡字串整數 1 2 1 2