Wrapper概念
Java是一个面向对象的编程语言,但是Java中的八种基本数据类型却是不面向对象的,为了使用方便和解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八种基本数据类型对应的类统称为包装类(Wrapper Class),包装类均位于java.lang包。
各数据类型对应的包装类
这里除了int (包装类为Integer)和char(包装类为Character)外,其他数据类型的包装类型都是自己的首字母大写,所有记忆起来会比较容易。
基本类型和引用类型的区别有以下几点:
- 基本类型不是对象,而引用类型是对象.
- 声明方式:基本数据类型直接声明,引用数据类型需要用new关键字创建.
- 存储的位置:基本数据类型存储在堆栈中,引用类型则通过引用指向实例,具体的实例保存在堆中.
- 基本数据类型的初始值依据其类型而定,引用数据类型初始值为null.
包装类的主要用途:
- 集合和泛型只能存放引用类型的数据, 不能存放基本数据类型
- 基本类型和包装类型之间可以互相转换,自动装箱拆箱
- 包装类的parse方法可以实现基本数据类型+string类型之间的相互转换
- 函数需要传递进去的参数为Object类型,传入基本数据类型就不可行
将基本类型转换为包装对象
我们还可以使用valueOf()方法将原始类型转换为相应的对象。
示例1:包装对象的原始类型
示例
class Main {public static void main(String[] args) {//创建原始类型int a = 5;double b = 5.65;//转换为包装对象Integer aObj = Integer.valueOf(a);Double bObj = Double.valueOf(b);if(aObj instanceof Integer) {System.out.println("创建一个Integer对象。");}if(bObj instanceof Double) {System.out.println("创建一个Double对象。");}}
}
输出结果
创建一个Integer对象。 创建一个Double对象。
在上面的示例中,我们使用了valueOf()将原始类型转换为对象的方法。
在这里,我们使用instanceof运算符来检查生成的对象是否属于Integer或Double类型。
但是,Java编译器可以直接将原始类型转换为相应的对象。例如:
int a = 5; //转换为对象 Integer aObj = a;double b = 5.6; //转换为对象 Double bObj = b;
此过程称为自动装箱。要了解更多信息,请访问Java装箱拆箱机制。
注意:我们还可以使用包装类(Wrapper)构造函数将原始类型转换为包装对象。但是在Java 9之后,不再使用构造函数。
包装对象成原始类型
要将对象转换为原始类型,我们可以使用每个包装类中对应的值方法(intValue()、doubleValue()等)。
示例2:将包装对象转换为原始类型
示例
class Main {public static void main(String[] args) {//创建包装类的对象Integer aObj = Integer.valueOf(23);Double bObj = Double.valueOf(5.55);//转换为原始类型int a = aObj.intValue();double b = bObj.doubleValue();System.out.println("a的值: " + a);System.out.println("b的值: " + b);}
}
输出结果
a的值: 23 b的值: 5.55
在上面的示例中,我们使用了intValue() 和 doubleValue()方法将Integerand和Double对象转换为相应的原始基本类型。
但是,Java编译器可以自动将对象转换为相应的原始类型。例如,
Integer aObj = Integer.valueOf(2); //转换为int类型 int a = aObj;Double bObj = Double.valueOf(5.55); //转换为double类型 double b = bObj;
此过程称为拆箱。要了解更多信息,请访问Java装箱拆箱机制。
包装类的优点
-
在Java中,有时我们可能需要使用对象而不是原始数据类型。例如,在使用集合时。
// 错误 ArrayList<int> list = new ArrayList<>();//正常运行 ArrayList<Integer> list = new ArrayList<>();
在这种情况下,包装器类可以帮助我们将原始数据类型用作对象。
-
我们可以将空值存储在包装对象中。例如,
//将生成一个错误 int a = null;// 正常运行 Integer a = null;
注意:基本类型比相应的对象更有效。因此,当需要效率时,总是建议使用原始类型。