我们知道,java提供的8种基本数据类型并不支持面向对象的编程机制,不具备“对象“的特性,没有成员变量、方法可以被调用。java之所以提供这8种基本数据类型,主要是为了照顾程序员的传统习惯。
这8种基本数据类型带来了一定的方便性,例如简单的数据运算和常规数据的处理。但是在某些时候,基本数据类型也会有一些制约,例如所有的引用类型的变量都继承了Object类,都可以当成Object类型变量使用。但基本数据类型的变量不可以,如果有方法需要Object类型的参数,但实际需要的值是1、2、3等数值,这可能就比较难以处理。
为了解决8中基本数据类型变量不能当成Object类型变量使用的问题,java提供了包装类的思想,为8种基本数据类型分别定义了相应的引用类型,并称之为基本数据类型的包装类。
基本数据类型和包装类的对应表
byte | short | int | long | float | double | char | boolean |
Byte | Short | Integer | Long | Float | Double | Character | Boolean |
class BaoZhuang{
publicstatic void main(String[] args){
int i= 123;
Integerinteger = new Integer(i);
System.out.println(integer);
byte b= 123;
Bytebb = new Byte(b);
System.out.println(bb);
shorts = 123;
Shortss = new Short(s);
System.out.println(ss);
long l= 123;
Longll = new Long(l);
System.out.println(ll);
floatf = 123.0f;
Floatff = new Float(f);
System.out.println(ff);
doubled = 123.0;
Doubledd = new Double(d);
System.out.println(dd);
char c= 'c';
Charactercharacter = new Character(c);
System.out.println(character);
booleanbl = true;
Booleanboo = new Boolean(bl);
System.out.println(boo);
}
}
除了int和char之外,其他的基本数据类型只需要首字母大写即可编程它们对应的包装类。
自动装箱和自动拆箱:
我们都知道,不可以直接把基本数据类型赋值给引用数据类型。所以在JDK1.5之前,构建一个包装类需要通过构造器来构造包装类对象,但是这显得代码过于麻烦,所以从1.5之后就提供了自动装箱和自动拆箱的功能。
自动装箱:就是可以把一个基本类型变量直接赋值给对应的包装类变量,或者赋值给Object变量(因为Object类是所有类的父类);
int i= 123;
Integerinteger = i;//JDK1.5之前:new Integer(i);
//先把123456自动装箱为Integer类型,Object代表Integer
Objectobj = 123456;
System.out.println(obj);//打印结果123456
自动拆箱:与自动装箱相反,允许直接把包装类对象直接赋值给一个对应的基本类型变量。
//TODO代码演示自动装箱与自动拆箱
//自动装箱
Integerinteger = 1234;
//自动拆箱
intint2 = integer;
System.out.println(int2);
int i= 123;
Objectobj = i;
int ii= (Integer)obj;
System.out.println(ii);
思考:
Byteb = 123;
//b自动转换成了byte,byte强转int
Integerinteger = (int)b;
System.out.println(integer);
当JDK提供了自动装箱和自动拆箱功能后,大大简化了基本类型变量和包装类对象之间的转换,值得提出的是,进行自动装箱和自动拆箱时,必须注意类型匹配,例如Integer只能自动拆箱成int类型变量,不要试图拆箱成boolean类型变量;与之类似的是,int类型只能自动装箱成Integer对象,即便赋给Object类型变量,那也是利用了自动转型的特性,不要试图将int自动装箱成Boolean类型对象。
借助这种机制,一定程度上,我们可以把包装类当成基本数据类型使用,也可以把基本类型的变量近似的当成对象使用(当然,使用的时候需要自动装箱一下)。
除此之外,包装类还可以实现基本类型变量和字符串之间的转换,把字符串类型的值转换为基本类型的值有两种方式。
1、parseXxx(String )静态方法。(Character除外)
2、利用包装类提供的Xxx(Stirng s)构造器。
class BaoZhuang{
publicstatic void main(String[] args){
//字符串和基本数据类型可以转换了
//1 静态方法调用
intresult = Integer.parseInt("123");
System.out.println(result);
//2 构造方法创建
result= new Integer("1234");
System.out.println(result);
}
}
String类型也提供了多个重载的valueOf()方法,用于将基本类型变量转换成字符串,下面程序示范 了这种转换关系。
//TODO 字符串与包装类的互转
Stringstr2 = String.valueOf(i);
System.out.println(str2);
//但是实际中,我们有更加简便的方法将数据类型转为String
int i= 123;
Stringstr = i + "";
当包装类型的变量是引用数据类型,但是我们也可以拿这些包装类型对象与数值类型的值比较,这种比较是直接取出包装类的实例所包装的数值再与之进行比较。
//TODO
Integerinteger = 123;
System.out.println(integer> 456);
Integerinteger1 = 1234;
Integerinteger2 = 456;
System.out.println(integer1> integer2);
但是,如果是两个包装类型直接比较,即便包装的值相同,但是也会返回false,因为引用数据类型比较是有其他方式比较的,以后会说引用数据类型的比较。
//TODO
Integerinteger1 = 456;
Integerinteger2 = 456;
System.out.println(integer1== integer2);//false
//练习包装类方法、静态方法、构造器、常量
//字符串数字解码接受不同进制格式的字符串数字
intresult = Integer.decode("0x123456");
System.out.println(result);
//字符串解码,仅支持字面量数字
result= new Integer("12345");
System.out.println(result);