当前位置: 代码网 > it编程>编程语言>Java > Java重载方法匹配优先级的实现示例

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

2025年12月11日 Java 我要评论
在我们学习java的时候关于重载有个小的知识点叫方法重载匹配优先级。虽然javac编译器能确定方法的重载版本,但是在很多情况下重载的版本并不是唯一的,往往只能确定一个相对合适的版本。请看以下代码你觉得

在我们学习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重载方法匹配优先级内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com