文章目录
1. 引入
在图形化理解Java中的形参和实参中,我们知道Java中八大基本数据类型,同样也知道了它们各自的取值范围和默认的初始值。那么,既然已经有基本数据类型使用,为什么还要使用包装类呢?Java是一门面向对象的编程语言,而基本数据类型并不具备面向对象的特点,因此包装类的引入是为了让基本类型具有对象的特点;另一方面包装类也方便了泛型的使用。
例如:如果希望向ArrayList当中存储基本数据类型,必须使用基本数据类型对应的包装类:
| 基本数据类型 | 默认值 | 包装类 | 默认值 |
|---|---|---|---|
| byte | 0 | Byte | null |
| short | 0 | Short | null |
| int | 0 | Integer | null |
| long | 0 | Long | null |
| float | 0.0 | Float | null |
| double | 0.0 | Double | null |
| char | 空 | Character | null |
| boolean | false | Boolean | null |
例如,Integer在ArrayList中的使用如下所示:
public class Test{
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(10);
list.add(20);
System.out.println(list);
for(Integer ele : list) {
System.out.println(ele);
}
}
}
2. 装箱和拆箱
装箱和拆箱表示的是 基本数据类型和包装类型之间的相互转换。其中:
-
装箱:指基本类型到包装类型的转换
-
构造方法,以Integer为例,主要有如下两个构造方法:
Integer(int value):构造新的Integer对象用于表示指定的int值,已过时Integer(String s):构造新的Integer对象用于表示指定的同String表示int值,已过时
-
静态方法:
static Integer valueOf(int i)static Integer valueOf(String s)
-
-
拆箱:指包装类型到基本数据类型的转换
int intValue()- 其他类型原理类似
public class Test{
public static void main(String[] args) {
// 构造方法
Integer i = new Integer(24);
System.out.println(i); // 24
Integer i1 = new Integer("24");
System.out.println(i1); // 24
// 静态方法
Integer i2 = Integer.valueOf(24);
Integer i3 = Integer.valueOf("24");
System.out.println(i2); // 24
System.out.println(i3); // 24
// 拆箱
int number= i.intValue();
System.out.println(number); // 24
}
}
基本数据类型和包装类之间的自动转换就称为自动装箱和自动拆箱:
-
自动装箱:
基本类型 -> 包装类型public class Test { public static void main(String[] args) { // 自动装箱 int number = 8; Integer x = new Integer(number); System.out.println(x); // 8 System.out.println(x.getClass()); // class java.lang.Integer } }如上所示,我们首先定义一个int型的变量并赋值8,然后new一个Integer对象并将number传入。通过输出可以看出:x的值和number的值相等,并且此时x的类就是int对应的包装类Integer。其他基本类型数据到对应包装类的转换同理,都可以通过自动装箱实现。
-
自动拆箱:
包装类型 -> 基本类型public class Test { public static void main(String[] args) { // 自动拆箱 Integer y = new Integer(24); System.out.println(y); System.out.println(y.getClass()); int n = y; System.out.println(n); } }自动拆箱流程和上面的自动装箱相逆,即将包装类转换为对应的基本数据类型。
以Integer为例,自动装箱机制是调用了Integer的
valueOf()实现:public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }而自动拆箱调用
intValue()方法实现:public int intValue() { return value; }
3. 基本数据类型和包装类的区别:
- 基本类型不能使用new关键字来创建,而包装类作为类处理,那么包装类型必须使用new关键字来创建
- 存储的位置不同,基本类型存储在栈区,包装类型存储在堆区
- 初始值不同。基本类型中的int初始值为0,boolean初始值为false;包装类型初始值都为null
因此在进行自动装拆箱时一定要避免空指针异常
- 使用场景不同,基本类型主要用于计算和赋值,包装类型用于泛型
- 基本类型是值传递,包装类型是引用传递