基本数据类型与其封装类的关系如下:
基本数据类型 封装类
boolean Boolean
char Character
byte Byte
short Short
int Integer
long Long
float Float
double Double
封装类中封装了一些方法,基本数据类型不可以调用封装类的方法,封装类是引用类型,但可以通过封装类给基本数据类型赋值,为什么?以int为例,来看看下面的代码:
class deal
{
static final int x=new Integer(1);
}
反编译deal.class文件
MD5 checksum 9d83d0d5115b4b6431551675b33bf7b8
Compiled from "Try.java"
class deal
minor version: 0
major version: 52
flags: ACC_SUPER
Constant pool:
#1 = Methodref #7.#17 // java/lang/Object."<init>":()V
#2 = Class #18 // java/lang/Integer
#3 = Methodref #2.#19 // java/lang/Integer."<init>":(I)V
#4 = Methodref #2.#20 // java/lang/Integer.intValue:()I
#5 = Fieldref #6.#21 // deal.x:I
#6 = Class #22 // deal
#7 = Class #23 // java/lang/Object
#8 = Utf8 x
#9 = Utf8 I
#10 = Utf8 <init>
#11 = Utf8 ()V
#12 = Utf8 Code
#13 = Utf8 LineNumberTable
#14 = Utf8 <clinit>
#15 = Utf8 SourceFile
#16 = Utf8 Try.java
#17 = NameAndType #10:#11 // "<init>":()V
#18 = Utf8 java/lang/Integer
#19 = NameAndType #10:#24 // "<init>":(I)V
#20 = NameAndType #25:#26 // intValue:()I
#21 = NameAndType #8:#9 // x:I
#22 = Utf8 deal
#23 = Utf8 java/lang/Object
#24 = Utf8 (I)V
#25 = Utf8 intValue
#26 = Utf8 ()I
{
static final int x;
descriptor: I
flags: ACC_STATIC, ACC_FINAL
deal();
descriptor: ()V
flags:
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 1: 0
//以下为编译器处理 static final int x=new Integer(1);语句的过程
static {};
descriptor: ()V
flags: ACC_STATIC
Code:
stack=3, locals=0, args_size=0
0: new #2 // class java/lang/Integer,向堆申请内存,将指针压入操作数栈
3: dup // 复制栈顶元素,即Integer的this指针
4: iconst_1 //将常量1压入栈
5: invokespecial #3 // Method java/lang/Integer."<init>":(I)V,调用Integer的构造函数,此时应该会用到this指针(this指针保存的应该是内存中对象的地址,通过该指针找到内存,将值写入到内存中)
8: invokevirtual #4 // Method java/lang/Integer.intValue:()I,调用intValue函数,传入this指针,结果压入操作数栈
11: putstatic #5 // Field x:I,将栈顶的元素赋值给x
14: return
LineNumberTable:
line 3: 0
}
我们可以看到,编译器将
static final int x=new Integer(1);
放进了静态代码块中,每句指令的作用我已经标注,最关键的是执行了intValue()方法,与String的intern方法类似,该方法作用如下:
返回Integer中的value的值,其中value为int类型,所以上述代码效果相当于
static final int x=1
之所以说是效果是因为编译器处理两者的方式不同。这种处理方式称为自动拆箱。
以上。