`

JavaJDK:自动装箱和拆箱总结

阅读更多

java中自动打包+解包机制(又称自动装箱,拆箱)Auto-Boxing,UnBoxing

装箱应该理解为封装对象,即把基础数据类型(如 int)转换成基础类型封装类的对象(如 new Integer()
拆箱就是装箱的反过程,即把基础类型封装类的对象(如 new Integer())转换为基础数据类型(如 int)。

自动装箱与拆箱的功能事实上是编译器来帮您的忙,编译器在编译时期依您所编写的语法,决定是否进行装箱或拆箱动作。例如:
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");
elseSystem.out.println("i1 != i2");
}
}
结果是显示i1 != i2,这有些令人惊讶,两个范例语法完全一样,只不过改个数值而已,结果却相反。
其实这与==运算符的比较有关,在第3章中介绍过==是用来比较两个基本数据类型的变量值是否相等,事实上==也用于判断两个对象引用名称是否参考至同一个对象。
在自动装箱时对于值从–128127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,所以范例4.6中使用==进行比较时,i1 i2实际上参考至同一个对象。如果超过了从–128127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个 Integer对象,所以范例4.7使用==进行比较时,i1i2参考的是不同的对象。
所以不要过分依赖自动装箱与拆箱,您还是必须知道基本数据类型与对象的差异。范例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自动装箱与拆箱及其陷阱

    Java中的自动装箱和拆箱是自JDK 1.5版本引入的一种语言特性,它极大地简化了基础数据类型(如int)与它们对应的包装类(如Integer)之间的转换过程。这一特性使得开发者无需手动创建包装类实例或使用显式类型转换,...

    java jdk 5学习笔记

    JDK 5引入了自动装箱和拆箱的概念,使得基础类型与对应的包装类之间可以无缝转换。例如,int与Integer,无需手动调用`Integer.valueOf()`或`.intValue()`。 2. **枚举类型(Enum)**: 在JDK 5之前,Java没有内置的...

    java jdk 1.5 API html

    在Java 1.5之前,需要手动进行装箱和拆箱,而1.5之后,系统会自动进行这些转换,提高了代码的简洁性。 5. **变量args(Varargs)** 在方法声明中,可以使用`...`操作符创建可变参数列表,使得方法能够接受任意数量...

    Java JDK 5.0学习笔记

    3. **自动装箱与拆箱(Autoboxing/Unboxing)**:Java 5.0引入了自动装箱和拆箱机制,使得基础数据类型和对应的包装类之间可以无缝转换。例如,一个整数可以直接赋值给Integer对象,反之亦然,这简化了代码并减少了...

    JavaJDK6学习笔记(林信良著)

    - **自动装箱/拆箱**:JDK6引入了自动装箱和拆箱功能,使得基本类型和其包装类之间的转换更加便捷。 - **可变参数**:允许一个方法接受不定数量的参数,增强了方法的灵活性。 - **增强的for循环(foreach)**:...

    《Java JDK 6 学习笔记》配书示例

    1. **自动装箱与拆箱**:Java 6中引入了自动装箱和拆箱功能,使得基本类型和其对应的包装类之间可以无缝转换,提高了代码的简洁性。 2. **增强的for循环(foreach)**:也称为迭代器简化,允许开发者以更简洁的方式...

    良葛格Java JDK 5.0学习笔记.rar

    2. **自动装箱/拆箱**:在JDK 5.0中,Java引入了自动装箱和拆箱功能,使得基本类型与对应的包装类之间可以无缝转换,提高了代码的可读性和简洁性。 3. **枚举类型**:枚举是Java中一种新的数据类型,用于定义一组...

    良葛格Java JDK 5[1].0学习笔记

    3. **自动装箱/拆箱**:Java 5.0实现了基本类型与对应的包装器类之间的自动转换,即自动装箱和拆箱。这简化了使用包装器类时的代码,消除了手动转换的必要。 4. **增强的for循环(foreach)**:也称为迭代器简化,...

    java jdk1.5

    JDK 1.5引入了自动装箱和拆箱机制,使得基本数据类型(如int)与对应的包装类(如Integer)可以无缝转换。这为开发带来了便利,避免了手动装箱和拆箱可能导致的NullPointerException。 三、枚举(Enums) Java 1.5...

    JAVA JDK6学习笔记

    - **自动装箱与拆箱**:简化了基本类型与包装类之间的转换。 - **注解(Annotation)**:用于元数据,提供编译器和运行时有关代码的附加信息。 3. **PPT简体版** 这部分资源很可能是对以上概念的可视化展示,...

    java JDK帮助文档中文版

    例如,JDK 6引入了自动装箱拆箱、foreach循环、可变参数等。掌握这些新特性有助于写出更简洁、高效的代码。 4. **开发工具**:JDK附带了一系列开发工具,如`javac`编译器、`javadoc`文档生成器、`jdb`调试器、`jar`...

    Javajdk5学习笔记

    1. **自动装箱与拆箱**:JDK 5引入了自动装箱和拆箱功能,使得基本类型和它们对应的包装类之间可以无缝转换,提高了代码的简洁性。例如,`Integer i = 10;` 和 `int j = i;` 这样的操作在JDK 5后变得非常自然。 2. ...

    JAVA JDK 5.0学习笔记

    在JDK 5.0中,原始类型(如int)与其对应的包装类(如Integer)之间实现了自动装箱和拆箱。这意味着你可以直接将一个int赋值给Integer对象,反之亦然,大大简化了代码。 ### 3. 枚举(Enums) JAVA JDK 5.0引入了...

    良葛格Java JDK 5.0学习笔记ch05

    自动装箱和拆箱是Java 5.0为了简化编程而引入的特性。它使得基本类型(如int)与对应的包装类(如Integer)之间可以自动转换。这意味着开发者不再需要手动调用如Integer.valueOf()或intValue()这样的方法。 四、可...

    Professional.Java.JDK.6.Edition

    1. **自动装箱与拆箱**:JDK 6引入了自动装箱和拆箱功能,使得基本类型与对应的包装类之间可以无缝转换,提高了代码的简洁性和可读性。 2. **枚举类型的switch语句**:Java 6扩展了switch语句,允许使用枚举类型...

    JAVA JDK实例宝典

    11. **J2SE 5.0新特性**: 包括泛型、枚举、自动装箱拆箱、变长参数、注解等,这些都是Java 5引入的重要改进。 12. **Java XML**: 解析XML文档、创建XML DOM树、SAX和StAX解析器等,使Java与XML数据的处理变得简单。...

    良葛格Java JDK 5.0学习笔记

    1. 自动装箱与拆箱:Java 5.0引入了自动装箱和拆箱机制,使得基本类型和它们对应的包装类之间可以无缝转换。例如,`Integer i = 10;` 和 `int j = i;` 在编译时会自动进行装箱和拆箱操作,简化了编程。 2. 枚举...

    java jdk 1.5 windows

    3. **自动装箱与拆箱(Autoboxing and Unboxing)**:自动装箱是指将基本数据类型与对应的包装器类之间进行隐式转换,反之为拆箱。这一特性简化了基本类型与对象之间的操作。 4. **变量赋值检查(Enhanced For Loop...

Global site tag (gtag.js) - Google Analytics