Java方法重载“最具体方法选择规则”原理及空值传参调用疑问
为什么传入null时Java方法重载会选择String参数的方法?
这问题问得特别好,很多刚摸Java重载的同学都会在这里卡壳,咱们来把这个逻辑掰扯清楚~
先把你的代码贴出来方便对照:
class Test { public void show(String s) { System.out.println("hi"); } public void show(Object o) { System.out.println("hello"); } public static void main(String s[]) { Test t = new Test(); t.show(null); } }
你看到输出是"hi",核心原因在于Java处理重载方法匹配时的**「最具体类型优先」规则**:
- 首先,
null可以匹配任何引用类型的参数(毕竟null是所有引用类型的默认值),所以你的两个show方法其实都符合调用条件; - 但这里
String是Object的子类,换句话说,String是比Object更「具体」的类型——任何能被String接收的参数,一定能被Object接收,但反过来肯定不行; - 编译器在多个匹配的重载方法里,会自动挑那个参数类型最具体的来执行,所以就选中了
show(String s),输出"hi"。
举个反例帮你加深理解:如果再给类里加一个show(Integer i)方法,这时候传null就会编译报错——因为String和Integer都是Object的子类,它们之间没有继承关系,编译器没法判断哪个更具体,就会出现匹配歧义啦。
内容的提问来源于stack exchange,提问作者ASH
相关产品推荐
相关产品推荐

