在
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.5之前,将基本类型和其对应的包装类型之间进行转换需要手动操作。而1.5版本之后,系统会自动处理这种转换,大大简化了代码。 此外,JDK1.5还引入了变量args参数,使得在...
### JDK 1.5 新特性详解 #### 泛型编程 **定义与作用:** 泛型编程是 Java 1.5 引入的一项重要特性,它允许开发者在编译时进行类型安全检查,从而避免了运行时可能出现的类型转换异常。通过在编译阶段检查类型安全...
JDK1.5,也称为Java 5.0,是一个重要的版本,它引入了许多新的特性和改进,对Java语言的发展产生了深远影响。 一、泛型(Generics) 在Java 5.0中,最重要的特性之一就是泛型的引入。泛型允许开发者在定义类、接口...
1. **自动装箱与拆箱**:在JDK 1.5之前,基本类型与包装类之间的转换需要手动进行。而1.5版本引入了自动装箱(Autoboxing)和拆箱(Unboxing)机制,使得基本类型和其对应的包装类之间可以无缝转换,简化了编程。 2...
2. **自动装箱与拆箱(Autoboxing and Unboxing)** 自动装箱允许开发者在原始类型与对应的包装类之间无缝切换,无需手动进行转换。例如,`int`与`Integer`之间的转换可以自动完成。 3. **枚举类型(Enums)** ...
2. **Autoboxing/Unboxing(自动装箱/拆箱)**:简化了基本类型与对应的包装类之间的转换。 3. **枚举(Enums)**:提供了一种新的数据类型,用于创建固定的、不可变的值集合。 4. **Annotations(注解)**:提供了...
其次,自动装箱与拆箱也是JDK1.5引入的新特性。这使得基本数据类型(如int、double)与它们对应的包装类(如Integer、Double)之间可以无缝切换,简化了代码编写。例如,现在可以直接将一个int值赋给Integer变量,...
总的来说,JDK 1.5是一个里程碑式的版本,它的许多新特性如泛型、枚举、注解和自动装箱/拆箱等,极大地提高了Java开发的效率和代码质量,也为后续版本奠定了坚实的基础。如果你习惯了使用JDK 1.7,但对JDK 1.5有特殊...
3. **自动装箱与拆箱(Autoboxing and Unboxing)**:JDK 1.5引入了自动装箱和拆箱机制,使得基本数据类型与对应的包装类之间可以无缝转换,简化了代码。 4. **变量注解(Annotations)**:注解是一种元数据,允许...
3. **自动装箱与拆箱**:自动装箱和拆箱使得基本数据类型与对应的包装类之间可以无缝切换,简化了代码编写。 4. **增强的for循环(foreach)**:增强的for循环简化了遍历数组和集合的操作,使得代码更加简洁。 5. ...
在 JDK 1.5 中,Java 语言引入了一系列重要的新特性,极大地提升了代码的可读性、安全性以及效率。以下是对这些新特性的详细解析: 1. 泛型(Generics) 泛型是 JDK 1.5 最重要的改进之一,它允许在定义集合类时...
JDK1.5是Oracle公司于2004年发布的一个重要版本,代号为"Tioga",它在Java的历史上具有里程碑式的意义,引入了许多重要的新特性和改进。 ### 1. 泛型(Generics) JDK1.5最重要的特性之一就是泛型的引入。泛型允许...
JDK1.5引入了一些重要的新特性,如: 1. **Generics(泛型)**:允许在类、接口和方法中使用类型参数,增强了类型安全性和代码重用性。 2. **Autoboxing and Unboxing(自动装箱与拆箱)**:自动将基本类型与对应的...
3. **自动装箱/拆箱(Autoboxing and Unboxing)**:Java 1.5引入了自动装箱和拆箱机制,使得基本类型和对应的包装类之间可以无缝转换,简化了代码编写。 4. **变量赋值增强(Enhanced for Loop)**:也称为foreach...
另外,自动装箱和拆箱功能使得基本类型与对应的包装类之间转换更加方便。例如,int和Integer之间的转换不再需要显式的装箱和拆箱操作。 在类型系统方面,Java 5引入了变量类型推断,体现在匿名内部类和局部变量的...
3. **自动装箱/拆箱(Autoboxing and Unboxing)**:在JDK1.5以前,将基本类型与对应的包装器类型之间进行转换需要手动操作。1.5以后,编译器会自动进行这种转换,极大简化了代码。例如,int和Integer之间的转换可以...
2. **自动装箱与拆箱(Autoboxing/Unboxing)**:自动装箱允许在基本类型和对应的包装类之间进行无缝转换,简化了代码编写。 3. **枚举类型(Enums)**:枚举是一种新的数据类型,用于定义有限集合的常量,提高了...
JDK 1.5,也称为Java 5.0,是一个重要的里程碑,因为它引入了许多新的特性和改进,对于Java开发者来说具有深远的影响。 1. 泛型(Generics): JDK 1.5引入了泛型,允许在类、接口和方法中定义类型参数,增强了代码...
此外,自动装箱/拆箱功能使得基本数据类型与对应的包装类之间可以无缝转换,简化了代码编写。 增强的for循环(foreach loop)也是Java 5的一个亮点,它提供了一种简洁的方式来遍历数组和集合,减少了出错的可能性。...