java中的装箱拆箱是什么意思-成都快上网建站

java中的装箱拆箱是什么意思

这篇文章主要介绍“java中的装箱拆箱是什么意思”,在日常操作中,相信很多人在java中的装箱拆箱是什么意思问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java中的装箱拆箱是什么意思”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

为土默特左旗等地区用户提供了全套网页设计制作服务,及土默特左旗网站建设行业解决方案。主营业务为成都做网站、网站设计、土默特左旗网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!

通过本文能了解哪些知识?

  • 为什么基本数据类型拆箱有可能会报空指针异常?

  • 基本数据类型的装箱与拆箱操作是如何实现的?

 

自动拆箱

首先我们有如下代码:

public class Test{
    static {
        Integer integer = new Integer(1234);
        int i = integer;
    }
}
 

反编译其对应的class文件,得到如下字节码:

public class Test {
  public Test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."":()V
       4: return
    LineNumberTable:
      line 1: 0

  static {};
    Code:
       0: new           #2                  // class java/lang/Integer
       3: dup
       4: sipush        1234
       7: invokespecial #3                  // Method java/lang/Integer."":(I)V
      10: astore_0
      11: aload_0
      12: invokevirtual #4                  // Method java/lang/Integer.intValue:()I
      15: istore_1
      16: return
    LineNumberTable:
      line 3: 0
      line 4: 11
      line 5: 16
}
 

其中int i = integer对应的字节码如下:

11: aload_0
12: invokevirtual #4                  // Method java/lang/Integer.intValue:()I
15: istore_1
 

可以看出,对于int i = integer,实际上等价于以下语句:

int i = integer.intValue();
 

那么当integer等于null的时候就变为了((Integer)null).intValue()了,自然就会抛出空指针异常了;对于其他基本数据类型也是同样的原理

 

自动装箱

首先需要如下代码:

public class Test{
    static {
        int i = 1234;
        Integer integer = i;
    }
}
 

反编译其对应的class文件,得到如下字节码:

public class Test {
  public Test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."":()V
       4: return
    LineNumberTable:
      line 1: 0

  static {};
    Code:
       0: sipush        1234
       3: istore_0
       4: iload_0
       5: invokestatic  #2                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
       8: astore_1
       9: return
    LineNumberTable:
      line 3: 0
      line 4: 4
      line 5: 9
}
 

其中Integer integer = i对应的字节码如下:

4: iload_0
5: invokestatic  #2                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
8: astore_1
 

也就是对于Integer integer = i语句,实际上等价于:

Integer integer = Integer.valueOf(i);
 

而因为基本数据类型在java中不存在null值,自然对应的自动装箱操作也就没有自动装箱操作的空指针异常风险了。

结论

最后,我们得到如下结论,对于基本数据类型的自动装箱操作,实际上是使用了Integer.valueOf(int)方法,而对于基本数据类型对应的包装类型的自动拆箱操作,则是使用了Integer#intValue()方法(注意,此方法是普通方法而不是静态方法),所以当对应的Integer对象为null时对其进行自动拆箱操作就会有空指针风险;

到此,关于“java中的装箱拆箱是什么意思”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!


网页名称:java中的装箱拆箱是什么意思
网页地址:http://kswjz.com/article/ipppdi.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流