包装类Wrapper的详细介绍
包装类Wrapper的详细介绍
1.为什么要使用包装类
在Java中有两种变量(Variable),一种是基本型别(primitive type)的变量,还有一种是类性别(class type)的变量,即对象与非对象两种。有时候我们需要把基本型别包装成对象来使用,例如ArrayList,我们想在其中存放int该怎么办?我们能否这样申明一个ArrayList:ArrayList<int> list=new ArrayList<>(),答案是否定滴,:(。
幸运的是,java为每一个基本型别都提供了一个相应的包装类(Wrapper)对其进行包装,例如int对应Integer,double对应Double,char对应Character等等。我们可以把某个包装类的一个对象当成其对应的基本型别的一个值来看,所不同的是它现在是一个对象了,可以利用reference来进行操作了。
2.包装类的使用
以Integer为例进行讲述。包装类的使用比较简单,特别是在JDK5.0中。
Integer i=new Integer(3),这样我们就创建了一个包装类,如果我们想得到它所代表的值就可以通过i.intValue()来获得,其它更多的方法可以参看JDK5.0帮助文档,非常容易理解与使用。需要说明的是,所以的包装类都是final类,并且都是恒定不变(immutable)的,这包含有两个意思:a.任何类不得继承包装类;b.包装类的一个对象一经创建,其所代表的值将不再变化,也就是说我们不能通过某个指向(refer to)它的reference来改变它的值了,直至它被垃圾回收器回收,String类也是这样的。
3.自动打包与解包(JDK5.0新特性)
在JDK5.0以前,我们是不能直接将一个基本型别的值直接赋给其对应包装类的一个对象类的,例如Integer i=3,这样做是错误的,但是在5.0中是可以做的了,这句话自动翻译成Integer i=new Integer(3),这叫自动打包。我们还能够直接写i++对i进行自增,它的执行过程是首先将i解包成一个整数3(int j=i.intValue()),把它的值加1后再打包回去(j++;i=new Integer(j),此时i应该指向了一个新的Integer对象),这样一来将大大简化我们的代码了。最后,强调一点,能够自动打包与解包要感谢我们的编译器,因为是编译器在编译的时候自动帮我们把打包与解包的代码加进去了,然后编译成字节码
4.自动打包(autoboxing)的一个特征
在java中对boolean、byte、0~127的char、-128~127的byte/short/int/long进行自动打包时,同一个值都打包成同一个对象。翻译的不好,还是以Integer为例来进行说明,看下面的代码:
Integer i=4;
Integer j=4;
Integer k=new Integer(4);
System.out.println(i==j);//输出将为true
System.out.println(i==k);//输出将为false
输出结果为true false,现在大家应该明白上面这段话的意思了吧,:)