包装类
虽然Java是面向对象的编程语言,但它所包含的8种基本数据类型却不支持面向对象的编程机制(没有属性和方法)。Java之所以提供这8种基本数据类型,是为了方便常规数据的处理。在Java中,很多类的方法都需要接收引用类型的对象,此时就无法将一个基本数据类型的值传入。为了解决这样的问题,JDK中提供了一系列的包装类,通过这些包装类可以将基本数据类型的值包装为引用数据类型的对象。
在Java中,每种基本类型都有对应的包装类,具体如表1所示。
表1 基本类型对应的包装类
基本数据类型 | 对应的包装类 |
---|---|
byte | Byte |
char | Character |
int | Integer |
short | Short |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
在表1中,列举了8种基本数据类型及其对应的包装类。除了Integer和Character类外,其他对应的包装类的名称都与其基本数据类型一样,只不过首字母需要大写。
包装类和基本数据类型在进行转换时,引入了自动装箱(Autoboxing)和自动拆箱(AutoUnboxing)的概念,其中自动装箱是指将基本数据类型的变量赋给对应的包装类变量;反之,拆箱是指将包装类对象类型直接赋给一个对应的基本数据类型变量。
接下来以int基本类型与对应的包装类Integer为例,学习一下装箱拆箱的过程,如文件1所示。
文件1 Example17.java
1 public class Example17 {
2 public static void main(String args[]) {
3 // 定义一个基本类型的变量a,并赋值为20
4 int a = 20;
5 // 自动装箱:将基本类型的变量a赋给Integer类型的变量b
6 Integer b = a;
7 System.out.println(b);
8 // 自动拆箱:将Integer类型的变量b赋给基本类型的变量a
9 int c = b;
10 System.out.println(c);
11 }
12 }
运行结果如图1所示。
图1 运行结果
文件1中,通过包装类和自动拆箱、装箱功能,开发人员可以把基本数据类型的变量转换成对象来使用,也可以把包装类的实例转换成基本类型的变量来使用。
Java中,除了支持基本数据类型与对应包装类之间进行转换外,还提供了其他方法来支持基本数据类型、基本数据包装类以及字符串之间的相互转换。具体如下:
(1)通过引用数据类型字符串String类的valueOf()方法可以将8种基本数据类型转换为对应的字符串类型;
(2)通过8种包装类的静态方法valueOf()既可以将对应的基本数据类型转换为包装类,也可以将变量内容匹配的字符串转换为对应的包装类(Character包装类除外);
(3)通过8种包装类的有参构造方法同样既可以将对应的基本数据类型转换为包装类,也可以将变量内容匹配的字符串转换为对应的包装类(Character包装类除外);
(4)通过8种包装类的静态方法parseXxx()可以将变量内容匹配的字符串转换为对应的基本数据类型;
(5)包装类都重写了Object类中的toString()方法,以字符串的形式返回被包装的基本数据类型的值。
下面通过上面的方法来实现基本数据类型、包装类以及字符串之间的相互转换,如文件2所示。
文件2 Example18
1 public class Example18 {
2 public static void main(String args[]) {
3 int num = 123;
4 // 1、通过String.valueOf()方法将基本类型转换为字符串
5 String string = String.valueOf(num);
6 System.out.println("将int变量转换为字符串的结果:"+string);
7 // 2、通过包装类的valueOf()静态方法将基本类型和字符串转换为包装类
8 String str = "998";
9 Integer integer = Integer.valueOf(num);
10 Integer integer2 = Integer.valueOf(str);
11 System.out.println("将int变量转换为包装类的结果:"+integer);
12 System.out.println("将字符串变量转换为包装类的结果:"+integer2);
13 // 3、通过包装类的有参构造方法将基本类型和字符串转换为包装类
14 Integer integer3 = new Integer(num);
15 Integer integer4 = new Integer(str);
16 System.out.println("通过构造器将int变量转换为包装类的结果:"
17 +integer3);
18 System.out.println("通过构造器将字符串变量转换为包装类的结果:"
19 +integer4);
20 // 4、通过包装类的parseXxx()静态方法将字符串转换为基本数据类型
21 int parseInt = Integer.parseInt(str);
22 System.out.println("将字符串转换为基本类型的结果:"+parseInt);
23 // 5、通过包装类的toString()方法将包装类转换为字符串
24 String string2 = integer.toString();
25 System.out.println("将包装类转换为字符串的结果:"+string2);
26 }
27 }
运行结果如图2所示。
图2 运行结果
从图2可以看出,介绍的几种方法可以实现基本数据类型、包装类以及字符串之间的相互转换,但在使用valueOf(String s)和parseXxx(String s)方法时,还需要注意以下几点:
①除了Character外,包装类都有valueOf(String s)方法,可以根据String类型的参数创建包装类对象,但参数字符串s不能为null,而且字符串必须是可以解析为相应基本类型的数据,否则虽然编译通过,但运行时会报错。具体示例如下:
Integer i = Integer.valueOf("123"); // 合法
Integer i = Integer.valueOf("12a"); // 不合法
②除了Character外,包装类都有parseXxx(String s)的静态方法,将字符串转换为对应的基本类型的数据。参数s不能为null,而且同样必须是可以解析为相应基本类型的数据,否则虽然编译通过,但运行时会报错。具体示例如下:
int i = Integer.parseInt("123"); // 合法
Integer in = Integer.parseInt("itcast");// 不合法