概述
一.什么是装箱?什么是拆箱?
Java为每种基本数据类型都提供了对应的包装器类型,至于为什么会为每种基本数据类型提供包装器类型在此不进行阐述,有兴趣的朋友可以查阅相关资料。在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行:
1 |
|
而在从Java SE5开始就提供了自动装箱的特性,如果要生成一个数值为10的Integer对象,只需要这样就可以了:
1 |
|
这个过程中会自动根据数值创建对应的 Integer对象,这就是装箱。
那什么是拆箱呢?顾名思义,跟装箱对应,就是自动将包装器类型转换为基本数据类型:
1 2 |
|
简单一点说,装箱就是 自动将基本数据类型转换为包装器类型;拆箱就是 自动将包装器类型转换为基本数据类型。
下表是基本数据类型对应的包装器类型:
int(4字节) | Integer |
byte(1字节) | Byte |
short(2字节) | Short |
long(8字节) | Long |
float(4字节) | Float |
double(8字节) | Double |
char(2字节) | Character |
boolean(未定) | Boolean |
二.装箱和拆箱是如何实现的
以下面代码为例:
/**
* Created by DELL on 2018/8/21.
*/
public class Demo
{
public static void main(String[] args)
{
Integer i1=10;
int i2=10;
Integer i3=new Integer(10);
Integer i4=i2;
System.out.println(i1==i2);
System.out.println(i3);
}
}
从反编译的class类中查看:(编译工具 jd-gui )
import java.io.PrintStream;
public class Demo
{
public static void main(String[] args)
{
Integer i1 = Integer.valueOf(10);
int i2 = 10;
Integer i3 = new Integer(10);
Integer i4 = Integer.valueOf(i2);
System.out.println(i1.intValue() == i2);
System.out.println(i3);
}
}
在程序自动调用了Integer.valueOf()和 i1.intValue()这两个方法
利用javap -v 命令查看运行的class文件的字节文件,如下:
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=3, locals=5, args_size=1
0: bipush 10
2: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
5: astore_1
6: bipush 10
8: istore_2
9: new #3 // class java/lang/Integer
12: dup
13: bipush 10
15: invokespecial #4 // Method java/lang/Integer."<init>":(I)V
18: astore_3
19: iload_2
20: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
23: astore 4
25: getstatic #5 // Field java/lang/System.out:Ljava/io/PrintStream;
28: aload_1
29: invokevirtual #6 // Method java/lang/Integer.intValue:()I
32: iload_2
33: if_icmpne 40
36: iconst_1
37: goto 41
40: iconst_0
41: invokevirtual #7 // Method java/io/PrintStream.println:(Z)V
44: getstatic #5 // Field java/lang/System.out:Ljava/io/PrintStream;
47: aload_3
48: invokevirtual #8 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
51: return
从这个文件中同样也可以看到的java运行过程中自动装箱和拆箱是调用了java中的两个方法实现的
本文参照:
http://www.cnblogs.com/dolphin0520/
最后
以上就是真实日记本为你收集整理的java 自动装箱,拆箱原理一.什么是装箱?什么是拆箱?二.装箱和拆箱是如何实现的的全部内容,希望文章能够帮你解决java 自动装箱,拆箱原理一.什么是装箱?什么是拆箱?二.装箱和拆箱是如何实现的所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复