5.4 对象包装器和自动装箱(Ingeter、Long、Float、Short、Byte、Character、Void、Boolean)

有时候我们需要把基本数据类型转换为对象类型。java中的包装器解决了这个需求。

什么是包装器呢?

包装器就是基本数据类型对应的java类,比如Integer类是int对应的包装器;
包装器:Ingeter、Long、Float、Short、Byte、Character、Void、Boolean
其中Ingeter、Long、Float、Short、Byte、Character的超类类是Number
5.4 对象包装器和自动装箱(Ingeter、Long、Float、Short、Byte、Character、Void、Boolean)

  • 对象包装器类是不可变的,不可以更改包装器中包装的值,这句话的意思可以理解为Integer类本身(构造器、函数)不可以改变包装的值,但是可以改变Integer的引用来达到改变值的效果。
  • 对象包装器类是final,因此不能用它们定义子类
    5.4 对象包装器和自动装箱(Ingeter、Long、Float、Short、Byte、Character、Void、Boolean)

什么是自动装箱呢?

这里我们定义一个ArrayList对象:
ArrayList<Integer> list = new ArrayList<Integer>();
执行:list.add(1);
将自动变换成:list.add(Ingeter.valueOf(1));
这种变换称为自动装箱

什么是拆箱?
将一个Ingeter对象赋给int值时,称为拆箱
int a = list.get(0);
自动拆解为:int n=list.get(0).intValue();

在算术表达式中也能够自动的装箱拆箱
例如,可以将自增操作符应用于一个包装器引用:
Integer n = 3;
n++;
编译器将自动地插人一条对象拆箱的指令, 然后进行自增计算, 最后再将结果装箱。

在比较两个包装器对象的值是否一样时,不要用==,==只不过检测的是对象是 否指向同一个存储区域。
两个包装器对象比较时调用 equals方法。

由于包装器类引用可以为 null, 所以自动装箱 有可能会抛出一个 NullPointerException 异常:
5.4 对象包装器和自动装箱(Ingeter、Long、Float、Short、Byte、Character、Void、Boolean)

如果在一个条件表达式中混合使用 Integer 和 Double 类型, Integer 值就会拆箱, 提升为 double, 再装箱为 Double

5.4 对象包装器和自动装箱(Ingeter、Long、Float、Short、Byte、Character、Void、Boolean)
装箱和拆箱是编译器认可的,而不是虚拟机。编译器在生成类的字节码 时, 插人必要的方法调用。虚拟机只是执行这些字节码。

此外对象包装器中有很多的方法函数:这里只列举Ingeter的函数和方法
5.4 对象包装器和自动装箱(Ingeter、Long、Float、Short、Byte、Character、Void、Boolean)

如果想编写一个修改数值参数值的方法, 就需要使用在 org.omg.CORBA 包中定义的 持有者( holder) 类型, 包括 IntHolder、BooleanHolder 等。每个持有者类型都包含’一个 公有(!)域值,通过它可以访问存储在其中的值。

5.4 对象包装器和自动装箱(Ingeter、Long、Float、Short、Byte、Character、Void、Boolean)