JAVA的List接口的remove重载方法调用原理是什么

这篇文章主要讲解了“JAVA的List接口的remove重载方法调用原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“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。

感谢各位的阅读,以上就是“JAVA的List接口的remove重载方法调用原理是什么”的内容了,经过本文的学习后,相信大家对JAVA的List接口的remove重载方法调用原理是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!


网页名称:JAVA的List接口的remove重载方法调用原理是什么
文章转载:http://csdahua.cn/article/ippspi.html
扫二维码与项目经理沟通

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

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