七星彩论坛:cartoony

本文地址:http://www.ib765.com/cartooon/p/11645033.html
文章摘要:七星彩论坛,机会女神国际皇家彩票开奖、正大国际重庆幸运农场开奖号历史、澳门天际亚洲这把在世界上有大炮之称毕竟。

My Links

Blog Stats

七星彩论坛: JAVA的List接口的remove重载方法调用原理

前言

说真的,平常看源码都是自己看完自己懂,很少有写出来的冲动。
但是在写算法的时候,经常用到java中各种集合,其中也比较常用到remove方法。
remove有重载函数,分别传入参数是索引index或者数据Object(指定泛型后自动转换),如果指定泛型是其他数据类型还好,但是指定的是Integer或者是int的话,或者就有点懵了。
这曾经也困惑过我,七星彩论坛:所以我就唯有用实践解惑了。

测试类设计

  • 测试类一
public class Text {

    public void remove(int index){
        System.out.println("调用传参为int的remove方法");
    }

    public void remove(Integer object){
        System.out.println("调用传参为Integer的remove方法");
    }

    public void remove(Object object){
        System.out.println("调用传参为Object的remove方法");
    }
}
  • 测试类二
public class Text {
    
    public void remove(Integer object){
        System.out.println("调用传参为Integer的remove方法");
    }

    public void remove(Object object){
        System.out.println("调用传参为Object的remove方法");
    }
}
  • 测试类三
public class Text {

    public void remove(Object object){
        System.out.println("调用传参为Object的remove方法");
    }
}

结果

三个测试类分别传入int,Integer,Object型变量,观察效果。

  • 测试类一

    传入类型为int:调用传参为int的remove方法
    传入类型为Integer:调用传参为Integer的remove方法
    传入类型为Object:调用传参为Object的remove方法

  • 测试类二

    传入类型为int:调用传参为Integer的remove方法
    传入类型为Integer:调用传参为Integer的remove方法
    传入类型为Object:调用传参为Object的remove方法

  • 测试类三

    传入类型为int:调用传参为Object的remove方法
    传入类型为Integer:调用传参为Object的remove方法
    传入类型为Object:调用传参为Object的remove方法

从输出结果可以看出,当方法的传参的类层级逐渐变高时,层级较低的传参会进行向上转型适应传参的需要。

原因分析

下面我们先反编译各测试类的源码,结果如下

  • 测试类一

    invokevirtual #11 // Method remove:(I)V

    invokevirtual #15 // Method remove:(Ljava/lang/Integer;)V

    invokevirtual #18 // Method remove:(Ljava/lang/Object;)V

  • 测试类二

    invokevirtual #11 // Method remove:(Ljava/lang/Integer;)V

    invokevirtual #11 // Method remove:(Ljava/lang/Integer;)V

    invokevirtual #17 // Method remove:(Ljava/lang/Object;)V

  • 测试类三

    invokevirtual #10 // Method remove:(Ljava/lang/Object;)V

    invokevirtual #10 // Method remove:(Ljava/lang/Object;)V

    invokevirtual #10 // Method remove:(Ljava/lang/Object;)V

可以看出,反编译代码中都是调用实例方法的命令,所以结果中自动"向上转型"其实是jvm的功劳。jvm通过在编译时确定调用的传参类型,静态分派到具体方法的。
所以在前言中的困惑已经解除了,就是由于jvm中静态分派的实现,调用次序是int->Integer->Object。

后记

也没什么想说的,感觉在阅读源码的时候必须多想想为什么这样做,为什么要这样实现,同时通过断点或者反编译的手段找出自己的答案。keep going!

本文首发于cartoon的博客
转载请注明出处:http://www.vth.77w55.com/cartoon-blog/post/java/java的list接口的remove重载方法调用原理/

posted on 2019-10-09 23:11 cartoony 阅读(...) 评论(...) 编辑 收藏

www.77msc.com现金网 十六浦索菲特自助午餐登入 亚洲国际BBIN波音馆时时彩计划软件 大都会棋牌现金开户 双赢彩票网手机下载
亚洲国际吉林快3时时彩计划软件 天天江西时时彩助赢软件 威斯汀VR快艇时时彩网址 亚洲国际广西快乐十分开奖记录 澳洲国际VR六合彩计划群大全
申博太阳城登入登入 葡京江西时时彩计划群大全 杏彩娱乐平台客户端官方网 神话江西时时彩官方网 澳洲国际安徽快3时时彩软件
北京赛车pk10网上投注登入 tt江苏快三时时彩软件 申博现金游戏 金冠幸运28开奖直播 欧博娱乐场