一、概念
Java是面向对象的语言,但并不是“纯面向对象”的,因为我们经常用到的基本数据类型就不是对象。但是我们在实际应用中经常需要将基本数据转化成对象,以便于操作。比
如:将基本数据类型存储到Object[]数组或集合中的操作等等。
Java在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class),包装类均位于java.lang包。在这八个类名
中,除了Integer和Character类以外,其它六个类的类名和基本数据类型一致,只是类名的第一个字母大写而已。在这八个类中,除了Character和Boolean以外,其他的都是“数字
型”,“数字型”都是java.lang.Number的子类。Number类是抽象类,因此它的抽象方法,所有子类都需要提供实现。Number类提供了抽象方法:intValue()、longValue()
floatValue()、doubleValue(),意味着所有的“数字型”包装类都可以互相转型
【用途】
1. 作为和基本数据类型对应的类型存在,方便涉及到对象的操作,如Object[]、集合等的操作。
2. 包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法(这些操作方法的作用是在基本数据类型、包装类对象、字符串之间提供相互之间的转化!)。
【代码示例】
1 //测试包装类 2 package cn.sxt.test; 3 4 public class Test_0314_WrappedClass { 5 public static void main(String[] args){ 6 //基本数据类型转包装类对象 7 Integer a =new Integer(3);//实例化对象 构造方法 Integer父类是Number类 8 Integer b =Integer.valueOf(30); //两种方法都可以把基本数据类型转换成包装类对象 9 10 //包装类对象转数据类型11 int c=b.intValue();//把对象b转成基本数据类型-int型12 double d=b.doubleValue();13 14 //把字符串对象转成包装类对象15 Integer e=new Integer("9999");//此时“9999”是字符串,是数字格式, 可以转成包装类对象,但是若是“99999ff”会报错,16 //因为含有字符"ff",但前边是Integer类,即整形类,不符合条件17 Integer f =Integer.valueOf("33345");18 19 //包装类对象转成字符串20 String g=f.toString();21 22 //测试Integer类中的方法23 System.out.println("Integer类中最大整数是:"+Integer.MAX_VALUE);24 25 System.out.println(f);26 27 28 }29 30 }
二、封箱&拆箱
自动装箱和拆箱就是将基本数据类型和包装类之间进行自动的互相转换。自动的意思是编译器帮你把事情做完
自动装箱:基本类型的数据处于需要对象的环境中时,会自动转为“对象”。自动装箱调用的是valueOf()方法,而不是new Integer()方法。
自动拆箱:每当需要一个值时,对象会自动转成基本数据类型,没必要再去显式调用intValue()、doubleValue()等转型方法。自动拆箱调用的xxxValue()方法。
【注意】包装类在自动装箱时为了提高效率,对于-128~127之间的值会进行缓存处理。超过范围后,对象之间不能再使用==进行数值的比较,而是使用equals方法。
1 //测试自动装箱 2 package cn.sxt.test; 3 4 public class Test_0314_AutoBox { 5 public static void main(String[] args) { 6 7 //自动装箱:编译器自动完成 调用时实际调用是"Integer a=Integer.valueOf(123);" 这句话. ( Integer i= new Integer(123);) 8 Integer a=123; 9 //自动封箱:编译器自动完成 实际调用的是:int b=a.intValue();10 int b=a;11 12 Integer c=null;13 if(c!=null){14 int d=c; 15 }16 /* Integer c=null;17 * int d=c; 会异常,因为这句实际上会调用int b=a.intValue()这个方法 但是对象c为空所以会有异常。所以实际操作中会加如判断18 * 19 * */20 21 /* integer 缓存[-128,127]之间的数字,实际是在系统开始时,创建了[-128,127]之间的一个缓存数组,当调用valueOf()的时候,首先检查22 * 是否在这个缓存数组之内,如果在直接从这个数组中拿出来,否则创建新的Integer类的一个对象 23 */ 24 Integer in1 = -128;25 Integer in2 = -128;26 System.out.println(in1 == in2);//true 因为123在缓存范围内27 System.out.println(in1.equals(in2));//true equals只比较数据大小,不管是否由同一对象创建28 Integer in3 = 1234;29 Integer in4 = 1234;30 System.out.println(in3 == in4);//false 因为1234不在缓存范围内31 System.out.println(in3.equals(in4));//true32 33 }34 35 }