[Java] 11.2. 自動包裝 & 自動拆裝

基本資料是可以自動包裝成外覆類別的,當然,外覆類別也可以自動拆裝成基本資料。

 

image/svg+xml11.2. ⾃動包裝 / ⾃動拆裝 - AutoBoxing/AutoUnboxing class Main{ public static void main( String [] args){ int age = 18 ; Integer iObject = age ; System.out.println(iObject); } } 執⾏結果 18 class Main{ public static void main( String [] args){ int age = 18 ; Integer iObject = age ; int age1 = iObject ; System.out.println(age1); } } 執⾏結果 18 class Main{ public static void main( String [] args){ Byte b = 10 ; Short s = 10 ; Integer i = 10 ; Long l = 10L ; Float f = 10.123F ; Double d = 10.123 ; Character c = ' A ' ; Boolean b1 = true ; byte b2 = b ; short s1 = s ; int i1 = i ; long l1 = l ; float f1 = f ; double d1 = d ; char c1 = c ; boolean b3 = b1 ; } } class Main{ public static void main( String [] args){ Integer i = 10.123 ; Float f = 10.123 ; } } 編譯時錯誤 Main.java:5: error: incompatible types: double cannot be converted to Integer Integer i=10.123; ^ Main.java:7: error: incompatible types: double cannot be converted to Float Float f = 10.123; ^ 2 errors class Main{ public static void main( String [] args){ Integer iObject = 10 ; int i = iObject ; long l = iObject ; float f = iObject ; double d = iObject ; System.out.println(i); System.out.println(l); System.out.println(f); System.out.println(d); } } 執⾏結果 10 10 10.0 10.0 class Main{ public static void main( String [] args){ Integer iObject = 10 ; Double dObject = iObject ; } } 編譯時錯誤 Main.java:7: error: incompatible types: Integer cannot be converted to Double Double dObject = iObject; ^ 1 error J11_2_1 – Main.java 1. age 變數是 int 型別的變數,其中裝的也是 int 型別的數值 18 J11_2_2 – Main.java 1. age 是⼀個整數型別( int )的變數。 2. 將從 age 變數中取出的整數值,直接放入 Integer 型別的變數當中。當然,要 能夠放入 iObject 變數中⼀定要是 Integer 型別的物件。但沒關係,編譯器會為 您將整數值⾃動包裝成 Integer 型別的物件,然後在放入 iObject 變數中。 new Integer(age) 2. iObject 是透過⾃動包裝所建立的 Integer 物件。 3. Java 提供⾃動拆裝的功能,讓我們可以裝 Integer 型別的物件,直接放 入整數型別( int )的變數中,當然若要放入整數型別的變數中,⼀定要是 整數型別的資料。因此,編譯器會代替我們呼叫 intValue() ⽅法,以取得 整數型別的資料,之後才放入整數型別的變數中。這此情況下, Integer 別的年齡資料,也可以輕易的轉換為整數型別的年齡資料。 iObject.intValue() J11_2_3 – Main.java new Byte(10) new Short(10) new Integer(10) new Long(10L) new Float(10.123F) new Double(10.123) new Character('A') new Boolean(true) b.byteValue() s.shortValue() i.intValue() l.longValue() f.floatValue() d.doubleValue() c.charValue() b1.booleanValue() 1. 每⼀個基本資料型 別,皆可以⾃動包裝成對 應的外覆類別的物件。 2. 每個外覆類別的物件,皆可透過 xxxValue() ⽅法,取出 型別的基本資料型別的值。以 Integer 外覆物件為例, Integer 外覆類別即是 int 基本資料型別所 對稱 的外覆類別,因 此在取得基本資料型別值時,會以 intValue() ⽅法取出整數值。 J11_2_4 – Main.java b1.booleanValue() 1. 編譯器會嘗試以 double 型別的資料 10.123 ,代入 Integer 類別的建 構式,但因為 Integer 型別的建構式並沒有⽀援以 double 型別的資料作為 參數,因此會編譯失敗,這即是基本資料型別與外覆類別 不對稱 ,造成 無法⾃動包裝的問題,⽽ 不對稱 的定義,即 10.123 double 基本型別 的資料,應對應的外覆類別是 Double 類別,⽽不是 Integer 類別。 2. 同樣的, Float 類別並未提供以 double 型別的資料作為參數的 建構式,因此會編譯失敗。記住,若有⼩數的數沒有在尾巴加上 “F” “f” ,因此這個數的型別將是 double ,⽽不是 float 。這也 是基本資料型別與外覆類別 不對稱 所造成的錯誤。 b1.booleanValue() J11_2_5 – Main.java iObject.intValue() iObject.longValue() iObject.floatValue() iObject.doubleValue() 1. 10 ⾃動包裝成 Integer 外覆物件。 2. 在⾃動拆裝的過程中,第 1 步是先 將外覆物件轉變成相對應的基本型別 的資料(即對稱的基本資料);例 如: Integer 的物件即會呼叫 intValue() ⽅法取得 int 型別的資 料。第 2 步將取得的資料放入變數 中;在本例中取得的 int 型別的資料 即將要被放入變數中,⽽ int 型別的 資料可以⾃動轉型成更⼤空間型別的 資料。因此,整個過程就好像⾃動拆 裝是⽀援多型的感覺。 J11_2_6 – Main.java 1. 這是透過⾃動包裝( Autoboxing )將 整數值 10 包裝成 Integer 型別的物件。 2. 千萬別以基本資料型別的觀點來看外覆類別,您不能將儲 存較⼩空間資料的外覆物件,直接交給儲存較⼤空間的外覆物件。 原因很簡單,那就是它們所屬的類別是不相同且沒有繼承關係的, 因此外覆類別的物件是不能轉型為其他型別的外覆類別物件。 ⾃動包裝,輕鬆將年齡資料包裝成 Integer 物件 ⾃動拆裝,輕鬆取出被包覆的 int 年齡資料 1 1 1 1 更多的⾃動包裝與拆裝 注意, 不對稱 的基本資料型別與外覆類別,禁⽌⾃動包裝 1 2 1 2 ⾃動拆裝, 僅拆裝成 對稱 基本資料型別的資料 1 1 注意,無繼承關係的外覆類別的物件, 禁⽌相互轉型 1 1

留言