您当前的位置:首页 >> 人生
JAVA脱水学习-java包装类,包装类解析
发布时间:2019-08-21
 

包装类是对基础类型数据的包装,让基础数据类型“伪装”成类,具有类的特性,可以进行类的方法操作。

一、为什么有包装类?

Java 是个面向对象语言,所有的操作都是基于对象。Object 类是 Java 中的对象基础,所有 Java 中的类都有个共同的始祖 Object 类,Object 类可以表示任意类型数据。但 Java 中的一些基础类型数据,并不是对象,没有对象的操作。如何让对象类型与基础联系数据联系起来,这时就需要一个过渡类型数据,称为包装类。如下面这个例子:

package test;
class Test
{
public static void main(String[] args)
{
Object obj = 1;
int i;
// i = obj; // 如何将 obj 的值赋给 i ?
}
}

有时我们不可避免的会遇到上面的问题,直接赋值肯定报类型错误了。这时我们就会想到引入另外一个数据当作纽带,这样就可以将 obj 和 i 联系起来。这个第三者通常也是个类,如 MyInterger:

package test;
public class MyInteger
{
private final int value; // 存储 int 值
public MyInteger(int value)
{
this.value = value;
}
public int getValue()
{
return this.value;
}
public String toString()
{
return String.valueOf(this.value);
}
}

当要把 obj 的值赋给 i 时,操作就变成如下方式:

package test;
class Test
{
public static void main(String[] args)
{
// 创建存储 int 的 MyInteger 实例
// 再通过 MyInteger 转换数据
MyInteger m = new MyInteger(1);
Object obj = m;
int i = ((MyInteger) obj).getValue();
System.out.printf("i=%d", i); // 输出:i=1
}
}

通过引入一个中间类,就可以将 Object 类型数据和基础类型数据建立了联系。 Java 中的基础类型没有类的操作属性,而 Java 中的操作都是基于对象。很多操作如:ArrayList、HashMap、泛型等都是针对对象的操作,为了让基础类型也具有类的特性于是就引入了包装类。 包装类是对基础类型性的包装,并丰富了基础类型的操作。

二、包装类种类

包装类是对基础数据的包装,所以种类也与基础数据类型对应,一共有8种。如下:

JAVA脱水学习-java包装类,包装类解析

除了 Integer Character 两个包装类外,其它包装类名称都是基础类型首字母大写。

三、装箱与拆箱

包装类是对基础类型数据的包装,包装类是类类型数据。从上文可知将一个基础类型数据转换成包装类类型数据需要2步。以 int 数据为例:

int i = 10;

// int 转为 Integer 类型
// 1.手动创建 Integer 类型实例:new Integer(i)
// 2.将创建的实例赋值给 I,虽然是一条语句,但实际上是两步操作。
Integer I = new Integer(i);

// Integer 转为 int 类型
// 1.调用 I 的 intValue 方法获取基础类型数据值
// 2.将基础数据类型值赋给 i2,也是两步操作。
int i2 = I.intValue();

自 JDK 1.5 版本后,Java 引入了自动装箱、拆箱操作。使基础类型数据和包装类类型数据可以直接互通使用,JVM 自动判断并进行装箱、拆箱,省去人为操作。还是以 int 为例:

int i = 10;

// 自动装箱
Integer I = i;

// 自动拆箱
int i2 = I;

其它类型数据也是同样的原理。