zoukankan      html  css  js  c++  java
  • Java中的boxing和unboxing(转)

    测试代码:

    System.out.println(0L == 0);//true
    System.out.println(((Long)0L).equals(0));//false
    Integer i1 = 100;
    Integer i2 = 100;
    Integer i3 = 1000;//如果int values between -128 and 127,VM使用相同的对象,否则创建新的对象。
    Integer i4 = 1000;
    System.out.println(i1==i2);//true
    System.out.println(i3==i4);//false

    Autoboxing和unboxing又名拆箱和装箱,简单一点讲,就是从primitive转换到wrapper class,例如int类型到Integer类型就是装箱,而Integer类型到int类型则是拆箱。当然,这里的装箱和拆箱都是auto的,是JVM在工作的内容,事实上不用我们手写,然而也有手写的对应方式,如下所示:

    1 int i=10;
    2 Integer a=new Integer(i);//装箱的操作
    3 int j=a.intValue();//拆箱的操作

    上面是手动的,在Java5.0之后已经在JVM中有了自动的装箱和拆箱的转换,如下所示:

    1 int i=10;
    2 Integer b=i;//自动的装箱
    3 int k=b;//自动的拆箱

    装箱和拆箱就是这么简单,下面可以看一下自增是怎么一个过程,这是一个很有意思的事情,递减也是一样。

    1 Integer d=new Integer(10);
    2 d++;//这条语句使得d先拆箱,然后进行++操作,而后对结果再装箱

    上面的这条语句,使得Java保证了wrapper class也可以是正常使用通用的操作符,但这绝对不是C++中的运算符重载。你还可以试着分析三元表达式和条件表达式中的装箱拆箱过程。

    这里需要注意的一点就是装箱和拆箱在Method Overload时候的问题,例如下面:

    1 public void doSomething(double num);
    2 public void doSomething(Integer num);

    在一个类中有这么两个函数,那么对于整数int k,如果进行doSomething(k)的调用,会调用哪个呢?

    在Java1.4中,显然是调用double类型的函数,然而,现在有了自动的拆箱和装箱之后会调用哪个呢?还double类型的函数。这样可以保证以前的代码在现在新的版本中也可以正确的运行。向下兼容,Backwards compatibility,在计算机中指在一个程序或者类库更新到较新的版本后,用旧的版本程序创建的文档或系统仍能被正常操作或使用,或在旧版本的类库的基础上开发的程序仍能正常编译运行的情况。

    注意,Java5中,Method的解析是三个pass的过程:

    A.编译器会试着不用任何的boxing和unboxing,或者启用vararg(可变参数)来定位正确的method。这会找到根据Java1.4的规则而会调用的任何method。

    B.如果第一个pass失败了,编译器会再度尝试解析method,但这次会允许boxing和unboxing转换。具有vararg的method不在这次pass的考虑中。

    C.如果第二个pass也失败了,编译器会做最后一次的尝试,允许boxing和unboxing,且同时也考虑到vararg method。

  • 相关阅读:
    神经网络和深度学习之——前馈神经网络
    神经网络和深度学习之感知器工作原理
    神经网络和深度学习之神经元和感知器
    基于keras的BiLstm与CRF实现命名实体标注
    基于双向BiLstm神经网络的中文分词详解及源码
    Net Core中数据库事务隔离详解——以Dapper和Mysql为例
    利用卷积神经网络(VGG19)实现火灾分类(附tensorflow代码及训练集)
    AlexNet 网络详解及Tensorflow实现源码
    ASP.NET Core MVC I/O编程模型
    Tensorflow开发环境配置及其基本概念
  • 原文地址:https://www.cnblogs.com/yongwangzhiqian/p/3977529.html
Copyright © 2011-2022 走看看