JAVA的LIST接口的REMOVE重载方法调用原理解析

作者:cartoony 时间:2021-07-20 16:35:27 

前言

说真的,平常看源码都是自己看完自己懂,很少有写出来的冲动。

但是在写算法的时候,经常用到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。

来源:https://www.cnblogs.com/cartooon/p/11645033.html

标签:java,list,接口,remove,重载,调用
0
投稿

猜你喜欢

  • struts2中使用注解配置Action方法详解

    2023-08-30 00:01:25
  • 十分钟速懂java知识点 System类

    2022-11-25 04:19:26
  • Android自定义控件实现支付宝记账饼图

    2022-04-19 13:27:02
  • 老生常谈设计模式之动态代理

    2021-06-12 06:15:50
  • Android用Canvas绘制贝塞尔曲线

    2022-11-22 00:23:11
  • Android应用程序(APK)的编译打包过程

    2021-10-29 14:37:07
  • Entity Framework配置关系

    2023-10-15 09:45:30
  • Android实现SQLite添加、更新及删除行的方法

    2022-03-29 05:23:45
  • Android实现退出时关闭所有Activity的方法

    2021-10-03 00:15:00
  • 基于Java8 函数式接口理解及测试

    2021-06-19 21:54:35
  • IDEA导出jar打包成exe应用程序的小结

    2023-06-22 04:02:46
  • IDEA的默认快捷键设置与Eclipse的常用快捷键的设置方法

    2023-04-09 18:32:40
  • Spring-data-redis操作redis cluster的示例代码

    2022-12-17 17:04:00
  • 深入解析Java的Spring框架中bean的依赖注入

    2023-12-20 18:50:52
  • Unity实现汽车前后轮倒车轨迹计算

    2022-12-18 17:49:47
  • c#创建windows服务(Windows Services)详细步骤

    2023-06-11 19:05:22
  • C#中怎么将一个List转换为只读的

    2021-10-04 15:52:51
  • C#使用 NAudio 实现音频可视化的方法

    2022-10-07 09:31:58
  • Java实现文本编译器

    2022-10-21 18:33:20
  • C#多线程编程Task用法详解

    2021-10-27 14:26:10
  • asp之家 软件编程 m.aspxhome.com