包裝類的應用
1、包裝類介紹
雖然 Java 語言是典型的面向對象編程語言,但其中的八種基本數據類型並不支持面向對象編程,基本類 型的數據不具備“對象”的特性——不攜帶屬性、沒有方法可調用。 沿用它們只是爲了迎合人類根深蒂固 的習慣,並的確能簡單、有效地進行常規數據處理。 這種藉助於非面向對象技術的做法有時也會帶來不便,比如引用類型數據均繼承了 Object 類的特性,要 轉換爲 String 類型(經常有這種需要)時只要簡單調用 Object 類中定義的toString()即可,而基本數據 類型轉換爲 String 類型則要麻煩得多。爲解決此類問題 ,Java爲每種基本數據類型分別設計了對應的 類,稱之爲包裝類(Wrapper Classes),也有教材稱爲外覆類或數據類型類。
基本數據類型 | 對應的包裝類 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
float | Float |
double | Double |
boolean | Boolean |
每個包裝類的對象可以封裝一個相應的基本數據類型的數據,並提供了其他一些有用的方法。包裝類對象一經創建,其內容(所封裝的金幣恩類型數據值)不可改變。
基本類型和對應的包裝類可以相互轉換:
- 由基本類型向對應的包裝類轉換稱爲裝箱,例如把int包裝成Integer類的對象;
- 包裝類相對應的基本類型轉換稱爲拆箱,例如把Integer類的對象重新簡化爲int。
2、包裝類的應用
【1、實現int和Integer的互相轉換】
可以通過Integer類的構造方法將int裝箱,通過Integer類的intValue方法將Integer拆箱。
package com.packaging;
public class Demo01 {
public static void main(String[] args) {
int m = 500;
Integer obj = new Integer(m); //手動裝箱
int n = obj.intValue(); //手動拆箱
System.out.println("n=" + n);
Integer obj1 = new Integer(500);
System.out.println("obj等價於obj1?"+ obj.equals(obj1));
}
}
【2、將字符串轉換爲整數】
Integer類有一個靜態的paseInt()方法,可以將字符串轉換爲整數,語法爲:
parseInt(String s, int radix);
s爲要轉換的字符串,radix爲進制,可選,默認爲十進制。
下面的代碼將告訴你什麼樣的字符串可以轉換爲整數:
package com.packaging;
public class Demo03 {
public static void main(String[] args) {
String[] s = {"123","456","$44","dsf55"};
for (String str1:s) {
try {
int m = Integer.parseInt(str1);
System.out.println("是字符串"+ m);
} catch (NumberFormatException e) {
System.out.println("不是字符串" + str1);
}
}
}
}
【3、將整數轉換爲字符串】
Integer類有一個靜態的toString()方法,可以將整數轉換爲字符串。或者直接在整數後面加空字符串即可!
package com.packaging;
public class Demo04 {
public static void main(String[] args) {
int a = 123;
String s = Integer.toString(a);
String s2 = s+"";
System.out.println(s);
System.out.println(s2);
}
}
3、自動拆箱和裝箱
上面的例子都需要手動實例化一個包裝類,稱爲手動拆箱裝箱。Java1.5(5.0)之前必須手動拆箱裝箱。
Java1.5之後可以自動拆箱裝箱,也就是在進行基本數據類型和對應的包裝類轉換時,系統將自動進行,這將大大方便程序員的代碼書寫。
package com.packaging;
public class Demo02 {
public static void main(String[] args) {
int m = 500;
Integer obj = m; //自動裝箱
int n = obj; //自動拆箱
System.out.println("n="+n);
Integer obj1 = 500;
System.out.println(obj==obj1);
System.out.println("obj等價於obj1?"+ obj.equals(obj1));
}
}
自動裝箱與拆箱的功能事實上是編譯器來幫您的忙,編譯器在編譯時期依據您所編寫的語法,決定是否進行裝箱或者拆箱的動作。例如:
Integer i =100;
相當於編譯器自動爲您作一下的語法編譯:
Integer i = new Integer(100);
所以自動裝箱與拆箱的功能是所謂的“編譯器蜜糖”(Compiler Sugar),雖然使用這個功能很方便,但在程序進行階段您得了解java的語義。例如下面的程序是可以通過編譯的:
Integer obj = null;
int i = obj;
這樣的語法在編譯時期是合法的,但是在運行時期會有錯誤,因爲這種寫法相當於:
Integer obj = null;
int j = obj.intValue();
null表示obj沒有參考至任何的對象實體,它可以合法地指定給對象參考名稱。由於實際上obj並沒有參考至任何的對象,所以也就不可能操作intValue()方法,這樣上面的寫法在運行時會出現NullPointerException錯誤。
自動拆箱裝箱是一個常用的功能,需要重點掌握。
一般地,當需要使用數字的時候,我們通常使用內置數據類型,如:byte、int、long、double等。然而,在實際開發過程中,我們經常會遇到需要使用對象,而不是內置數據類型的情況。爲了解決這個問題,Java語言爲每一個內置數據類型提供了對應的包裝類。
所有的包裝類(Integer、Long、Byte、Double、Float、Short)都是抽象類Number的子類。