Java程序低手之Autoboxing和unboxing

本文详细解释了Java中的自动装箱和拆箱概念,包括基本类型与包装类之间的转换过程。通过示例展示了手动与自动装箱拆箱的区别,并讨论了在方法重载中的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

autoboxing和unboxing又名拆箱和装箱,简单一点讲,就是从primitive转换到wrapper class,例如int类型到integer类型就是装箱,而integer类型到int类型则是拆箱。当然,这里的装箱和拆箱都是auto的,是jvm在工作的内容,事实上不用我们手写,然而也有手写的对应方式,如下所示:

1 int i=10;

2 integer a=new integer(i);//装箱的操作

3 int j=a.intvalue();//拆箱的操作

上面是手动的,在java5.0之后已经在jvm中有了自动的装箱和拆箱的转换,如下所示:

1 int i=10;

2 integer b=i;//自动的装箱

3 int k=b;//自动的拆箱

装箱和拆箱就是这么简单,下面可以看一下自增是怎么一个过程,这是一个很有意思的事情,递减也是一样。

1 integer d=new integer(10);

2 d++;//这条语句使得d先拆箱,然后进行++操作,而后对结果再装箱

上面的这条语句,使得java保证了wrapper class也可以是正常使用通用的操作符,但这绝对不是c++中的运算符重载。你还可以试着分析三元表达式和条件表达式中的装箱拆箱过程。

这里需要注意的一点就是装箱和拆箱在method overload时候的问题,例如下面:

1 public void dosomething(double num);

2 public void dosomething(integer num);

在一个类中有这么两个函数,那么对于整数int k,如果进行dosomething(k)的调用,会调用哪个呢?

在java1.4中,显然是调用double类型的函数,然而,现在有了自动的拆箱和装箱之后会调用哪个呢?还double类型的函数,这样就保证了以前的代码在现在的版本中也可以正确的运行。

注意,java5中,method的解析是三个pass的过程:

a.编译器会试着不用任何的boxing和unboxing,或者启用vararg来定位正确的method。这会找到根据java1.4的规则而会调用的任何method。

b.如果第一个pass失败了,编译器会再度尝试解析method,但这次会允许boxing和unboxing转换。具有vararg的method不在这次pass的考虑中。

c.如果第二个pass也失败了,编译器会做最后一次的尝试,允许boxing和unboxing,且同时也考虑到vararg method。


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值