位于上海,服务全国!

位于上海,服务全国!

理解Java Wrapper类

作者:admin 分类: 时间:2017-07-21 09:49:10 点击量:34569

Java Wrapper类可将Java的原始数据类型处理为对象的方式。特别是当我们需要一个原始值的对象引用时,这是必需的,因为它们的原形式所需的功能类型(如int,char,double,boolean等)不够。 本文比较详细的介绍了标准API库中提供的这些类的概念。
Java中的原类型和引用类型
在Java中,类型被指定为基本类型或引用类型。

那些原类型一次存储单个声明类型的值。 例如,定义为int的变量可以一次存储一个整数。 在存储另一个值的情况下,初始值被新的值替换。
在Java中,默认情况下会初始化原始变量。 如果它是一个数字类型,例如由byte,short,int,long,float和double指定,则将其初始化为0(零),将char类型初始化为数值-1,布尔类型为 默认情况下初始化为false。 初始默认值可能会在其声明中分配一个值来覆盖。

int intvalue = 102;

但是,请注意,默认情况下,本地声明的原始值不会初始化。 任何尝试访问本地未初始化变量的都产生是编译错误。
非原类型的所有其他变量实际上是引用类型。 引用类型保存对内存对象的引用。 每个引用对象可能包含许多实例变量。 它们默认会被初始化为一个空值,意思是不引用任何内容或没有内存对象。 引用类型变量通过声明方法和属性进行定义。 在通过new关键字调用的构造函数,对它们实例化; 通常,被创建的对象实例用于访问它们中定义的方法。
Person person = new Person();
Java Wrapper类
Java wrapper类旨在将原始类型存储为引用类型,并将其视为实例化内存对象的引用。 这样做的主要好处是,特定原始类型的相应wrapper类可以容纳许多类型的信息,以便提供诸如从一种类型到另一种类型的转换以及大量其他方便的功能。 因为Java中有八个基本类型,相应的wrapper类如下所示:
 

这些wrapper类在java.lang包中的定义及分层结构如下:

 
图1:包装类的层次结构
简单来说,wrapper类是在Java中创建对象引用类型的原始类型的方式。我们可以说,通过提供wrapper类,使Java在面向对象技术的本质上摆脱了困境,即使是原类型没有被保存。

一个问题是,通过使用两种类型的数据来管理(原始值和对象引用),Java在某些情况下不会产生问题? 答案是否定的,因为这里我们有两个选择。 在我们需要一个用作容器的对象来容纳一个简单的原始类型的情况下,除了简单地保存该值之外,还提供了一组丰富的功能。而且除了使用wrapper类之外,没有别的方法。 例如,由Integer类创建的对象存储的单个int值还提供了许多静态和非静态功能。 其中几个如下:
一个构造函数,它使用所提供的值构造一个Integer对象:
Integer(int value)
还有一个构造函数创建一个具有int值的Integer对象,由String参数标示。 如果String参数不包含可解析整数,则会抛出异常NumberFormatException。
Integer(String s)
一些成员的功能有:
byte byteValue()
double doubleValue()
float floatValue()
int intValue()
long longValue()
shortValue()
这些成员函数返回由Integer对象引用表示的值的相应原类型值。
另外还有很多静态方法,比如:

static int max(int a, int b)
static int min(int a, int b)

它分别返回两个int类型较大及较小的值。
由整数wrapper类和其他wrapper类提供的相关完整函数列表,请参阅Java API文档。
鉴于其他类,此功能略微与wrapper类不同。 在Java 5之前,简单的原类型转换和适合wrapper类的数据结构有点不方便。 我们每次都必须创建包装器的一个对象实例,然后才能将原始值插入到对象引用中。 还有类似的不便之处在于检索该值。 例如,我们必须做这样的事情:

Integer[] iArray = new Integer[10]
iArray[0] = new Integer(100);
而且,为了检索值,我们必须处理如下事项:
int value = iArray[0].intvalue();
随着Java 5引入自动封箱和自动拆箱,上述条件可以通过较少的代码实现,如下所示:
Integer[] iArray = new Integer[10];
iArray[0] = 100;
int value = iArray[0];
在此,自动封箱意味着将原类型的值转换为相应的类型wrapper对象引用。 而且,自动拆箱是指将类型wrapper对象引用的对象转换为对应的原类型值。 因为这是在没有开发人员涉入的情况下自动完成的,所以操作分别称为自动装箱和自动拆箱。
在上述代码中,语句中会出现自动封箱
iArray[0] = 100;
int值100被自动打包成整数对象引用并存储。 这样存储的值不再是原类型,但是对象引用。
同样,语句中会出现自动拆箱
int value = iArray[0];

这里,wrapper类Integer的对象引用被转换为原值并存储在原类型int变量值中。
结论
Wrapper类是个好用的类。 如果我们要比较使用wrapper类和原类型之间获得的性能优势,很明显,必须使用原始类型。 另外要记住的一个重要点是,如果我们通过引用函数传递一个原始值,那么我们必须使用一个对象引用(wrapper类),因为Java将基本类型通过值传递给方法。