包装类
包装类简介
Java语言是典型的面向对象编程语言,但是其中的8种基本数据类型并不支持面向对象编程,基本类型数据不具备"对象"的特性,即:没有携带属性以及没有方法可以调用。
为了解决上述问题,java为每种基本类型设计分别设计了对应的类,称为包装类(Wrapper Classes)。
基础数据类型类与包装类对应关系,如下图所示。
基本数据类型 | 对应包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
float | Float |
double | Double |
boolean | Boolean |
注:每个包装类的对象可以封装一个相应的基本类型数据,并提供了其他一些有用的方法。包装类对象一经创建,其内容(所封装的基本类型数据值)不可改变。所有的包装类都是抽象类Number的子类。
基本类型和对应的包装类可以相互转化:
-
从基本类型向对应的包装类转换称为装箱。
eg:char包装成为Character类的对象。
-
从包装类向对应的基本类型转换称为拆箱。
eg:Character类的对象重新简化为char。
手动装箱和拆箱
以int和Integer为例,可以通过Integer类的构造方法(构造器)将int装箱,通过Integer类的intValue方法将Integer拆箱。手动装箱和拆箱如下图所示。
Integer类中常用方法:
-
静态paseInt方法,可以将字符串转化为整数,方法定义如下图所示。
其中,s参数为要转换的字符串,radix为要转化字符串中数的进制,默认进制为十进制。
方法调用效果,如下图所示。
注:图中radix为要转化字符串中数的进制。即,将一个指定进制为radix的字符串s解析为一个十进制整数。
补充:有些字符串无法通过此方法转换为整数,如下图所示。
很明显"123abc"等字符串的数字内容并不是十进制的数字类型,故不能转化为整数形式。
-
静态toString方法,可以将整数转化为字符串,方法定义如下图所示。
其中,i参数为要转换的整数,radix参数为该整数要转换成radix进制的字符串,默认进制为十进制。
方法调用效果,如下图所示。
注:图中radix为转化后字符串中数的进制。即,将一个数i转化为一个指定进制数为radix的字符串。
补充:直接在整数后加空字符串也可将整数转换为字符串形式。如下图所示。
自动装箱和拆箱
在Java1.5之后,可进行自动拆箱装箱,即在进行基本数据类型和对应的包装类转换时,系统将自动进行,方便了书写。如下图所示。
其中,编译器会根据所写语法,决定是否进行拆箱装箱动作,如下式所示。
//装箱
Integer i = 100;
//上式等价于下式的手动装箱
Integer i = new Integer(100);
//拆箱
int j = i;//i如前式,已装箱
//上式等价于下式的手动拆箱
int j = i.intValue();
注:自动功能也存在弊端,如下式所示。
Integer i = null;
int j = i;
这段代码在编译期间是合法的,但运行时会有错误。因为在拆箱时,需要调用Integer对象中的intValue方法,但变量i没有任何实例对象,故不能使用intValue方法。所以上述式子运行时会产生NullPointerException错误。如下图所示。