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 AI核心接口,轻松对接所有大模型

    一文带你搞懂Spring AI核心接口,轻松对接所有大模型

    Spring AI简单说就是 Spring 官方为 Java 开发者打造的 AI 应用开发框架,本文将从顶层 ChatClient 到底层 Model,逐层拆解 Spring AI 的核心接口设计,帮你彻底理清这套万能转接头的工作原理
    2026-05-05
  • springboot集成mybatis plus和dynamic-datasource注意事项说明

    springboot集成mybatis plus和dynamic-datasource注意事项说明

    这篇文章主要介绍了springboot集成mybatis plus和dynamic-datasource注意事项说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • SpringMVC Restful api接口实现的代码

    SpringMVC Restful api接口实现的代码

    本篇文章主要介绍了SpringMVC Restful api接口实现的代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • 一小时迅速入门Mybatis之增删查改篇

    一小时迅速入门Mybatis之增删查改篇

    这篇文章主要介绍了迅速入门Mybatis之增删查改篇,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • JAVA控制流程break continue的示例代码

    JAVA控制流程break continue的示例代码

    JAVA流程控制中有相关代码可以终止整个流程的进程,他们就是(break和continue),本文通过实例代码介绍下JAVA控制流程break continue的相关知识,感兴趣的朋友一起看看吧
    2022-03-03
  • Java volatile的适用场景实例详解

    Java volatile的适用场景实例详解

    在本文里我们给大家整理了一篇关于Java volatile的适用场景实例内容和知识点,需要的朋友们可以学习下。
    2019-08-08
  • 从零开始:快速入门SpringBoot注解的精髓

    从零开始:快速入门SpringBoot注解的精髓

    Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架,它通过使用注解来简化配置和开发过程,使开发人员能够更加专注于业务逻辑的实现,Spring Boot提供了许多注解,用于定义和配置应用程序的各个方面,需要的朋友可以参考下
    2023-10-10
  • 图文讲解IDEA中根据数据库自动生成实体类

    图文讲解IDEA中根据数据库自动生成实体类

    这篇文章主要以图文讲解IDEA中根据数据库自动生成实体类,本文主要以Mysql数据库为例,应该会对大家有所帮助,如果有错误的地方,还望指正
    2023-03-03
  • 深入理解Spring的事务传播行为

    深入理解Spring的事务传播行为

    spring特有的事务传播行为,spring支持7种事务传播行为,确定客户端和被调用端的事务边界(说得通俗一点就是多个具有事务控制的service的相互调用时所形成的复杂的事务边界控制),这篇文章主要给大家介绍了关于Spring事务传播行为的相关资料,需要的朋友可以参考下。
    2018-02-02
  • 关于SpringBoot创建存储令牌的媒介类和过滤器的问题

    关于SpringBoot创建存储令牌的媒介类和过滤器的问题

    这篇文章主要介绍了SpringBoot创建存储令牌的媒介类和过滤器的问题,需要在配置文件中,添加JWT需要的密匙,过期时间和缓存过期时间,具体实例代码参考下本文
    2021-09-09

最新评论