`

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 API 1.6 官方版下载

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

    配置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 7学习笔记 PDF

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

    java jdk 1.7官网免安装版本

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

    java JDK1.8版本下载

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

    Java JDK11_for_Mac

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

    最新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 JDK11版本安装包

    Java Development Kit (JDK) 11 版本简介 Java Development Kit (JDK) 作为Java平台的核心组件之一,是开发人员用来构建、...移除过时元素:为了保持框架的简洁性和现代化,JDK 11移除了部分不推荐使用的API和选项。

    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,带来...

Global site tag (gtag.js) - Google Analytics