前言:Java语言是一个面向对象的语言,但是其中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便。为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样和八个基本数据类型对应的类统称为包装类(Wrapper Class),有些地方也翻译为外覆类或数据类型类。
一、Wrapper类概述
1.1、基本类型的包装类均位于java.lang包。之所以这么包装,是因为在Java中有些地方只能使用Object来运行。比如ArrayList类中的add(Object obj)方法中只能传入Object类,而在这里基本数据类型就可先转化为包装类,而包装类对象一经创建,其内容(所封装的基本类型数据值)不可改变。
1.2、包装类的继承关系:除了Boolean、Character类型直接继承object类,其他:Byte、Short、Integer、Long、Float、Double都是继承Object的子类Number。
1.3、基本类型和对应的包装类可以相互装换
-
由基本类型向对应的包装类转换称为自动装箱,例如把int包装成 Integer类的对象;
-
包装类向对应的基本类型转换称为自动拆箱,例如把Integer类的对象重新简化为int。
-
Java 5.0增加了自动装箱和拆箱,程序员过去需手工执行的许多包装操作,现在可以由Java自动处理了。
二、Java中的包装器类有两个主要的目的:
-
提供一种机制,将基本数值“包装”到对象中,从而使基本值能够包含在为对象而保留的操作中,比如添加到Collections 中,或者从带对象返回值的方法中返回。
-
为基本数值提供分类功能。这些功能大多数于各种转换有关:在基本数值和String对象间相互转换,在基本值和String对象之间按不同基数转换,如二进制、八进制和十六进制。
三、包装类使用(以Integer为例)
1、通用方法
①构造函数:
a.参数为基本数据值:Integer ig=new Integer(10); //int转化为Integer包装类
b.参数为字符串:Integer ig =new Integer("10"); //String转化为Integer包装类
②Integer valueOf(10)
Integer ig=Integer.valueOf(10);//返回一个指定int值的Integer对象
③Integer valueOf(String str)
Integer ig = Integer.valueOf("10");//返回一个指定String值的Integer对象
④hasCode() //返回对象的哈希表码
⑤equals() //比较两个对象是否相同
⑥int num = ig.intValue();//引用变量转化为基本类型,得到对象封装的基本数值
⑦static int parseInt(String str)
int i =ig.parseInt("10");//字符串转化为基本数据类型
⑧int parseInt("10");
int i =ig.parseaInt("10");//字符串转化为基本数据类型
⑨toString(); //将包装类转化为字符串
2、将整数num转化成二进制、八进制或十六进制形式的字符串的类方法
static String toBinaryString(int num); //十进制转化为二进制,并保存为String
static String toHexString(int num) ; //十进制转化为十六进制,并保存为String
static String toOctalString(int num) ; //十进制转化为八进制,并保存为String
四、自动拆箱和自动装箱
2004年9月30日,J2SE1.5发布,成为Java语言发展史上的又一里程碑。为了表示该版本的重要性,J2SE 1.5更名为Java SE 5.0(内部版本号1.5.0),代号为“Tiger”,Tiger包含了从1996年发布1.0版本以来的最重大的更新,其中包括泛型支持、基本类型的自动装箱、改进的循环、枚举类型、格式化I/O及可变参数。
自动装箱:是将一个Java定义的基本数据类型赋值给相应封装类的变量。
自动拆箱:与自动装箱是相反的操作,自动拆箱则是将一个封装类的变量赋值给相应基本数据类型的变量。
在jdk 1.5之前,如果你想要定义一个value为100的Integer对象,则需要如下定义:
Integer i=new Integer (100);
但有了自动拆装箱之后就可以直接把基本类型赋值给Integer对象。(自动封箱和自动拆箱是Java自动帮我们完成的)
int intNum1=100;//普通常量
Integer intNum2=intNum1;//自动装箱
int intNum3=intNum2;//自动拆箱
应用场景:
(1)赋值过程
(2)函数参数
public static int subFun(Integer num)
{
return num;
}
调用此函数就会发生自动拆箱
public static Integer subFun(int num)
{
return num;
}
(3)集合操作
集合只能接收对象,但我们传入普通数据类型也是可以的,它内部就完成了自动装箱。
参考链接:自动装/拆箱