包装类型的继承结构图
在java设计之初,java就提供了8种基础的数据类型以及对应的8种包装数据类型。
我们知道java是一种面向对象编程的高级语言,所以包装类型正是为了解决基本数据类型无法面向对象编程所提供的。
包装类的应用场景
1.集合泛型只能是包装类
// 编译报错
List<int> list1 = new ArrayList<>();
// 正常
List<Integer> list2 = new ArrayList<>();
2.成员变量不能有默认值
private int status;
基本数据类型的成员变量都有默认值,如以上代码status的默认值为0,如果代码的定义中0为失败,那样就会有问题。这样就只能使用包装类Integer,他的默认值为null,所以不会有默认值影响
3.方法参数允许定义空值
private static void test1(int status){
System.out.println(status);
}
看以上代码,方法参数定义的本数据类型是int,所以必须得传一个数字过来,不能传null,很多场合我们是希望可以传null的,所以这种场合用包装类比较合适。
自动装箱、拆箱机制
从java5开始增加了自动装箱、拆箱机制,提供基本数据类型和包装类型的相互转换操作。
什么是自动装箱?
自动装箱即自动将基本数据类型转换为包装类型,在java5之前,要将基本数据类型转换成包装类型只能这样做:
Integer i1 = new Integer(8);
Integer i2 = Integer.valueOf(8);
// 自动装箱
Integer i3 = 8;
以上三种都可以进行转换,但在java5之前,第三种是编译失败的,第三种方法也正是现在的自动装箱功能。另外,第一种构造器方法也不推荐使用了,已经标为废弃了。
其实自动装箱的原理就是调用包装类的valueOf方法,如第二个方法中的Itenger.valueOf方法。
什么是自动拆箱?
自动拆箱即自动将包装类型转换为基本数据类型,与自动装箱相反。
// 自动拆箱
int i4 = i3;
int i5 = i3.intValue();
继续上面的例子,把i3赋值给i4就是实现的自动拆箱功能,自动装箱的原理就是调用包装类的xxValue方法,如i5种的Integer的intValue方法。
自动装箱、自动拆箱不只是体现在以上的例子,在方法接受参数、对象设置参数时都能自动装箱拆箱。
需要注意的是,关于Interger,-128~127会有缓存,对比这个范围的值的对象是一个坑,这个在阿里巴巴规范中也有提及。