基本类型的包装类
在java中,每一种基本类型都有一个对应的包装类,这些类都在java.lang包中。8种基本数据类型所对应的包装类是byte(Byte)、short(Short)、int(Integter)、long(Long)、char(Character)、float(Float)、double(Double)、boolean(Boolean)。
Java语言用包装类来把一个基本类型数据转化为对象。或者说,一个包装类的实例总是包装着一个相应的基本类型的值。需要注意的是,包装类的实例一旦生成,其所包装的基本类型值是不能改变的。
包装类的作用:
(1)在有些情况下,能够被处理的数据的类型只能是引用类型,如Java集合中不能存放基本数据类型,如果要存放数字,应该通过包装将基本数据类型包装起来,来间接处理基本类型数据。
(2)每一个包装类都包含一组实用方法,其中很多是静态的。这些方法为处理某种基本类型数据提供了丰富的手段。比如Integer类的静态方法parseInt(String s)能将字符串转换为整数,静态方法toBinaryString(int i)返回包含整数i的2进制形式字符串。
1.1包装类对象的创建方式
使用包装类的方法与其他类一样,定义对象的引用、用new运算符创建对象,用方法对象进行操作。
每一个包装类有一个构造方法,可以通过一个相应的基本值生成一个实例,例如:
Integter i=new Integter(10); //i是Integter类的一个对象,值为10
Float f=new Float(1.0f); //f是Float类的一个对象,值为1.0f
Double d=new Double(1.0) //b是Double类的一个对象,值为1.0
Boolean b=new Boolean(true) //b是Boolean类的一个对象,值为true
Character c=new Charcater('c') //c是Character类的一个对象,值为'c'
(2)除了Character,其他包装类都有一个构造方法,可以通过一个表示相应基本型值的字符串生成实例。如果指定字符串不能表示一个有效的基本型值,那么除了Boolean,其他包装类的构造器会抛出NUmberFormatException异常。
例如:
Integter i=new Integter("123") //i是Integter类的一个对象,值为123。
Float f=new Float(“12.34F") //f是Float类的对象,值为12.34F
Double d=new Double("1.234D") //d是Double类的一个对象,值为1.234D
(3)Boolean类的构造方法接受任意字符串,如果字符串为"ture"(忽略大小写),则生成的实例包装true,否则包装false。例如:
Boolean b=new Boolean("True")
Boolean b=new Boolean("123a")
1.2包装类常用的方法:
(1)每个包装类都有一个实例方法xxxValue(),这里xxx是相应的基本数据类型名。使用该方法可以抽取并返回实例所包装的基本型值。例如:
Integter i=new Integter(10); int j=i.intValue(); //j=10;
Float f=new Float("12.34F"); float fVar=f.folatValue(); //fVar=12.34F;
(2)除了Charcater类和Boolean类,包装类都有一个静态方法valueOf(String s),该方法可以根据一个表示相应基本型值的字符串生成实例。例如:
Integter i=Integter.valueOf("123"); //i是Integter类的一个对象,值为123;
Float f=Float.valueOf("12.34F"); //f是Float类的一个对象,值为12.34F;
Double d=Double.valueOf("1.234D"); //d是Double类的一个对象,值为1.234D;
(3)除了Character类和Boolean类,包装类都有一个静态方法parseXXX(String str),该方法把字符串转换为相应的基本类型数据,这里XXX是相应的基本数据类型名。Str不能为null,否则,会抛出NumberFormatException异常。例如:
int i=Integter.parseInt("123") ; //i=123;
double d=Double.parseDouble("qwe"); //抛出NumberFormatException异常。
自动装箱和自动拆箱
把基本类型的值转换为相应的包装类型对象,这一过程称为“装箱”。例如:
Integter iObj=new Integter(100);
Float fObj=new Flaot(3.14f);
Boolean bObj=new Boolean(true);
Charcater cObj=new Character('c');
把包装类对象转换为相应的基本类型的值,这一过程称为“拆箱”;例如:
int i=iObj.intValue();
float f=fObj.floatValue();
char c=cObj.charValue();
boolean b=bObj.booleanValue();
JDK5.0提供了自动装箱和自动拆箱的功能,可以使用以下语句来打包基本数据类型的数据:
Integter iObj=100;
Float fObj=3.14f;
boolean b=true;
char c='c';
在进行编译时,编译器自动根据语句判断是否进行自动装箱动作。总之,可以将int、boolean、byte、short、char、long、float、double 8中基本数据类型,分别转换为相应的包装类型Integter、Boolean、Byte、Short、Character、Long、Float或Double。
也可以直接使用以下语句,将包装类对象中所包装的数据提取出来。
int i=iObj;
float f=fObj;
boolean b=bObj;
char c=cObj;
可见,自动装箱和自动拆箱能使基本类型和包装类之间的混合运算变为合法。在赋值时,基本类型和包装类之间直接赋值,不需要做任何转换;在运算时,也可以进行自动装箱与拆箱。例如:
Integter i=10;
System.out.println(i+10);
System.out.println(i++);
上述过程如下:
编译器会自动的进行装箱和拆箱,首先,10会被自动的装箱,然后在i+10时会先拆箱,进行加法运算;i++该行也是先拆箱在进行递增运算。
还可以使用更为一般化的java.lang.Number类来进行拆箱操作。例如:
Number number=3.14f;
//.314先会被自动装箱为Float,然后指定给number。
具体例子:
class Score
{
float getScore(Float score)
{
return score;
}
}
public class WrapPrim {
public static void main(String[] args) {
float x,y;
Score o1,o2;
o1=new Score();
o2=new Score();
x=o1.getScore(96.f);
y=o2.getScore(73.2f);
System.out.println("x="+x+",y="+y);
}
}
{
float getScore(Float score)
{
return score;
}
}
public class WrapPrim {
public static void main(String[] args) {
float x,y;
Score o1,o2;
o1=new Score();
o2=new Score();
x=o1.getScore(96.f);
y=o2.getScore(73.2f);
System.out.println("x="+x+",y="+y);
}
}
运行结果:
x=96.0,y=73.2