# 包装类
[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
//打印输出
}
}
~~~
