包装类
要知道什么是装箱和拆箱,首先要了解什么是包装类。
在面向对象当中“一切皆对象”。
基本数据类型变量不是对象,比如 int a = 10; 当中就没有对象,所以就很矛盾。
此时我们就可以对象基本数据类型进行包装,把基本数据类型包装一个对象。
把基本数据类型变的更强大,以面向对象的思想来去使用这些类型。
对基本数据类型包装的好处
使用包装对象后,功能变的更加强大。
比如:以前使用double来去表示一个人的分数。此时这个人的分数考了0分,可以表示0.0。 如果这个人没有来考试,那就代表这个没有分数。使用包装类型后, 即可表示这两种状态一个0.0 一个 是null。 基本数据类型就办不到。包装类当中给我们提供了很多方法,可以直接过来使用
比如:我们要将一个数据转成二进制。使用包装对象后, 就可以直接调用方法算出来。使用包装对象后, 就可以直接调用方法算出来。
装箱与拆箱
- 把基本数据类型变成包装类 我们称为装箱操作。
Integer num = new Integer(10);
Integer num2 = Integer.valueOf(20);
// Integer.valueOf本质也是new Integer创建,只不过当中多了一个缓存判断
- 把包装类对象转成对应的基本数据类型我们称为拆箱。
Integer num = new Integer(10); // 装箱
int num2 =num.intValue() // 拆箱
Double d = Double.valueOf(10.5) // 装箱
double d1 = d.doubleValue(); // 拆箱
自动装箱与自动拆箱
- 自动装箱:可以直接把一个基本数据类型的值赋值给包装类对象
Integer i = 10
- 自动拆箱:可以只直接把一个包装类对象赋值给基本数据类型的变量
int i1 = i
自动装箱和自动拆箱是Java SE5之后才有的,它内部是如何实现的呢?我们可以借助反编译来找到答案:
public class Main{
public static void main(String[] args) {
Integer i = 10; // 自动装箱
int n = i;// 自动拆箱
}
}
反编译后得到如下结果:
fby.png
由反编译的结果可知:
- java自动装箱过程是调用包装类的valueOf方法实现的
- 而自动拆箱的过程则是调用包装类的xxxValue方法实现的