You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:25:01