`

Java JDK :小心使用 boxing

    博客分类:
  • java
阅读更多
[size=large]Java JDK :小心使用 boxing
发布时间: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]
分享到:
评论

相关推荐

    jdk:tools:1.8

    java8的tools包,在maven出现无法加载时可以将该包加入maven本地仓库即可解决问题

    医院急诊系统,开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7

    医院急诊系统,开发语言: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

    开发语言: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: 权限不够问题

    以上所述是小编给大家介绍的解决-BASH: /HOME/JAVA/JDK1.8.0_221/BIN/JAVA: 权限不够问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对软件开发网网站的支持! ...

    汽车租赁系统.开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysq

    开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9

    二手交易平台-(部署文档+可运行源码)开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomc

    开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9

    java二手交易平台-(部署文档+可运行源码)开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:

    开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9

    奥迪维修保养服务管理系统(源码分享)java开发语言:Java 框架:ssm 技术:JSP JDK版本:JDK1.8 服务器:t

    开发语言:Java 框架:ssm 技术:JSP JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9 服务器:tomcat7 数据库...

    配置java的jdk环境与资源包JDK版本:1.8.0_171

    在开始使用Java进行开发之前,我们需要配置Java Development Kit(JDK),它是Java编程的基础。本指南将详细介绍如何配置JDK版本1.8.0_171。 一、JDK与JRE的区别 JDK(Java Development Kit)是Java开发工具包,...

    Java JDK API 1.6 官方版下载

    jdk1.6方便别人使用不用从官网上查找,主要用于java开发.JDK Java Development Kit是SunMicrosystems针对Java开发员的产品。自从Java推出以来,JDK已经成为使用最广泛的JavaSDK,本站提供java jdk1.6官方版下载。JDK...

    Java JDK 7学习笔记 PDF

    Java JDK 7是Java开发工具包的一个重要版本,它的全称是Java Development Kit,是用于构建和运行Java应用程序的关键组件。这个PDF学习笔记是开发者深入理解JDK 7特性和功能的重要参考资料。以下是对Java JDK 7的一些...

    Java JDK11_for_Mac

    Java JDK11 for Mac 是Java开发工具包的一个版本,专为苹果Mac操作系统设计。JDK,全称为Java Development Kit,是开发和运行Java应用程序必不可少的软件包。它包含了Java编译器、Java运行环境(JRE)、调试器、文档...

    java JDK1.8版本下载

    Java JDK(Java Development Kit)是Java编程语言的软件开发工具包,它包含了编译、调试、运行Java程序所需的所有工具和库。JDK1.8是Oracle公司发布的Java平台标准版(Java SE)的一个重要版本,它在2014年3月18日...

    java jdk 1.7官网免安装版本

    6. **下载与更新**:虽然Java JDK 1.7是旧版本,但有时出于兼容性考虑仍需使用。通常,可以从Oracle官网获取,但由于描述中提到,也可以在CSDN等平台找到免安装版本,方便快速下载。 总之,Java JDK 1.7是一个重要...

    最新Java JDK 11.0.9免安装版(macos-aarch64位)

    6. **免安装版**:免安装版JDK通常是一个自包含的压缩包,解压后即可使用,方便开发者在不修改系统全局环境的情况下快速部署和测试Java环境。 7. **版本更新**:描述中提到,除了JDK 11.0.9,还有其他版本(如JDK 8...

    Windows版本JDK:jdk1.8.0_192_x64.zip

    1. 直接解压,比如解压到:D:\Dev\Java 2. 配置环境变量:我的电脑 ->右键菜单 ->属性 ->高级系统设置 ->环境变量 ->用户变量中Path ->编辑 ->新增:D:\Dev\Java\jdk1.8.0_192\bin

    java jdk 8 帮助文档 中文 文档 chm 谷歌翻译

    JDK1.8 API 中文谷歌翻译版 java帮助文档 JDK API java 帮助文档 谷歌翻译 JDK1.8 API 中文 谷歌翻译版 java帮助文档 Java最新帮助文档 本帮助文档是使用谷歌翻译,非人工翻译。准确性不能保证,请与英文版配合使用 ...

    java jdk 8.0安装包

    Java JDK 8.0是Java开发工具包的一个重要版本,它是Java...理解并掌握以上知识点,将有助于你在使用Java JDK 8.0时更加得心应手。如果你在安装或使用过程中遇到任何问题,可以参考相关的技术博客或者官方文档寻求帮助。

    java jdk 64位window

    无论你是新手还是经验丰富的开发者,理解JDK的工作原理和如何使用它是Java编程的基础。对于企业级应用,JDK还支持服务器端的Java应用程序,如Java EE应用服务器。 随着技术的发展,Oracle不断推出新版本的JDK,带来...

    java JDK-17 64位包

    Java JDK(Java Development Kit)是Java编程语言的软件开发工具包,它包含了编译、调试、性能优化等所需的各种工具和库。JDK 17是Oracle公司发布的Java SE(Standard Edition)的一个版本,适用于64位操作系统。这...

Global site tag (gtag.js) - Google Analytics