黑马程序员_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给我们提供的已经定义好的对象.工具对象:集合框架) ...
随机推荐
- Cannot find or open the PDB file问题的解决
'testcv.exe' (Win32): Loaded 'D:\Documents\Visual Studio 2013\Projects\testcv\x64\Debug\testcv.exe'. ...
- C# 解析JSON格式数据
JSON简介 JSON(全称为JavaScript ObjectNotation) 是一种轻量级的数据交换格式.它是基于JavaScript语法标准的一个子集.JSON采用完全独立于语言的文本格式,可 ...
- Weblogic常见故障常:JDBC Connection Pools(转)
WebLogic Server中数据库连接池是一个经常出问题的地方,总结一下出问题的原因和解决办法. 一.数据库连接泄漏 此类问题一般都是由于开发人员没有正确关闭数据库连接造成的.比如使用完Conne ...
- SpringRMI远程方法调用
Spring为各种远程访问技术的集成提供了工具类. 该小段引用自 http://www.open-open.com/lib/view/open1408957290478.html Spring远程支持 ...
- Tomcat中间件URL中文字符传递问题
1. 问题描述: tomcat中如果URL中需要传递中文参数,需要配置tomcat的service.xml中文传递的编码方式,否则中文传递将出现乱码,导致程序异常. 2. 解决方式: 修改tomcat ...
- (转载)python2+selenium自动化测试系列(一)
1.Selenium2+python自动化1-环境搭建 2.Selenium2+python自动化2-pip降级selenium3.0 3.Selenium2+python自动化3-解决pip使用异常 ...
- MyElipes遇到 source not found解决方案(查看.class文件源码一劳永逸的解决方法)
在用Myeclipse 或者是eclipse进行开发时候经常遇到这个问题. File class editor source not found 问题.原因很简单,就是因为这是一个源码包,相应的没有编 ...
- asp.net 页面如何将Eval中的时间显示为“yyyy-MM-dd ” 格式
<table> <tr> <td style="width:273px;color:#105db5;" valign="top&quo ...
- [goa]golang微服务框架学习(二)-- 代码自动生成
之前用过go语言的反射来做一些代码生成,参考这篇. 但是这种方式,入侵太强,需要执行对应的申明调用, 所以对GOA框架的自动生成非常感兴趣,于是仔细研究了一下,发现用的比较巧妙, 这里先卖个关子,先看 ...
- with try catch 作用域的问题
with({}){}和try{}catch(e){}会临时改变代码执行的作用域, var foo="abc"; with({foo:"d"}){ functio ...