前言:
- 首先我们要知道Java中有哪些基本数据类型以及它们各自的封装类:package java.lang;
基本数据类型 | 封装类 |
---|---|
byte | Byte |
boolean | Boolean |
char | Character |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
一、什么是Autoboxing
java中Autoboxing是指将基本数据类型自动转换成封装类类型。比如说:
1 | public void test1() |
- 函数参数为封装类类型时,调用时传递基本数据类型,会发生Autoboxing。
- 将基本数据类型变量赋值给封装类类型时,会发生Autoboxing。
二、什么是Autounboxing
java中Autounboxing是指将封装类类型自动转换成基本数据类型。比如说:
1 | public void test2() |
- 函数参数为基本数据类型,调用时传递封装类类型,会发生Autounboxing。
- 将封装类类型变量赋值给基本数据类型,或者直接用封装类类型进行基本运算,会发生Autounboxing。
三、以int类型为例,讲解Autoboxing和Autounboxing实现原理
先来看一段代码反汇编的结果
- java代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19package com.sh.$16.$12.$22;
/**
* Created by Mr SJL on 2016/12/22.
*
* @Author Junlan Shuai
*/
import java.util.ArrayList;
import java.util.List;
public class App1
{
public static void main(String[] args)
{
Integer integer = 10;
int i = integer;
}
} - 反汇编结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public class com.sh.$16.$12.$22.App1 {
public com.sh.$16.$12.$22.App1();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: bipush 10
2: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
5: astore_1
6: aload_1
7: invokevirtual #3 // Method java/lang/Integer.intValue:()I
10: istore_2
11: return
}
从以上java代码可以看出,“Integer integer = 10;”此句发生了Autoboxing。
从汇编结果可以看出,实际在编译的时候发生了,Integer a = Integer.valueOf(10);调用了Integer类的valueOf方法。
1 | /** |
从以上java代码可以看出,“int i = integer;”此句发生了Autounboxing。
从汇编结果可以看出,实际在编译的时候发生了,int i = integer.intValue();调用了Integer类的intValue方法。
1 | /** |
四、总结
其他基本数据类型的Autoboxing and Autounboxing也满足此。
思考:
1 | package com.sh.$16.$12.$24; |