java中本着一切皆对象的原则,Java为每种基本数据类型都提供了对应的包装器类型。
装箱:将基本类型用他们对应的引用类型包装起来。拆箱:将包装类型转为基本数据类型。
java提供了自动拆箱和自动装箱。下面我们通过代码来看下二者在java中的实现。
看如下代码:
public class App
{
public static void main(String[] args) {
Integer aInteger=3;
int b=new Integer(5);
}
}
这段代码就两行。从这里我们能直观地看到自动拆箱和自动装箱。但是为什么一个数值可以赋值给一个对象,而一个对象又为什么能直接赋值给一个数值类型。
我们通过cmd来到该class文件的当前路径,执行。javap -help 看下java为我们提供的帮助指令:
C:\Users\Administrator>javap -help
用法: javap <options> <classes>
其中, 可能的选项包括:
-help --help -? 输出此用法消息
-version 版本信息
-v -verbose 输出附加信息
-l 输出行号和本地变量表
-public 仅显示公共类和成员
-protected 显示受保护的/公共类和成员
-package 显示程序包/受保护的/公共类
和成员 (默认)
-p -private 显示所有类和成员
-c 对代码进行反汇编
-s 输出内部类型签名
-sysinfo 显示正在处理的类的
系统信息 (路径, 大小, 日期, MD5 散列)
-constants 显示最终常量
-classpath <path> 指定查找用户类文件的位置
-cp <path> 指定查找用户类文件的位置
-bootclasspath <path> 覆盖引导类文件的位置
我们选择 -c 选项,对代码进行反汇编。
执行 javap -c App,结果如下:
public class com.jin.rpc_client.App {
public com.jin.rpc_client.App();
Code:
0: aload_0
1: invokespecial #8 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_3
//调用Integer的静态方法valueOf
1: invokestatic #15 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
4: astore_1
5: new #16 // class java/lang/Integer
8: dup
9: iconst_5
10: invokespecial #21 // Method java/lang/Integer."<init>":(I)V
//调用Integer的静态方法intValue
13: invokevirtual #24 // Method java/lang/Integer.intValue:()I
16: istore_2
17: return
}
现在我们知道了,原来自动装箱和自动拆箱,就是java在编译时自动将我们的代码编译成了去调用相应的静态方法。