Java基本数据类型与其封装类问题

基本数据类型与其封装类的关系如下:

      基本数据类型           封装类   
         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
之所以说是效果是因为编译器处理两者的方式不同。这种处理方式称为自动拆箱。

以上。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值