# 包裝類
[TOC]
## 導學
Java是一門面向對象的語言,但是在Java中卻存在幾個異類,它們沒有屬性,沒有方法,也不能實現對象的交互,它們就是八大基本數據類型。而且在之前的學習中,我們也發現基本數據類型作為類的屬性,存在默認值,有些時候,這些默認值則會干擾我們的判斷。
那么,作為與基本數據類型對應的包裝類,則能很好的應對這些問題。
## 包裝類與基本數據類型
包裝類與基本數據類型是一一對應的,作為引用數據類型,包裝類擁有屬性、方法、能達成對象的交互,也就意味著我們可以通過這些屬性方法來實現之前一些沒有辦法對基本數據類型數據完成的操作。
| 基礎類型 | 包裝類型 |
| --- | --- |
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Character |
| boolean | Boolean |
## 包裝類屬性方法和構造器簡介
jdk 1.8 中文在線API地址:[http://www.matools.com/api/java8](http://www.matools.com/api/java8)
本章節的內容需要同學們,借助jdk文檔學習。
總結:
1. 包裝類沒有子類
2. 基本數據類型繼承Number
3. 字符型char和布爾型boolean繼承自Object
4. java中所有的包裝類都存放在java.lang包中
5. 包裝類的方法大部分都是static方法:靜態方法既可以通過類名調用也可以通過對象名調用
6. 包裝類中一般會提供兩種構造器用于構建對象
* 使用基本數據類型的參數;
* 使用字符串類型的參數:對于此類參數,在實際創建對象的時候要注意輸入的值要滿足條件;
## 包裝類與基本數據類型的轉換
包裝類與基本數據類型之間的轉換,非常的簡單,因為在Java中提供了裝箱與拆箱的技術。Java中,裝箱是把基本數據類型的值轉換為對應包裝類的對象,拆箱就是把包裝類對象轉換為對應基本數據類型的值。
**從基本數據類型轉成引用數據類型的方法:**
* 從構造器創建(手動裝箱)
* 自動裝箱創建
**從引用數據類型轉成基本數據類型:**
* 使用 對象.xxxxValue()(手動拆箱)
* 自動拆箱
~~~java
int y = 10;
Integer yi = new Integer(y);
Integer yi2 = y;
int y3 = yi.intValue();
boolean b = false;
Boolean bi = new Boolean(b);
Boolean bi2 = b;
boolean bi3 = bi2.booleanValue();
~~~
## 基本數據類型與字符串轉換
**基本數據類型轉換為字符串類型:**
將基本數據類型轉換為字符串,可以使用包裝類方法`toString(typeValue)`來實現轉換操作
~~~
int t1 = 10;
String t2 = Integer.toString(t1);
~~~
**字符串類型轉換為基本數據類型**
* 方法一:包裝類的`parse`方法
示例: `int t = Integer.parseInt(StringValue);`
~~~
int t3 = Integer.parseInt("3");
~~~
* 方法二: 使用包裝類的 valueOf(StringValue)的方法,先將字符串轉換為包裝類,再通過自動拆箱完成基本數據類型轉換。
示例: int t = Integer.valueOf(StringValue);
~~~
int t4 = Integer.valueOf(t2);
~~~
## 補充
* 包裝類的初始值為null
這也是為什么我們有點時候在設置類的屬性時,需要采用包裝類,因為能夠避免基本數據類型的初始值。
* 包裝類的比較
Java中有一個緩存區機制,Integer中,數值在-128到127之間的值會進行緩存,取值時會從緩存中讀取數據,如果有,直接返回地址使用;如果沒有這個數值,會new Integer進行創建。

~~~
public class Test {
public static void main(String[] args) {
Integer one = new Integer(100);
Integer two = new Integer(100);
System.out.println("one==two的結果:" + (one == two));//false 比較的是內存地址,此處one與two的內存地址不同
Integer three = 100;
System.out.println("three==100的結果:" + (three == 100));//true 自動拆箱
System.out.println("three==one的結果:" + (three == one));//false 內存地址
Integer four = 100;
/**
* 數字范圍在[-128,127]之間直接從對象池獲取(有就直接產生,沒有實例化Interger),
* 故three和four共享同一塊內存空間,
* 實際操作為 Integer four = Integer.valueOf(100);
*/
System.out.println("three==four的結果:" + (three == four));//true
Integer five = 200;
System.out.println("five==200的結果:" + (five == 200));//true 自動拆箱
Integer six = 200;
System.out.println("five==six的結果:" + (five == six));//false 超過了127的范圍,內存地址不同
}
}
~~~
* Double和Float沒有對象常量池(緩存區),其余6種基本類型的包裝類都有。不可以適用上述的比較原理
## 練習
一、選擇
1. Java中提供了名為()的包裝類來包裝字符類型
~~~
A. Integer
B. String
C. Character
D. Char
~~~
2. 以下哪一選項不是基本數據類型
~~~
A. boolean
B. float
C. Integer
D. char
~~~
3. 下列關于基本類型和包裝類的敘述中錯誤的是(多選)
~~~
A. Java中的數據類型包括基本數據類型和引用類型
B. Byte是基本數據類型
C. 基本數據類型可以調用方法
D. 每個基本數據類型都有對應的包裝類
~~~
4. Double 類,Math類,System類分別存儲于()哪個包中
~~~
A. java.io,java.io,java.lang
B. java.io,java.util,java.lang
C. java.io,java.io,java.util
D. java.lang,java.lang,java.lang
~~~
5. 下列選項中繼承自Number的是
~~~
A. Integer和long
B. Character和 Integer
C. Byte和Integer
D. long和short
~~~
6. 下面代碼運行的正確結果是

~~~
A. 350
B. 49
C. 7
D. 編譯錯誤,無法正常運行
~~~
7. 下面代碼運行的正確結果是

~~~
A. 4
B. 8
C. 編譯錯誤,無法正常運行
D. 編譯正確,但運行時產生錯誤
~~~
8. 下面代碼運行的正確結果是

~~~
A. hello
B. baby
C. 編譯錯誤,無法正常運行
D. 以上說法都不對
~~~
二、編程
1. 完成基本數據類型和包裝類之間的轉換。
運行效果參考圖

~~~
public class HelloWorld {
public static void main(String[] args) {
// 定義int類型變量,值為100
int score = 100;
// 創建Integer包裝類對象,表示變量score1的值
// 將Integer包裝類轉換為double類型
// 將Integer包裝類轉換為long類型
// 將Integer包裝類轉換為int類型
//打印輸出
}
}
~~~
2. 完成基本數據類型和包裝類之間的轉換。
運行效果參考圖

~~~
public class StringUse {
public static void main(String[] args) {
double a = 12.5;
//將基本類型轉換為字符串
String str1 =
System.out.println("a 轉換為String型后+10的結果為: "+);
String str = "2.8";
// 將字符串轉換為基本類型
double b =
System.out.println("str 轉換為double型后+10的結果為: "+);
}
}
~~~
3. 完成基本數據類型和字符串之間的轉換。
運行效果參考圖

~~~
public class HelloWorld {
public static void main(String[] args) {
//定義float類型變量,賦值為88.99
float f1 = ;
//將基本類型轉換為字符串
//打印輸出
//定義String類型變量,賦值為"188.55"
String str = ;
// 將字符串轉換為基本類型double
//打印輸出
}
}
~~~