2013年9月3日 星期二

Wrapper classes


 
作者: 許裕永
用基本資料型別所宣告的變數,與用類別宣告的參考變數,儲存的內容不一樣。變數儲存的是值;參考變數儲存的是物件代號。變數只能儲存一個值,而這個值的運 算,一定要靠設計師一行一行的撰寫程式碼;參考變數儲存的物件代號,代表一個物件。物件中儲存著一個或一個以上的值,呼叫物件的方法,就可以針對這些值做 特定的運算。
為了簡化程式設計師的工作,Java提供了相當多的類別。其中和8個基本資料型別相對應的類別,我們統稱為Wrapper Classes類別。這些類別 建構的物件,除了可以儲存基本資料型別的值,當然也可以呼叫方法,來執行特定的運算。除了簡化設計師的工作外,在進階的運算時,效率也比較好。所以 Java也一直增加這些類別的功能,希望設計師日後開發類別的時候,可以方便這些類別和基本資料型別的交替使用。
1. 建構方法

基本資料型別
Wrapper Classes中對應基本資料型別的類別的類別名稱 建構方法可以接受的參數型別
byte Byte byteString
short Short shortString
int Integer intString
long Long longString
float Float floatdouble
String
double Double doubleString
char Character char
boolean Boolean boolean String
例一:
Integer i=new Integer(8);
Float f=new Float(8.0);
Boolean b=new Boolean(false);
Scanner s=new Scanner(System.in);
Integer i2=new Integer(s.next());
Integer i3=new Integer(s.nextInt());
雖然參考變數f的Float建構方法中的參數值8‧0是一個double的值,但這是合法的。因為Float有一個可以接受double值為參數的建構方法。參考變數i2及i3的建構方法,分別接受使用者輸入的字串及int值為參數。
例二:
Byte b=new Byte(3);
本敍述句會造成編譯錯誤,因為參數值3是int型別,而Byte類別的建構方法只接受byte型別的值,或String類別的物件。
例三:
Double d=new Double(3);
本敍述句合法,因為參數值3是int型別,而int型別會自動轉型為double型別後,再呼叫參數型別為double的建構方法。
2. 重要方法
各類別分別提供了相當多的方法,來執行各型別的特定運算,本節介紹的只是從各類別物件中「取值」或「轉換型別」的方法,而各類別又不完全一樣,讀者應自行參考說明文件練習。
方法一: xxx xxxValue()
運算結果:取得該物件xxx型別的值,xxx是基本資料型別的意思。例:intValue()或floatValue()。
  Boolean Character Byte Short Integer Long Float Double
booleanValue
x
             
charValue  
x
           
byteValue    
x
x
x
x
x
x
shortValue    
x
x
x
x
x
x
intValue    
x
x
x
x
x
x
longValue    
x
x
x
x
x
x
floatValue    
x
x
x
x
x
x
doubleValue    
x
x
x
x
x
x
標示‘x’者表示該類別有宣告此方法。
例一:
Double d=new Double(3.14);
float f=d.floatValue();
int i=d.intValue();
System.out.println(f);
System.out.println(i);
取得物件的值並轉換為指定的資料型別。
方法二:static xxx parseXxx(String s)
    static xxx parseXxx(String s,int radix)
此方法屬於類別方法成員,可以用物件名稱呼叫,也可以用類別名稱呼叫。Wrappers類別中除了Character外,各類別均有宣告此方法。運算結果:將String物件的字串值轉換成xxx型別的值。若是整數可以用第二個參數指定進位方式。
特別要注意的是:此方法是轉換為基本資料型別的值,不是建構成物件。
例一:
boolean b=Boolean.parseBoolean("true");
boolean b2=Boolean.parseBoolean("TrUe");
boolean b3=Boolean.parseBoolean("Ture");
System.out.println(b);
System.out.println(b2);
System.out.println(b3);
用來轉換為布林值的字串值,沒有大小寫的區分。但只要不是true的大小寫組合,便一律轉換為false(例b3之值即為false)。
例二:
int i=Integer.parseInt("abc");
除了Boolean外的其他類別,若字串物件參數的內容與其資料型態不符,會產生執行時期的錯誤。
需要兩個參數的方法,其第二個參數用來指定轉換時的進位方式,2為2進位,8為8進位,16為16進位。只有四個整數類別才有宣告這個方法。
例一:
int i=Integer.parseInt("11");
int i2=Integer.parseInt("11",2);
int i3=Integer.parseInt("11",8);
int i4=Integer.parseInt("11",16);
System.out.println(i);
System.out.println(i2);
System.out.println(i3);
System.out.println(i4);
列印的結果為:11 3 9 17。
方法三:static 類別名稱 valueOf(參數)
類別 Boolean Character Byte Short Integer Long Float Double
參數樣式 boolean String char byteString
String,int
shortString
String,int
intString
String,int
longString
String,int
floatString doubleString
Wrappers中的每個類別均有宣告此方法,但參數樣式不完全一樣。它也是類別方法成員,會用參數來建構該類別之物件。請注意它和parseXxx的差異性。
運算結果:將參數值建構成本類別物件。
例一:
Boolean b=Boolean.valueOf("true");
Boolean b2=Boolean.valueOf("TrUe");
Boolean b3=Boolean.valueOf("abc");
System.out.println(b);
System.out.println(b2);
System.out.println(b3);
此方法的運算結果是建構該類別的物件,parseXxx的運算結果是基本資料型別的值。
例二:
Integer i=Integer.valueOf("11");
Integer i2=Integer.valueOf("11",2);
Integer i3=Integer.valueOf("11",8);
Integer i4=Integer.valueOf("11",16);
System.out.println(i);
System.out.println(i2);
System.out.println(i3);
System.out.println(i4);
整數型態的類別,擁有可以指定進位方式的方法。
方法四:String toString()
    static String toString(參數)
