Java自动装箱/拆箱

转载自:https://zhuanlan.zhihu.com/p/27657548


下面分析一下:


编译一下,拿到class文件,我们反编译一下,变成了如下代码:

这个加上valueOf方法的过程,就是Java中经常说的装箱过程。

我们知道Java中一共有四类八种基本数据类型,除掉这几种类型,其它的都是对象。在JDK1.5中,给这四类八种基本类型加入了包装类,对应如下:

基本类型 包装类型

第一类:整型 byte Byte short Short int Integer long Long

第二类:浮点型 float Float double Double

第三类:逻辑型 boolean Boolean

第四类:字符型 char Character

再看如下代码:


编译后的class文件:

可以看出来,当我们变量声明为对象类型而赋值为基本数据类型时,Java编译器会对我们的基本数据类型进行装箱,而我们的变量声明为基本类型赋值为对象类型时,编译器又会对我们的对象类型进行拆箱处理。似乎大家都商量好了,用valueOf作为装箱方法,拆箱方法就各自表述吧,一般都是基本数据类型加上Value做为拆箱方法,如intValue,longValue,booleanValue,其它包装类型也大同小异,我就不一一测试了,大家自己动手试试吧。

将int的变量转换成Integer对象,这个过程叫做装箱, 反之将Integer对象转换成int类型值,这个过程叫做拆箱。 以上这些装箱拆箱的方法是在编译成class文件时自动加上的,不需要程序员手工介入,因此又叫自动装箱/拆箱。

看到这里,有些朋友会说,呀,好麻烦呀,已经有了基本类型,为什么还要用包装类?

有人说,是为了让Java成为纯面向对象的语言,笑。

我认为,有以下几点:

1、对象是对现实世界的模拟(一切事物皆对象,通过面向对象的方式,将现实世界的事物抽象成对象),在现实中,假设我们去一个系统(数据库)里查询学生李四的年龄,如下图:


这时候,录入员还没给李四录入年龄这一项,如果我们用int来声明年龄,大家都知道int是要初始化的,默认情况下为0,0是什么意思,没出生吗?(当然也可以用-1来表示未录入,但总感觉有点怪怪的),如果用Integer来表示,就没这个问题了,为null,就是未录入。

2、为泛型提供了支持。

3、提供了丰富的属性和API



下面我们分析一下不同的声明方式在内存中的展现,代码如下:


表现如下图:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值