Java重载方法匹配优先级的实现示例

 更新时间:2025年12月11日 09:53:26   作者:Java劝退师、  
本文通过一个示例详细阐述了Java中方法重载的匹配优先级,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在我们学习Java的时候关于重载有个小的知识点叫方法重载匹配优先级。虽然javac编译器能确定方法的重载版本,但是在很多情况下重载的版本并不是唯一的,往往只能确定一个相对合适的版本。请看以下代码你觉得输出的内容是什么呢?(可以先不要翻到代码结束后的答案尝试猜测)

package cn.laoniu;

import java.io.Serializable;

public class Reload {

	public void sayType(Character arg) {
		System.out.println("Character");
	}

	public void sayType(long arg) {
		System.out.println("long");
	}

	public void sayType(char arg) {
		System.out.println("char");
	}

	public void sayType(char... arg) {
		System.out.println("char...");
	}

	public void sayType(Serializable arg) {
		System.out.println("Serializable");
	}

	public void sayType(int arg) {
		System.out.println("int");
	}

	public void sayType(Object arg) {
		System.out.println("Object");
	}

	public static void main(String[] args) {
		new Reload().sayType('a');
	}

}

上面代码的运行后输出结果为:

char

这很好理解,'a'是一个char类型的数据,自然会寻找参数类型为char的重载方法,如果注释掉sayType(char arg)方法,那么输出结果会变为:

int

这时发生了一次自动类型转换,'a'除了可以代表一个字符串,还可以代表数字97(字符'a'的Unicode数值为十进制数字97),因此参数类型为int的重载也是合适的。我们继续注释掉sayType(int arg)方法,那么输出的结果会变为:

long

这时发生了两次类型转换,'a'转型为整数97之后,进一步转型为长整数97L,匹配参数类型为long的重载。虽然上面代码中没有加入其他类型如float、double等的重载,在实际上自动转型还能继续发生多次,按照char>int>long>float>double的顺序进行匹配,但是不会匹配到byte和short类型的重载,因为char到byte和short的转型是不安全的。我们继续注释掉sayType(long arg)方法,那么输出的结果变为:

Character

这时发生了一次自动装箱,'a'被包装为它的封装类型java.lang.Character,所以匹配到了参数类型为Character的重载,继续注释掉sayType(Character arg)方法,那么输出的结果会变为:

Serializable

这个输出可能会让人感到疑惑,一个字符或数字与序列化有什么关系呢?出现Serializable是因为java.lang.Serializable是java.lang.Character类实现的一个接口,当自动装箱之后发现还是找不到装箱类,但是找到了装箱类所实现的接口类型,所以紧接着又发生了一次自动转型。char可以转型为int,但是Character是绝对不会转型为Integer的,它只能安全地转型为它实现的借口或者父类。Character还实现了另外一个接口java.lang.Compara<Character>,如果同时出现两个参数分别是Serializable和Compara<Character>的重载方法,那它们在此时的优先级是一样的。编译器无法确定要自动转型为哪种类型,会提示“类型模糊”(Type Ambiguous),并拒绝编译。让我们继续注释掉sayType(Serializable arg)方法,输出结果会变为:

Object

这时是char装箱后转型为父类了,如果有多个父类,那么继承关系从下往上搜索,越往上层优先级越低。即便方法调用传入参数值null时,这个规则仍然适用。继续把sayType(Object arg)方法注释掉,结果会变为:

char...

此时就剩下这一个方法了,可见变长参数的重载优先级是最低的。

补充

上面例子演示了Java重载方法优先匹配级别,这也属于java编译期间选择静态分配目标。这个例子是很极端的例子,除了作为面试题来为难应聘者之外在实际工作中几乎不存在任何价值

到此这篇关于Java重载方法匹配优先级的实现那示例的文章就介绍到这了,更多相关Java重载方法匹配优先级内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Spring Cloud Zuul重试机制探秘

    详解Spring Cloud Zuul重试机制探秘

    本篇文章主要介绍了详解Spring Cloud Zuul重试机制探秘,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • java8 stream 如何打印数据元素

    java8 stream 如何打印数据元素

    这篇文章主要介绍了java8 stream 如何打印数据元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Swagger2不被SpringSecurity框架拦截的配置及说明

    Swagger2不被SpringSecurity框架拦截的配置及说明

    这篇文章主要介绍了Swagger2不被SpringSecurity框架拦截的配置及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • springboot log4j2.xml如何读取application.yml中属性值

    springboot log4j2.xml如何读取application.yml中属性值

    这篇文章主要介绍了springboot log4j2.xml如何读取application.yml中属性值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java编程一维数组转换成二维数组实例代码

    Java编程一维数组转换成二维数组实例代码

    这篇文章主要介绍了Java编程一维数组转换成二维数组,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Java中JDK动态代理的超详细讲解

    Java中JDK动态代理的超详细讲解

    JDK 的动态代理是基于拦截器和反射来实现的,JDK代理是不需要第三方库支持的,只需要JDK环境就可以进行代理,下面这篇文章主要给大家介绍了关于Java中JDK动态代理的超详细讲解,需要的朋友可以参考下
    2022-10-10
  • SpringBoot项目里集成Hibernate的示例

    SpringBoot项目里集成Hibernate的示例

    在Spring Boot项目中,集成Hibernate可以帮助我们更轻松地进行数据库操作,本文将介绍如何在Spring Boot项目中集成Hibernate,并提供相应的示例,感兴趣的朋友跟随小编一起看看吧
    2023-04-04
  • SpringBoot中Fat Jar的三种打包方式详解

    SpringBoot中Fat Jar的三种打包方式详解

    Spring Boot开发中,打包是将应用及其所有依赖整合到一个可执行文件中的过程,这种包含所有依赖的jar文件通常被称为"Fat Jar",下面我们来看看SpringBoot打包Fat Jar的三种方式吧
    2025-06-06
  • java高并发的用户线程和守护线程详解

    java高并发的用户线程和守护线程详解

    本篇文章主要介绍了浅谈java中守护线程与用户线程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-10-10
  • SpringBoot 图书管理系统(删除、强制登录、更新图书)详细代码

    SpringBoot 图书管理系统(删除、强制登录、更新图书)详细代码

    在企业开发中,通常不采用delete语句进行物理删除,而是使用逻辑删除,逻辑删除通过修改标识字段来表示数据已被删除,方便数据恢复,本文给大家介绍SpringBoot 图书管理系统实例代码,感兴趣的朋友跟随小编一起看看吧
    2024-09-09

最新评论