黑马程序员_Java基础:JDK1.5后的新特性:自动拆装箱,以及注意事项
------- android培训、java培训、期待与您交流! ----------
首先来看一段代码:
Integer x = new Integer(4);
Integer y = 4;
在JDK1.5版本后,以上两行代码都能编译通过,那是因为JDK1.5后加入新特性,自动装箱。
第一句代码是正常的创建对象方法,创建了一个Integer包装类对象。
而第二句中,当左边的Interger类型变量指向右边的int基本类型数据时,右边的基本数据类型会自动装箱成Integer对象,即隐式执行了new Integer(4)。
再来一段代码:
Integer x = new Integer(4);
x = x + 2;
这两句同样可以编译通过,这同样是因为JDK1.5后加入了自动拆箱的特性。
在第二句中,右边的Integer对象与int基本数据类型数据进行加法运算时,Integer对象会自动拆箱,隐式执行了x.intValue(),将Integer对象转换成int基本数据类型数据,然后x.intValue()+2得出和,最后把和自动装箱成Integer对象,new Integer(x.intValue()+2)。这样左边的Integer类型变量x就成功指向了一个新的Integer对象。
从以上例子可以看出,自动拆装箱的新特性可以简化代码,让我们编写程序的时候更加方便。
但是使用中也有要注意的地方,看下面代码:
Integer a = new Integer(100);
Integer b = new Integer(100);
System.out.println("a==b:"+(a==b)); //结果为false。 Integer c = 100;
Integer d = 100;
System.out.println("c==d:"+(c==d)); //结果为true。 Integer m = 200;
Integer n = 200;
System.out.println("m==n:"+(m==n)); //结果为false。
从这段代码可以看出,在自动拆装箱的过程中,int基本数据类型的大小,会影响到Integer变量最终是否指向的同一个对象,这是为什么?
这段代码三个比较有以下的区别:
1,如果按照正常方式,创建对象(new)来建立变量的引用,因为不同的变量指向的对象也不同,不同变量之间比较当然就为false。
2,如果Integer变量使用自动装箱的形式,对对象建立的引用,而装箱前的int数值大小又正好在byte的范围内(-128~127),那么,如果多个Integer变量指向同一个int值相同的数据装箱成的Integer对象时,java只会在内存创建第一个Integer对象,其他的变量全部都指向了这个对象,所以这些变量比较时,因为它们都指向同一个对象,结果就为true。
3,如果Integer变量使用自动装箱的形式,对对象建立的引用,而装箱前的int数值大小不在byte的范围内(-128~127),那么,即使int的值相同,java也会在内存中对应变量创建多个对象,当多个变量比较时,它们指向的对象不同,所以结果为false。从结果看,这种情况是跟用new来创建对象引用是一样的。
以上例子都是一些应用的小细节,把细节研究透了,java的道路才会更加的平坦。
黑马程序员_Java基础:JDK1.5后的新特性:自动拆装箱,以及注意事项的更多相关文章
- 黑马程序员_JAVA基础知识总结3
------- android培训.java培训.期待与您交流! ---------- Java源文件的扩展名是.java,编译之后生成.class的文件.所有的类都有一个共同的继承祖先Object类 ...
- 黑马程序员_Java基础视频-深入浅出精华版--视频列表
\day01\avi\01.01_计算机基础(计算机概述).avi; \day01\avi\01.02_计算机基础(计算机硬件和软件概述).avi; \day01\avi\01.03_计算机基础(软件 ...
- 课程2:《黑马程序员_Java基础视频-深入浅出精华版》-视频列表-
\day01\avi\01.01_计算机基础(计算机概述).avi; \day01\avi\01.02_计算机基础(计算机硬件和软件概述).avi; \day01\avi\01.03_计算机基础(软件 ...
- 黑马程序员_java基础笔记(10)...JDK1.5的新特性
—————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流! —————————— 1:静态导入.2:for—each循环.3:自动装箱/拆箱.4:可变参数.5:枚举 ...
- 黑马程序员_Java基础:网络编程总结
------- android培训.java培训.期待与您交流! ---------- Java语言是在网络环境下诞生的,它是第一个完全融入网络的语言,虽然不能说它是对支持网络编程做得最好的语言,但是 ...
- 黑马程序员_Java基础:反射机制(Reflection)总结
------- android培训.java培训.期待与您交流! ---------- 反射在java中有非常重大的意义,它是一种动态的相关机制,可以于运行时加载.探知.使用编译期间完全未知的clas ...
- 黑马程序员_Java基础组成
Java语言基础组成 2.1关键字 main不是关键字,但被JVM所识别的名称. 关键字的定义和特点 定义:被Java语言赋予了特殊含义的单词. 特点:关键字中所有字母都为小写. 用于定义数据类型的关 ...
- 黑马程序员_Java基础视频-深入浅出精华版--PPT 文件列表
\day01\code\第一章_Java概述.ppt;\day01\resource\资料\50道编程题(有精力的同学看看).doc;\day01\resource\资料\Sun_Java程序员认证考 ...
- 黑马程序员_java基础笔记(06)...集合
—————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流! —————————— JavaApi(其实就是java给我们提供的已经定义好的对象.工具对象:集合框架) ...
随机推荐
- angularjs(二)模板终常用的指令的使用方法
通过使用模板,我们可以把model和controller中的数据组装起来呈现给浏览器,还可以通过数据绑定,实时更新视图,让我们的页面变成动态的.ng的模板真是让我爱不释手.学习ng道路还很漫长,从模板 ...
- Pi# - Raspberry Pi GPIO Library for .NET
Project Description Pi# (pronounced “Pi Sharp”) is a library to expose the GPIO functionality of the ...
- WizNote for linux installation
源一:没有用处 官网链接http://www.wiznote.com/download-wiznote-for-Linux. 源二:提供了源及安装方法 Fedora 中文社区软件源,具体位置在这里. ...
- Spring+quartz 实现定时任务job集群配置
为什么要有集群定时任务? 因为如果多server都触发相同任务,又同时执行,那在99%的场景都是不适合的.比如银行每晚24:00都要汇总营业额.像下面3台server同时进行汇总,最终计算结果可能是真 ...
- Linux中多线程信号的处理
1. 博文:Linux多线程中使用信号-1 http://blog.csdn.net/qq276592716/article/details/7325250 2. 博文:Linux多线程信号总结 ...
- cinder节点部署
其实看基础理论篇大家也可以看出来,cinder跟nova流程比较像,是这样的,nova为云主机提供了虚拟资源,cinder则是提供存储相关的资源,cinder的小伙伴叫swift,不过这个一般没人用了 ...
- linux中用户、组的管理(密码管理、权限管理及其修改用户、组)(转)
process(进程) 1 计算资源 权限 用户(获取资源或服务的凭证或标识) 用户,容器,关联权限:用户组(标识符),方便地指派权限 2 用户.组.权限 安全上下文(secure context ...
- [原创]AD9212采样方法
随记 最近由于工程原因用到ADC的采样,选用了ADI公司的AD9212芯片,八通道10位ADC.在进行ADC的采样时,看到的想到的几种方法,在这里做个笔记记录一下. AD9212简介 详细说明可以在A ...
- 【译】RabbitMQ:Topics
在前面的教程中,我们对日志系统进行了功能强化.我们使用direct类型的交换器并且为之提供了可以选择接收日志的能力,替换了只能傻乎乎的广播消息的fanout类型的交换器.尽管使用direct类型的交换 ...
- Java-计划存储
Hive:Hive文档 Hdfs官方 Spark官方 About云中文论坛 书单:2015豆瓣书单 豆瓣千人8.0+书单 编程入口:Eclipse servlet java8 快捷键整理 MyBat ...