`
it_dengdong
  • 浏览: 1667 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
最近访客 更多访客>>
社区版块
存档分类
最新评论

[转载]JDK1.5具有的自动装箱与拆箱新特性

    博客分类:
  • JAVA
阅读更多

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 windows(32位).zip

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

    jdk1.5、1.6压缩包

    3. **自动装箱与拆箱**:自动装箱和拆箱使得基本数据类型与对应的包装类之间可以无缝切换,简化了代码编写。 4. **增强的for循环(foreach)**:增强的for循环简化了遍历数组和集合的操作,使得代码更加简洁。 5. ...

    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版本免费下载

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

    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引入了泛型,允许在类、接口和方法中定义类型参数,增强了代码...

    IBMJDK1.5linux.zip

    此外,自动装箱/拆箱功能使得基本数据类型与对应的包装类之间可以无缝转换,简化了代码编写。 增强的for循环(foreach loop)也是Java 5的一个亮点,它提供了一种简洁的方式来遍历数组和集合,减少了出错的可能性。...

Global site tag (gtag.js) - Google Analytics