1、包装类
出于对性能的考虑,Java编程语言不把基本数据类型看作对象。因为处理对象需要额外的系统开销,所以,如果将基本数据类型当作对象,就会给语言性能带来负面影响。然而,许多Java中的方法需要将对象作为参数,为了让基本数据类型的这些数据也具有面向对象的特性,Java编程语言提供了包装类来将基本数据类型看作对象,基本类型和包装类型之间能够互相转换。
1. 包装类简介
包装类型和基本数据类型的名字基本相同,首字母变成了大写,但是int和char的包装类型为Integer和Character。基本数据类型不是对象层次结构的组成部分。有时需要像处理对象一样处理这些基本数据类型,可通过相应的“包装类”来将其“包装”。
基本数据类型及其包装类型
基本类型 | 包装类 |
boolean | Boolean |
byte | Byte |
char | Character |
double | Double |
float | Float |
int | Integer |
long | Long |
short | Short |
基本数据类型的变量没有默认值,而包装类型的变量默认值是null。在这八个包装类中,除了Integer和Character类以外,其它六个类的类名和基本数据类型一致,只是类名的第一个字母大写即可。对于包装类说,这些类的用途主要包含两种:
a、作为和基本数据类型对应的类类型存在,方便涉及到对象的操作。
b、包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法。
2. 基本类型与包装类之间的转换
包装类有什么作用呢?包装类能够完成数据类型之间(除boolean)的相互转换,尤其是基本数据类型和String类型的转换。包装类中包含了对应基本数据类型的值,封装了String和基本数据类型之间相互转换的方法,还有一些处理这些基本数据类型时非常有用的属性和方法。由于八个包装类的使用比较类似,下面以最常用的Integer类为例子介绍包装类的实际使用。
1、实现int和Integer类之间的转换
在实际转换时,使用Integer类的构造方法和Integer类内部的intValue()方法实现int和Interger类型之间的相互转换,实现的代码如下:
int n = 10;
//将int类型转换为Integer类型
Integer in = new Integer(n);
//将Integer类型的对象转换为int类型
int m = in.intValue();
2、Integer类内部的常用方法
在Integer类内部包含了一些和int操作有关的方法,下面介绍一些比较常用的方法:
(1)parseInt方法
public static int parseInt(String s)
该方法的作用是将数字字符串转换为int数值。在界面编程中,将字符串转换为对应的int数字是一种比较常见的操作。使用示例如下:
String s = "123";
int n = Integer.parseInt(s);
则int变量n的值是123,该方法实际上实现了字符串和int之间的转换,如果字符串包含非数字字符,则程序执行将出现异常。
另外一个parseInt方法:
public static int parseInt(String s, int radix)
则实现将字符串按照参数radix指定的进制转换为int,使用示例如下:
int n = Integer.parseInt("120",10);
//将字符串"120"按照十进制转换为int,则结果为120
int n = Integer.parseInt("12",16);
//将字符串"12"按照十六进制转换为int,则结果为18
int n = Integer.parseInt("ff",16);
//将字符串"ff"按照十六进制转换为int,则结果为255
这样可以实现更灵活的转换。
(2)toString方法
public static String toString(int i)
该方法的作用是将int类型转换为对应的String类型。
使用示例代码如下:
int m = 1000;
String s = Integer.toString(m);
则字符串s的值是"1000"。
3. 字符串与基本数据类型、包装类型转换
1、包装类转换成字符串
几乎java.lang.Object类派生的所有类提供了toString()方法,即将该类转换为字符串。例如:Characrer、Integer、Float、Double、Boolean、Short等类的toString()方法分别用于将字符型、整型、浮点型、双精度浮点型、短整型等类转换为字符串。举例如下所示:
int i1=10;
float f1=3.14f;
double d1=3.1415926;
Integer i1 = new Integer(i1);//生成Integer类
Float f1 = new Float(f1); //生成Float类
Double d1 = new Double(d1); //生成Double类
//分别调用包装类的toString() 方法转换为字符串
String si1 = i1.toString();
String sf1 = f1.toString();
String sd1 = d1.toString();
System.out.println("si1"+si1);
System.out.println("sf1"+sf1);
System.out.println("sd1"+sd1);
整数转换成字符串也可以采用如下方法:
int myInt = 1234;
String myString = "" + myInt;
其它数据类型可以利用同样的方法转换成字符串
2、字符串转换为基本数据类型
字符串转换成整数:
String myNumber ="1234";
int myInt = Integer.parseInt(myNumber);
字符串转换成byte、shor、int、float、double、long 等数据类型,可以分别参考Byte、Short、Integer、Float、Double、Long 类的parseXXX() 方法。
JDK自从5.0版本以后,就引入了自动拆装箱的语法,也就是在进行基本数据类型和对应的包装类转换时,系统将自动进行,这将大大方便程序员的代码书写。使用示例代码如下:
//int类型会自动转换为Integer类型
int m = 12;
Integer in = m;
//Integer类型会自动转换为int类型
int n = in;
所以在实际使用时的类型转换将变得很简单,系统将自动实现对应的转换。Java允许基本类型和包装类型之间进行自动转换。例如可以自动装箱将一个基本数据类型转换为对象。
Integer intObject=new Integer(2);等价于 Integer intObject=2; //自动装箱
将基本类型转换为包装类对象的过程称为装箱,相反的过程称为拆箱。如果一个基本类型出现在需要对象的环境中,编译器会将基本类型值进行自动装箱;如果一个对象出现在需要基本类型的环境中,编辑器将对象进行自动拆箱。考虑下面的例子:
1:Integer[ ] intArray = {1,2,3};
2:System.out.println(intArray[0] + intArray [1] + intArray[2]);
在第一行中,基本类型1、2、3被自动装箱成对象new Integer(1)、new Integer(2)、new Integer(3) ,在第二行中,对象intArray[0]、intArray[0]、intArray[0]被自动转换为int值,然后进行相加。
【例】包装类、基本数据类型和字符串之间转换的综合案例。
public class TestWrapper {
public static void main(String ars[]){
Double obj_d = new Double(3.14); //基本数据类型转换为包装类
double d = obj_d.doubleValue(); //包装类转换为基本数据类型
Integer obj_i = new Integer("5"); //字符串转换为包装类
String s = obj_i.toString(); //包装类转换为字符串转换
double n = Double.parseDouble("5"); //字符串类转换为基本数据类型
String s = obj_j.toString(); //基本数据类型转换为字符串类型
Integer aa = 9; //自动装箱
int bb = aa; //自动拆箱
}
}
通过以上案例可以看出,基本数据类型和字符串类型转换为包装类,使用包装类的构造器来完成;包装类转换为基本数据类型,调用包装类的xxxValue()方法来完成;包装类转换为字符串类型,调用包装类的toString()方法;字符串转换为基本数据类型,调用包装类的parseXXX()方法;基本数据类型转换为字符串类型,先把基本数据类型转换为包装类型,然后再调用包装类的toString()方法;装箱就是把基本类型用它们相应的包装类型包装起来,使其具有对象的性质。int包装成Integer、float包装成Float,拆箱和装箱相反,将包装类型的对象转化成基本类型类型的数据。