




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java自动装箱与拆箱及其陷阱分析 定义 大家在平时编写Java程序时,都常常以以下方式来定义一个Integer对象: Integeri=100; 从上面的代码中,大家可以得知,i为一个Integer类型的引用,100为Java中的基础数据类型(primitivedatatype)。而这种直接将一个基础数据类型传给其相应的封装类(wrapperclass)的做法,便是自动装箱(Autoboxing)。 在jdk1.5中,自动装箱首次被引入。而在jdk1.5之前,如果你想要定义一个value为100的Integer对象,则需要这样做: Integeri=newInteger(100); 原理 我们在以上代码“Integeri=100;”处打一个断点,跟踪一下。 接下来,我们可以看到,程序跳转到了Integer类的valueOf(inti)方法中 /* *ReturnsaIntegerinstancerepresentingthespecified *intvalue. *IfanewIntegerinstanceisnotrequired,thismethod *shouldgenerallybeusedinpreferencetotheconstructor *link#Integer(int),asthismethodislikelytoyield *significantlybetterspaceandtimeperformancebycaching *frequentlyrequestedvalues. * *paramianintvalue. *returnaIntegerinstancerepresentingi. *since1.5 */ publicstaticIntegervalueOf(inti) if(i=-128&i=IntegerCache.high) returnIntegerCache.cachei+128; else returnnewInteger(i); 换句话说,装箱就是jdk自己帮你完成了调用Integer.valueOf(100)。 定义 Integerinteger100=100; intint100=integer100; 从上面的代码中,大家可看出integer100为一个Integer类型的引用,int100为一个int类型的原始数据类型。但是,我们可以将一个Integer类型的对象赋值给其相应原始数据类型的变量。这便是拆箱。 拆箱与装箱是相反的操作。装箱是将一个原始数据类型赋值给相应封装类的变量。而拆箱则是将一个封装类的变量赋值给相应原始数据类型的变量。装箱、拆箱的名字也取得相当贴切。 原理 笔者相信大家也都猜到了,拆箱过程中jdk为我们做了什么。我们还是通过实验来证明我们的猜想吧。 在以上代码的第二行代码打上断点,即在“intint100=integer100;”上打上断点,跟踪一下。 我们可以看到,程序跳转到了Integer的intValue()方法。 /* *ReturnsthevalueofthisIntegerasan *int. */ publicintintValue() returnvalue; 也就是,jdk帮我们完成了对intValue()方法的调用。对于以上的实验而言,便是调用integer100的intValue()方法,将其返回值赋给了int100。 实验1 Integerinteger400=400; intint400=400; System.out.println(integer400=int400); 在以上代码的第三行中,integer400与int400执行了=运行。而这两个是不同类型的变量,到底是integer400拆箱了,还是int400装箱了呢?运行结果是什么呢? =运算是判断两个对象的地址是否相等或者判断两个基础数据类型的值是否相等。所以,大家很容易推测到,如果integer400拆箱了,则说明对比的是两个基础类型的值,那此时必然相等,运行结果为true;如果int400装箱了,则说明对比的是两个对象的地址是否相等,那此时地址必然不相等,运行结果为false。(至于为什么笔者对它们赋值为400,就是后面将要讲到的陷阱有关)。 我们实际的运行结果为true。所以是integer400拆箱了。对代码跟踪的结果也证明这一点。 实验2 Integerinteger100=100; intint100=100; System.out.println(integer100.equals(int100); 在以上代码的第三行中,integer100的方法equals的参数为int100。我们知道equals方法的参数为Object,而不是基础数据类型,因而在这里必然是int100装箱了。对代码跟踪的结果也证明了这一点。 其实,如果一个方法中参数类型为原始数据类型,所传入的参数类型为其封装类,则会自动对其进行拆箱;相应地,如果一个方法中参数类型为封装类型,所传入的参数类型为其原始数据类型,则会自动对其进行装箱。 实验3 Integerinteger100=100; intint100=100; Longlong200=200l; System.out.println(integer100+int100); System.out.println(long200=(integer100+int100); System.out.println(long200.equals(integer100+int100); 在第一个实验中,我们已经得知,当一个基础数据类型与封装类进行=运算时,会将封装类进行拆箱。那如果+、-、*、/呢?我们在这个实验中,就可知道。 如果+运算,会将基础数据类型装箱,那么: ?第4行中,integer100+int100就会得到一个类型为Integer且value为200的对象o,并执行这个对象的toString()方法,并输出”200”; ?第5行中,integer100+int100就会得到一个类型为Integer且value为200的对象o,=运算将这个对象与long200对象进行对比,显然,将会输出false; ?第6行中,integer100+int100就会得到一个类型为Integer且value为200的对象o,Long的equals方法将long200与o对比,因为两都是不同类型的封装类,因而输出false; 如果+运算,会将封装类进行拆箱,那么: ?第4行中,integer100+int100就会得到一个类型为int且value为200的基础数据类型b,再将b进行装箱得到o,执行这个对象的toString()方法,并输出”200”; ?第5行中,integer100+int100就会得到一个类型为int且value为200的基础数据类型b1,=运算将long200进行拆箱得到b2,显然b1=b2,输出true; ?第6行中,integer100+int100就会得到一个
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 培训总结军训授课
- 华润集团资深员工进阶培训体系
- 公文写作述职报告
- 临床常见技术操作
- 老师防震防灾培训
- 团支书工作培训
- 中专医学数学考试题及答案
- 2025年烧伤病人的急救护理专项测试题附答案
- 2025年电力系统运行维护员专业技能考核试题及答案解析
- 2025年急救考试题库及答案
- 公安计算机试题及答案
- 保安服务台账资料相关表格
- 《肠道菌群》课件
- 2025年一建《机电工程管理与实务》施工组织设计施工进度题库
- 液压机管理制度
- 2025版校园食堂日管控、周排查、月调度记录表
- 大型活动标准化执行手册
- 康养中心项目可行性研究报告
- 《城乡规划管理与法规系列讲座课件-建设项目规划与审批》
- 工业废水处理工初级复习题+答案
- 监狱防病知识培训课件
评论
0/150
提交评论