`

JDK1.5具有的自动装箱与拆箱新特性

 
阅读更多
在JAVA JDK1.5以后具有的自动装箱与拆箱的功能,所谓的自动装箱
与拆箱也就是把基本的数据类型自动的转为封装类型。

赋值的过程就是把 “=”后边的赋给前边的
可以给integer类型的变量赋值为null;一定不可以给int类型赋值为null!


如:自动装箱,它可以直接把基本类型赋值给封装类型
Integer num = 10 ;
Double d = 2d ;
自动拆箱,它可以把封装类型赋值给基本类型
int num = new Integer(10);
double d = new Double(2d);
自动装箱与拆箱的功能事实上是编译器来帮您的忙,编译器在编译时期依您所编写的语法,决定是否进行装箱或拆箱动作。在自动装箱时对于值从-128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,所以范例4.6中使用==进行比较时,i1 与 i2实际上参考至同一个对象。如果超过了从-128到127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个Integer对象,所以范例4.7使用==进行比较时,i1与i2参考的是不同的对象。所以不要过分依赖自动装箱与拆箱,您还是必须知道基本数据类型与对象的差异。
    public void testBoxingUnboxing() {
        int i = 10;
        Integer inta = i;
        inta++;
        inta += 1;
        int j = inta;

        assertTrue(j == inta);结果是:true //junit里面的方法
        assertTrue(j == new Integer(j)); 结果是:true
        assertTrue(10000 == new Integer(10000)); 结果是:true
    }
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错误。
intValue()这个方法是对象的方法要使用此方法就必须有一个非空对象!
自动装箱、拆箱的功能提供了方便性,但隐藏了一些细节,所以必须小心。再来看范例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。使用这样的写法,相信也会比较放心一些,对于这些方便但隐藏细节的功能到底要不要用呢?基本上只有一个原则:如果您不确定就不要用。
分享到:
评论

相关推荐

    jdk1.5x64位 windows版.zip

    自动装箱与拆箱是另一个重要的特性。在JDK1.5之前,将基本类型和其对应的包装类型之间进行转换需要手动操作。而1.5版本之后,系统会自动处理这种转换,大大简化了代码。 此外,JDK1.5还引入了变量args参数,使得在...

    jdk1.5新特性

    ### JDK 1.5 新特性详解 #### 泛型编程 **定义与作用:** 泛型编程是 Java 1.5 引入的一项重要特性,它允许开发者在编译时进行类型安全检查,从而避免了运行时可能出现的类型转换异常。通过在编译阶段检查类型安全...

    Java-jdk1.5安装包

    JDK1.5,也称为Java 5.0,是一个重要的版本,它引入了许多新的特性和改进,对Java语言的发展产生了深远影响。 一、泛型(Generics) 在Java 5.0中,最重要的特性之一就是泛型的引入。泛型允许开发者在定义类、接口...

    JDK1.5新特性

    1. **自动装箱与拆箱**:在JDK 1.5之前,基本类型与包装类之间的转换需要手动进行。而1.5版本引入了自动装箱(Autoboxing)和拆箱(Unboxing)机制,使得基本类型和其对应的包装类之间可以无缝转换,简化了编程。 2...

    JDK1.5,JDK1.5

    2. **自动装箱与拆箱(Autoboxing and Unboxing)** 自动装箱允许开发者在原始类型与对应的包装类之间无缝切换,无需手动进行转换。例如,`int`与`Integer`之间的转换可以自动完成。 3. **枚举类型(Enums)** ...

    包含 jdk1.5免安装、jdk1.6免安装、jdk1.8(32和64)

    2. **Autoboxing/Unboxing(自动装箱/拆箱)**:简化了基本类型与对应的包装类之间的转换。 3. **枚举(Enums)**:提供了一种新的数据类型,用于创建固定的、不可变的值集合。 4. **Annotations(注解)**:提供了...

    JDK1.5的32位和64位安装包

    其次,自动装箱与拆箱也是JDK1.5引入的新特性。这使得基本数据类型(如int、double)与它们对应的包装类(如Integer、Double)之间可以无缝切换,简化了代码编写。例如,现在可以直接将一个int值赋给Integer变量,...

    jdk1.5.rar

    总的来说,JDK 1.5是一个里程碑式的版本,它的许多新特性如泛型、枚举、注解和自动装箱/拆箱等,极大地提高了Java开发的效率和代码质量,也为后续版本奠定了坚实的基础。如果你习惯了使用JDK 1.7,但对JDK 1.5有特殊...

    JDK1.5 for Mac OS

    3. **自动装箱与拆箱(Autoboxing/Unboxing)**:JDK1.5引入了自动装箱和拆箱功能,使得基本类型和其对应的包装类之间的转换更加便捷,提高了代码的可读性和简洁性。 4. **变量赋值增强(Enhanced For Loop)**:也...

    jdk1.5 for windows(32位).zip

    3. **自动装箱与拆箱(Autoboxing and Unboxing)**:JDK 1.5引入了自动装箱和拆箱机制,使得基本数据类型与对应的包装类之间可以无缝转换,简化了代码。 4. **变量注解(Annotations)**:注解是一种元数据,允许...

    JDK1.5版本免费下载

    3. **自动装箱/拆箱(Autoboxing and Unboxing)**:Java 1.5引入了自动装箱和拆箱机制,使得基本类型和对应的包装类之间可以无缝转换,简化了代码编写。 4. **变量赋值增强(Enhanced for Loop)**:也称为foreach...

    jdk1.5新特性关于动态参数,泛型等

    在 JDK 1.5 中,Java 语言引入了一系列重要的新特性,极大地提升了代码的可读性、安全性以及效率。以下是对这些新特性的详细解析: 1. 泛型(Generics) 泛型是 JDK 1.5 最重要的改进之一,它允许在定义集合类时...

    JAVA开发工具 JDK1.5

    JDK1.5是Oracle公司于2004年发布的一个重要版本,代号为"Tioga",它在Java的历史上具有里程碑式的意义,引入了许多重要的新特性和改进。 ### 1. 泛型(Generics) JDK1.5最重要的特性之一就是泛型的引入。泛型允许...

    linux下JDK1.5

    JDK1.5引入了一些重要的新特性,如: 1. **Generics(泛型)**:允许在类、接口和方法中使用类型参数,增强了类型安全性和代码重用性。 2. **Autoboxing and Unboxing(自动装箱与拆箱)**:自动将基本类型与对应的...

    jdk1.5 tiger java5 新特性

    另外,自动装箱和拆箱功能使得基本类型与对应的包装类之间转换更加方便。例如,int和Integer之间的转换不再需要显式的装箱和拆箱操作。 在类型系统方面,Java 5引入了变量类型推断,体现在匿名内部类和局部变量的...

    JDK1.5中文版

    3. **自动装箱/拆箱(Autoboxing and Unboxing)**:在JDK1.5以前,将基本类型与对应的包装器类型之间进行转换需要手动操作。1.5以后,编译器会自动进行这种转换,极大简化了代码。例如,int和Integer之间的转换可以...

    JDK1.5、JDK5下载

    2. **自动装箱与拆箱(Autoboxing/Unboxing)**:自动装箱允许在基本类型和对应的包装类之间进行无缝转换,简化了代码编写。 3. **枚举类型(Enums)**:枚举是一种新的数据类型,用于定义有限集合的常量,提高了...

    历史版本JDK1.5安装包

    JDK 1.5,也称为Java 5.0,是一个重要的里程碑,因为它引入了许多新的特性和改进,对于Java开发者来说具有深远的影响。 1. 泛型(Generics): JDK 1.5引入了泛型,允许在类、接口和方法中定义类型参数,增强了代码...

    jdk1.5_forLinux.zip

    3. **自动装箱与拆箱**:自动装箱和拆箱功能使得基本数据类型与对应的包装类之间可以无缝转换,简化了代码编写。 4. **可变参数**:可变参数允许方法接收任意数量的同类型参数,如`public void printNumbers(int......

Global site tag (gtag.js) - Google Analytics