包装类(Wrapper)

希望Java的基本数据类型具有类的特征,就针对八种基本数据类型定义了相应的引用类型—包装类(封装类),使得基本数据类型的变量具有类的特征,就可以调用类中的方法。

对应关系如下:

基本数据类型 包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
boolean Boolean
char Character

注意:包装类是类,默认值为null

一、装箱:基本数据类型→包装类

基本数据类型包装成包装类的实例,通过调用包装类的构造器实现,例如:

int i = 500; 
Integer t = new Integer(i);

关于布尔类型,只要在忽略大小写的情况下能转换为“true”的字面量均代表true,其余的代表false:

Boolean b1 = new Boolean(true);
Boolean b2 = new Boolean("TrUe");
System.out.println(b2);
Boolean b3 = new Boolean("true123");
System.out.println(b3);//false

还可以通过字符串参数构造包装类对象

Float f = new Float(“4.56);
Long l = new Long(“asdf”); //NumberFormatException

二、拆箱:包装类→基本数据类型

获得包装类对象中包装的基本类型变量,通过调用包装类Xxx的.xxxValue()方法实现,例如:

Integer in1 = new Integer(12);
int i1 = in1.intValue();
System.out.println(i1 + 1);
Float f1 = new Float(12.3);
float f2 = f1.floatValue();
System.out.println(f2 + 1);

三、JDK 1.5新特性:自动装箱与自动拆箱

JDK1.5之后,支持自动装箱与自动拆箱,但类型必须匹配。有了自动装箱与自动装箱这一特性后,包装类和基本数据类型可以看成是一种类型。

//自动装箱:基本数据类型 --->包装类
int num2 = 10;
Integer in1 = num2;//自动装箱
boolean b1 = true;
Boolean b2 = b1;//自动装箱
        
//自动拆箱:包装类--->基本数据类型
System.out.println(in1.toString());
int num3 = in1;//自动拆箱

四、基本数据类型、包装类→String类型

连接运算或调用字符串重载的valueOf()方法:

int num1 = 10;
//方式1:连接运算
String str1 = num1 + "";
//方式2:调用String的valueOf(Xxx xxx)
float f1 = 12.3f;
String str2 = String.valueOf(f1);
Double d1 = new Double(12.4);
String str3 = String.valueOf(d1);
System.out.println(str2);//"12.3"   
System.out.println(str3);//"12.4"

五、String类型→基本数据类型、包装类

通过包装类的构造器实现:

int i = new Integer(“12”);

通过包装类的parseXxx(String s)静态方法:

Float f = Float.parseFloat(“12.1);

错误的写法:

int num1 = (int)str1;
Integer in1 = (Integer)str1;

六、练习

o1和o2输出结果相同吗?为什么

不相同,o1隐藏一个自动类型转换。

Object o1 = true ? new Integer(1) : new Double(2.0);
System.out.println(o1);//1.0
Object o2;
if (true)
    o2 = new Integer(1);
else
    o2 = new Double(2.0);
System.out.println(o2);//1

Integer为了提高效率在内部定义了IntegerCache结构,IntegerCache中定义了Integer[],保存了从-128~127范围的整数。如果我们使用自动装箱的方式,给Integer赋值的范围在-128~127范围内时,可以直接使用数组中的元素,不用再去new了。

public void method1() {
    Integer i = new Integer(1);
    Integer j = new Integer(1);
    System.out.println(i == j);//false
    Integer m = 1;
    Integer n = 1;
    System.out.println(m == n);//true
    Integer x = 128;//相当于new了一个Integer对象
    Integer y = 128;//相当于new了一个Integer对象
    System.out.println(x == y);//false
}

版权声明:
作者:jackqiang
链接:http://www.jackqiang.com/javase/classes/1897/wrapper/
来源:JackQiang's
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录