这篇文章给大家分享的是有关JAVA中如何调用LIST接口的REMOVE重载方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
测试类设计
测试类一
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重载方法”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。