Java选择String而非Object是因为最具体匹配原则:String是Object的子类,更具体;null可赋值给任意引用类型,编译器在编译期依据参数类型继承关系选出最具体的重载方法。

传入 null 时,Java 会选择更具体的那个重载方法,也就是参数为 String 的方法。
为什么选 String 而不是 Object?
Java 在解析重载方法时,会根据**最具体匹配(most specific match)**原则选择目标方法。虽然 null 可以赋值给任何引用类型,但编译器会比较参数类型的继承关系:
-
String是Object的子类,因此String比Object更具体; - 当两个方法都“合法”(
null都能接受),编译器优先选更具体的类型; - 这发生在编译期,不依赖运行时实际对象(因为
null没有运行时类型)。
一个简单例子
以下代码可以验证行为:
public class OverloadTest {
public void test(Object o) { System.out.println("Object"); }
public void test(String s) { System.out.println("String"); }
public static void main(String[] args) {
new OverloadTest().test(null); // 输出:String
}
}
需要注意的边界情况
如果存在多个同样“具体”的候选(比如 String 和 Integer),编译器将报错:
立即学习“Java免费学习笔记(深入)”;
- 例如同时定义
test(String)和test(Integer),再调用test(null)→ 编译失败:“reference to test is ambiguous”; - 此时必须显式转型,如
test((String) null)或test((Integer) null)来消除歧义。
和多态、重写的区别
这个选择完全由编译器静态决定,与运行时多态无关。它不看 null 实际指向什么(它什么也不指向),只看方法签名的类型层级关系。


















