- 浏览: 206864 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (139)
- java (37)
- web (14)
- database (9)
- compute Net (1)
- design patten (4)
- 生活 (14)
- 求职 (5)
- j2me (1)
- 娱乐 (0)
- 漫画 (0)
- struts (5)
- hibernate (1)
- spring (2)
- ajax (3)
- oracle (3)
- UML&面向对象 (3)
- ffmpeg (2)
- eclipse (8)
- 技巧 (11)
- jsp (2)
- javascript (7)
- flex (2)
- xx (0)
- xxx (0)
- android (0)
- webservice (1)
- 博客 (1)
- jQuery (1)
- split (1)
- iss rewrite (1)
- 踩顶功能ajax (1)
- ext (2)
最新评论
-
longfu2012:
学习了
方法参数前加final的作用 -
irisAndKevin:
你的方法对整除有问题!
java 两数相除 四舍五入 精确 保留2位小数点、任意位小数点 -
wpf523:
...
方法参数前加final的作用 -
wpf523:
不错,解决了我的疑惑
方法参数前加final的作用 -
zhq426:
嗯,挺好用的吧
JAVASCRIPT 取得当前时间,包括农历时间 时间格式:2011年11月8日 16:54 星期二 农历辛卯年(兔) 十月十三 申时
[size=large]Java JDK :小心使用 boxing
发布时间:2008-04-10 16:41:32 来源: 作者: 浏览:25
——此文章摘自《Java JDK6学习笔记》定价:¥59.90 特价:¥44.92 购买>>
自动装箱与拆箱的功能事实上是编译器来帮您的忙,编译器在编译时期依您所编写的语法,决定是否进行装箱或拆箱动作。例如:
相当于编译器自动为您作以下的语法编译:
所以自动装箱与拆箱的功能是所谓的“编译器蜜糖”(Compiler Sugar),虽然使用这个功能很方便,但在程序运行阶段您得了解Java的语义。例如下面的程序是可以通过编译的:
这样的语法在编译时期是合法的,但是在运行时期会有错误,因为这种写法相当于:
null表示i没有参考至任何的对象实体,它可以合法地指定给对象参考名称。由于实际上i并没有参考至任何的对象,所以也就不可能操作intValue()方法,这样上面的写法在运行时会出现NullPointerException错误。
自动装箱、拆箱的功能提供了方便性,但隐藏了一些细节,所以必须小心。再来看范例4.6,您认为结果是什么呢?
范例4.6 AutoBoxDemo2.java
从自动装箱与拆箱的机制来看,可能会觉得结果是显示i1 == i2,您是对的。那么范例4.7的这个程序,您觉得结果是什么?
范例4.7 AutoBoxDemo3.java
结果是显示i1 != i2,这有些令人惊讶,两个范例语法完全一样,只不过改个数值而已,结果却相反。
其实这与==运算符的比较有关,在第3章中介绍过==是用来比较两个基本数据类型的变量值是否相等,事实上==也用于判断两个对象引用名称是否参考至同一个对象。
在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,所以范例4.6中使用==进行比较时,i1 与 i2实际上参考至同一个对象。如果超过了从–128到127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个 Integer对象,所以范例4.7使用==进行比较时,i1与i2参考的是不同的对象。
所以不要过分依赖自动装箱与拆箱,您还是必须知道基本数据类型与对象的差异。范例4.7最好还是依正规的方式来写,而不是依赖编译器蜜糖(Compiler Sugar)。例如范例4.7必须改写为范例4.8才是正确的。
范例4.8 AutoBoxDemo4.java
结果这次是显示i1 == i2。使用这样的写法,相信也会比较放心一些,对于这些方便但隐藏细节的功能到底要不要用呢?基本上只有一个原则:如果您不确定就不要用。
建议新手不要使用自动装箱、拆箱的语法,在这里说明这个功能是为了要完整性介绍Java SE 6的特性,新手入门的话,最好在对对象有较深入了解之后,再来使用这个功能。[color=darkred][/color][/size]
发布时间:2008-04-10 16:41:32 来源: 作者: 浏览:25
——此文章摘自《Java JDK6学习笔记》定价:¥59.90 特价:¥44.92 购买>>
自动装箱与拆箱的功能事实上是编译器来帮您的忙,编译器在编译时期依您所编写的语法,决定是否进行装箱或拆箱动作。例如:
Integer i = 100;
相当于编译器自动为您作以下的语法编译:
Integer i = new Integer(100);
所以自动装箱与拆箱的功能是所谓的“编译器蜜糖”(Compiler Sugar),虽然使用这个功能很方便,但在程序运行阶段您得了解Java的语义。例如下面的程序是可以通过编译的:
Integer i = null; int j = i;
这样的语法在编译时期是合法的,但是在运行时期会有错误,因为这种写法相当于:
Integer i = null; int j = i.intValue();
null表示i没有参考至任何的对象实体,它可以合法地指定给对象参考名称。由于实际上i并没有参考至任何的对象,所以也就不可能操作intValue()方法,这样上面的写法在运行时会出现NullPointerException错误。
自动装箱、拆箱的功能提供了方便性,但隐藏了一些细节,所以必须小心。再来看范例4.6,您认为结果是什么呢?
范例4.6 AutoBoxDemo2.java
public class AutoBoxDemo2 { public static void main(String[] args) { Integer i1 = 100; Integer i2 = 100; if (i1 == i2) System.out.println("i1 == i2"); else System.out.println("i1 != i2"); } }
从自动装箱与拆箱的机制来看,可能会觉得结果是显示i1 == i2,您是对的。那么范例4.7的这个程序,您觉得结果是什么?
范例4.7 AutoBoxDemo3.java
public class AutoBoxDemo3 { public static void main(String[] args) { Integer i1 = 200; Integer i2 = 200; if (i1 == i2) System.out.println("i1 == i2"); else System.out.println("i1 != i2"); } }
结果是显示i1 != i2,这有些令人惊讶,两个范例语法完全一样,只不过改个数值而已,结果却相反。
其实这与==运算符的比较有关,在第3章中介绍过==是用来比较两个基本数据类型的变量值是否相等,事实上==也用于判断两个对象引用名称是否参考至同一个对象。
在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,所以范例4.6中使用==进行比较时,i1 与 i2实际上参考至同一个对象。如果超过了从–128到127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个 Integer对象,所以范例4.7使用==进行比较时,i1与i2参考的是不同的对象。
所以不要过分依赖自动装箱与拆箱,您还是必须知道基本数据类型与对象的差异。范例4.7最好还是依正规的方式来写,而不是依赖编译器蜜糖(Compiler Sugar)。例如范例4.7必须改写为范例4.8才是正确的。
范例4.8 AutoBoxDemo4.java
public class AutoBoxDemo4 { public static void main(String[] args) { Integer i1 = 200; Integer i2 = 200; if (i1.equals(i2)) System.out.println("i1 == i2"); else System.out.println("i1 != i2"); } }
结果这次是显示i1 == i2。使用这样的写法,相信也会比较放心一些,对于这些方便但隐藏细节的功能到底要不要用呢?基本上只有一个原则:如果您不确定就不要用。
建议新手不要使用自动装箱、拆箱的语法,在这里说明这个功能是为了要完整性介绍Java SE 6的特性,新手入门的话,最好在对对象有较深入了解之后,再来使用这个功能。[color=darkred][/color][/size]
发表评论
-
java 两数相除 四舍五入 精确 保留2位小数点、任意位小数点
2011-11-03 17:53 7111java 四舍五入 精确 保留2位小数点、任意位小数点 ... -
Java中对字符串进行加密和解密
2011-08-18 17:14 17111.引言在实际工作中我们常常会遇到对数据进行加密解密的工作(如 ... -
两个日期之间的天数差
2011-08-11 11:02 1592/** * 两个日期之间的天数差 * @pa ... -
java split 特殊字符 分隔数组
2011-07-28 14:48 2114public class Test { /** ... -
JAVA 取得IP地址
2011-07-21 10:32 1001/** * 取得IP地址 * @param ... -
杯具博客设计
2011-07-08 22:41 841又是遇到了一个悲催的问题。 博客: 博客的设计是这样的: ... -
webservice 同步问题
2011-07-08 22:26 1032今天遇到了一个很郁闷个问题,webservice 同步问题。 ... -
二级栏目树构建
2011-05-30 15:15 776输出栏目树 public class Entr ... -
ttt
2009-10-10 12:50 739<script type="text/ ... -
JXL, POI操作excel文件zz
2009-09-27 11:59 16172008-11-10 JXL, POI操作excel文件z ... -
jxl 写 excel
2009-09-27 11:57 1007package net.blogjava.chenlb;imp ... -
方法参数前加final的作用
2009-07-17 11:01 2491方法参数前加final的作用 2009-06-28 ... -
java 调用ffmpeg执行dos bat命令 带有两个参数
2009-03-12 16:58 3411import java.io.IOException; pu ... -
java 调用ffmpeg执行dos命令
2009-03-12 16:10 1952import java.io.File; import ja ... -
增强Eclipse(MyEclipse)输入代码提示功能
2009-03-02 16:16 1608增强Eclipse(MyEclipse)输入代码提示功能 ... -
myeclipse性能提升技巧
2009-03-02 16:07 909myeclipse性能提升技巧 200 ... -
Java JDK:自动装箱和拆箱
2008-12-05 18:06 822[size=large]Java JDK:自动 ... -
JDK5.0新特性介绍
2008-11-16 19:13 746JDK5.0新特性介绍 [转贴 2006-02-23 15: ... -
java面向对象我基本特征
2008-11-04 15:13 754继承:子类继承父类成为特殊的父类。直接获得父类的属性和方法。是 ... -
两种Java容器类List和Set分析
2008-10-26 21:57 667容器类可以大大提高编程效率和编程能力,在Java2中,所有的容 ...
相关推荐
java8的tools包,在maven出现无法加载时可以将该包加入maven本地仓库即可解决问题
java jdk1.8java jdk1.8java jdk1.8java jdk1.8java jdk1.8java jdk1.8java jdk1.8java jdk1.8java jdk1.8java jdk1.8java jdk1.8java jdk1.8java jdk1.8java jdk1.8java jdk1.8java jdk1.8java jdk1.8java jdk1.8...
开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9
医院急诊系统,开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9
开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9
Java:jdk1.8
开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9
以上所述是小编给大家介绍的解决-BASH: /HOME/JAVA/JDK1.8.0_221/BIN/JAVA: 权限不够问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对软件开发网网站的支持! ...
javaJDK8javaJDK8
开发语言:Java 框架:ssm 技术:JSP JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9 服务器:tomcat7 数据库...
开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9
jdk1.6方便别人使用不用从官网上查找,主要用于java开发.JDK Java Development Kit是SunMicrosystems针对Java开发员的产品。自从Java推出以来,JDK已经成为使用最广泛的JavaSDK,本站提供java jdk1.6官方版下载。JDK...
JDK1.8 API 中文谷歌翻译版 java帮助文档 JDK API java 帮助文档 谷歌翻译 JDK1.8 API 中文 谷歌翻译版 java帮助文档 Java最新帮助文档 本帮助文档是使用谷歌翻译,非人工翻译。准确性不能保证,请与英文版配合使用 ...
java jdk1.8 中文版,更具官方翻译,机不可失失不再来。 整合了之前的所有版本,范围比较广。
精通JavaJDK、数据库系统开发Web开发程序源文件
Java JDK 7学习笔记 PDF
java JDK 源码java JDK 源码java JDK 源码java JDK 源码java JDK 源码java JDK 源码java JDK 源码
Java JDK11
Java JDK 实例开发宝典。 Java JDK instance development bible
如何设置Java 2(JDK1.2)的环境变量? 答: Java 2安装后,需要设置PATH和JAVA_HOME环境变量.与JDK1.1不同的是:设置好JAVA_HOME环境变量后,JVM将自动搜索系统类库以及用户的当前路径. Java 2环境变量的设置如下例所示: ...