基本数据类型的封装类及自动装拆箱
1.基本数据类型的封装类
基本数据类型 | 封装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
char | Character |
2.为什么需要封装类
2.1首先我们要知道封装类和基本数据类型有什么区别。
- 定义不同:封装类是对象,基本数据类型不是;
- 初始值不同:封装初始值默认为null,基本数据类型根据类型不同而值不同;
- 存储方式和位置不用。封装类分拆引用和实例,引用存储在栈(stack),具体实例存储在堆(heap),基本数据类型存储在栈中(stack)。
2.2为什么需要封装类
在编码过程中常常会出现只接收对象的情况,比如List中只能存入对象,不能存入基本数据类型;比如一个方法的参数是Object时,不能传入基本数据类型,但可以传入对应的封装类等等。
参考连接
3.自动装箱与拆箱
3.1在了解自动装箱和拆箱之前,我们首先要了解不用自动装拆箱时我们是如何实现基本数据类型和封装类的相互转换的。这里以int和Integer的相互转换为例。
- 基本数据类型转换成封装类。调用封装类的构造器。
//定义一个基本数据类型a
int a = 4;
//把a作为参数new一个Integer.把基本数据类型a转换成封装类
Integer b = new Integer(a);
- 封装类转换成基本数据类型,调用封装类的XXXValue()方法
//定义一个Integer的对象a
Integer a = 4;
//调用intValue()方法将Integer实例a转换为基本数据类型
int b = a.intValue();
3.2前面我们已经了解了基本数据类型和封装类的显示转换。现在让我们一起来了解自动装箱和拆箱的实现原理。同样以int和Integer的相互转换为例。
- 自动装箱
//定义一个基本数据类型a
int a=4;
//自动装箱
Integer b=a;
很多小伙伴可能会有疑问,为什么一个基本数据类型可以直接赋值给它的封装类。那么让我们debug来看看它的执行过程到底是怎样的:
public static Integer valueOf(int i) {
//判断是否在IntegerCache的最小值-128到IntegerCache的最大值
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
//调用构造器,
return new Integer(i);
}
通过debug我们可以发现其实它调用了Integer的valueOf(int i)这个方法。而这个方法调用了Integer的构造器,将基本数据类型转换为了Integer类型。关于方法里的为什么要加个判断这里不讲。想要了解的小伙伴可以点击下方的连接。
参考连接
- 自动拆箱
//定义一个Integer类型a
Integer a=new Integer(4);
//自动拆箱
int b=a;
让我们debug来看看它的执行过程到底是怎样的:
public int intValue() {
return value;
}
通过debug我们可以发现其实它调用了Integer的intValue()这个方法。将Integer类型转换为了基本数据类型。