Wrappers中所有類別均有宣告這兩式的toString()。
運算結果:將物件本身的值建構成String物件,大部份用於輸出。或把參數值建構成String物件,大部份用來執行基本資料型別直接轉換為字串值,可以省略建構成物件的手續。
例一:
Double d=new Double(3.14159);
String s="半徑值:" + d.toString();
System.out.println(s);
d‧toString()取得d物件的值來建構字串物件,再與前面的字串物件串聯。
例二:
String s="半徑值:" + Double.toString(3.14159);
System.out.println(s);
用類別名稱呼叫類別方法,用參數值建構字串物件。
方法五:static String toBinaryString(參數)
    static String toOctalString(參數)
    static String toHexString(參數)
運算結果:把參數值以指定的進位方式建構成String物件。三個方法分別為2進位,8進位及16進位。但只有Integer及Long這兩個類別有宣告這三個方法。另外Double及Float有宣告16進位的方法。其他的類別都沒有宣告這三個方法中的任何一個方法。
例一:
System.out.println("2進位的123:" + Integer.toBinaryString(123));
System.out.println("8進位的123:" + Integer.toOctalString(123));
System.out.println("16進位的123:" + Integer.toHexString(123));
System.out.println("16進位的123.123:" + Double.toHexString(123.123));
非10進位的值,在SCJP5‧0的測驗中不考,讀者知道方法的功能即可,不必了解轉換方式。
3. 物件比對
和String類別一樣,Wrapper Classes中所有類別的equals()方法,都提供物件內容比對的運算。也就是說:“==”用來比對參考變數是否代表同一個物件,equals用來比對兩個物件的值是否相同。
例一:
Integer i=new Integer(3);
Integer i2=new Integer(3);
System.out.println(i==i2);
System.out.println(i.equals(i2));
列印:false true。
例二:
Integer i=new Integer(3);
Byte b=new Byte((byte)3);
System.out.println(i.equals(b));
兩個物件的值雖然都是3,但是因為兩個物件屬於不同類別,所以equals()比對的結果為false。請注意:不同類別的物件,可以用equals()做比對,並不會產生編譯錯誤,也不會產生執行時期錯誤,只是其比對結果一定是false。
4. 認證重點整理
4-1建構方法
  • 各類別建構方法所需要的參數並不完全一樣。
  • 4-2重要方法
  •  呼叫xxxValue會取得該物件轉換為xxx型別的值。
  • parseXxx(String s)屬於類別方法成員,可以用物件名稱呼叫,也可以用類別名稱呼叫。Wrappers類別中除了Character外,各類別均有宣告此方法,用來把字串物件轉換為該類別對應的基本資料型別的值。
  • Wrappers中的每個類別均有宣告valueOf(參數),但參數樣式不完全一樣。它也是類別方法成員,用來把參數轉換為該類別之物件。
  • toString()是物件方法成員,可以用物件值建構一個字串物件。
  • toString(參數)是類別方法成員,可以用參數值建構一個字串物件。
  • Integer及Long這兩個類別均有宣告將參數值轉換為2進位、8進位及16進位值的方法。
  • Double及Float這兩個類別均有宣告將參數值轉換為16進位值的方法。
  • 4-3物件比對
  • 和String類別一樣,Wrappers中所有類別的equals方法,都提供物件內容比對的運算。
  • 沒有留言:

    張貼留言

    注意:只有此網誌的成員可以留言。