博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于Java重载方法匹配优先级
阅读量:6841 次
发布时间:2019-06-26

本文共 1744 字,大约阅读时间需要 5 分钟。

hot3.png

写出以下程序的输出:
public class Overload {	// Object 参数	public static void say(Object arg) {		System.out.println("hello object");	}	// int 参数	public static void say(int arg) {		System.out.println("hello int");	}	// long 参数 	public static void say(long arg) {		System.out.println("hello long");	}	// char 参数	public static void say(char arg) {		System.out.println("hello char");	}		// Character 参数	public static void say(Character arg) {		System.out.println("hello character");	}	// 变长参数	public static void say(char... arg) {		System.out.println("hello char...");	}		// Serializable 参数	public static void say(Serializable arg) {		System.out.println("hello serializable");	}	public static void main(String[] args) {               say('a');	}}

这条题目考的是重载方法匹配的优先级,那么它的匹配优先级是怎样的呢?

如果直接运行的话,毫无疑问,输出为: hello char

如果将char参数的函数注释之后,会输出什么呢?

答案是:hello int 

因为这期间,字符a发生了一次自动转型,它除了能够表示字符a外,还能表示数字65,于是重载方法匹配了int参数的重载方法。

现在我们再将这个方法注释了,输出的结果大家应该知道是什么了吧?

那就是:hello long

原因就是int自动转型为long。其实还可以转化为float和double的,但不能转化为byte和short,因为char到这两个类型的转化是不安全的,这几个类型的转化优先级为:char->int->long->float->double

好,我们再继续注释掉这个函数,然后输出是什么呢?

答案:hello character

为什么?大家应该知道Java里面为每种基本数据类型都提供一种封装类型吧?char对应的就是Character,所以调用函数期间,当找不到基本类型转化的匹配之后,char就会发生一次自动装箱,变成了Character类型

根本停不下来啊,再继续注释了它,看下输出。

输出:hello serializable

这什么东西嘛。。。怎么会输出这个家伙啊。。。。原来是因为Character实现了Serializable接口,当它找不到匹配的类型之后,就会找它所实现的接口。但是,如果我们再增加一个重载函数:

1 public static void say(Comparable arg) {
2        System.out.println("hello Comparable");
3 }
那么就会报错了, 
因为Character实现了Serializable和Comparable这两个接口,而接口匹配的优先级是一样的,编译器无法判断转型为哪种类型,提示类型模糊,拒绝编译

好,继续注释掉Serializable参数的函数,看输出:hello object

接口找不到匹配之后,就会开始找匹配的父类,优先级是顺着继承链,由下往上进行匹配。

最后,连这个函数也注释了的话,大家应该知道输出的是什么了吧?

当然就是:hello char...

由此可见,变长参数的优先级是最低的。

转载于:https://my.oschina.net/yao00jun/blog/223738

你可能感兴趣的文章