如何理解Java中的自动拆箱和自动装箱?

小伟刚毕业时面的第一家公司就被面试官给问住了...

如何理解Java中的自动拆箱和自动装箱?

自动拆箱?自动装箱?什么鬼,听都没听过啊,这...这..知识盲区...

回到家后小伟赶紧查资料,我透,这不就是问基本类型跟封装类型吗,面试官整啥名词呢...

别问结果,问就是没过。

1、 什么是自动装箱,自动拆箱

定义:基本数据类型和包装类之间可以自动地相互转换

理解:装箱就是自动将基本数据类型转换为封装类型,拆箱就是自动将封装类型转换为基本数据类型。

我们知道,Java中提供了四大类基本数据类型,分别是:整数、浮点数、字符型和布尔型,其中:

整数包含:byte、int、short、long

浮点数包含:float、double

字符类型:char

布尔类型:boolean

基本数据类型相信大家一定很熟悉了吧,来来来,说说他们的取值范围~

数据类型 取值范围
byte   -128 ~ 127  
short   -32786 ~ 32767  
int   -4294967296 ~ 4294967295  
long   -2^64^ ~ 2^64^ -1  
float   3.4e-038 ~ 3.4e+038  
double   1.7e-308 ~ 1.7e+308  
char   \u0000 ~ \uffff  
boolean   true 、false  

日常开发中,靠这些基本数据类型几乎能够满足我们的需求,但是基本类型终究不是对象,往重了说不满足面向对象的开发思想,往轻了说就是使用不方便。怎么讲?例如做一些数据类型转换,获取int数据类型的取值范围等等。

我们知道,类的优点在于它可以定义成员变量、成员方法,提供丰富便利的功能,因此Java在JDK1.0的时候就设计了基本数据类型的包装类,而在JDK1.5中引入了新特性:自动装箱和拆箱。

我们来看一下基本类型跟封装类型之间的对应关系:

数据类型 封装类
byte   Byte  
short   Short  
int   Integer  
long   Long  
float   Float  
double   Double  
char   Character  
boolean   Boolean  
2、 使用包装类型后的便捷

我们以上边提到的数据类型转换为例,看看使用包装类型后的便捷性。

小伟在数据库中存放商品库存用的是 varchar 类型来存储的,所以在代码中的实体与之对应的是 String,那么问题来了,既然是库存,那么势必就要用到加减乘除之类的运算,所以就需要先转换成 数值类型(int\long\float等)来运算,我们看一下通过包装类是如何快速转换的「int\long\float」:

public class Test { public static void main(String[] args) { // 数据库中的商品数量 number String number = "666"; // 借助封装了 Integer 转换为 int int intVal = Integer.valueOf(number); // 借助封装了 Float 转换为 float float floatVal = Float.valueOf(number); // 借助封装了 Long 转换为 long long longVal = Long.valueOf(number); // 依次输出三个值的内容 System.out.println("int="+intVal); System.out.println("floatVal="+floatVal); System.out.println("longVal="+longVal); } } 3、 落实自动装箱、拆箱

看完了包装类型的便捷性后,我们再来落实到自动装箱、自动拆箱上...

怎么就自动装箱,自动拆箱了呢?

上一段代码,看看哪是自动装箱跟自动拆箱:

// 自动装箱 1. Integer a = 100; // 自动拆箱 2. int b = a;

自动装箱,相当于Java编译器替我们执行了 Integer.valueOf(XXX);

自动拆箱,相当于Java编译器替我们执行了Integer.intValue(XXX);

我们证实一下,首先通过 javac 编译得到 class 文件,接着反编译看看:

指令为:javap -c class文件名,得到下图所示:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zydfdd.html