包含父子类的方法重载:为何以下代码输出"string"且无歧义错误?
为什么调用
m.print(null)输出"string"且无歧义? 这个问题问得很到位!咱们用Java的方法重载解析规则一步步拆解明白:
1. 重载方法匹配的核心规则:优先选最具体的类型
Java编译器处理重载方法调用时,遵循**「最具体匹配」**原则:当多个重载方法都能匹配传入参数时,会优先选择参数类型最具体的那个方法。
看你的代码:
class Mixer { void print(String s) { System.out.println("string"); } void print(Object o) { System.out.println("object"); } public static void main(String[] args) { Mixer m = new Mixer(); m.print(null); } }
null是所有引用类型的合法值,所以它既可以匹配String类型参数,也能匹配Object类型参数。但String是Object的子类,String类型比Object更「具体」——简单说就是String是Object的细化类型,编译器会认定print(String)是更合适的候选方法,因此调用它输出"string"。
2. 为什么没有方法调用歧义?
歧义只会在多个重载方法的参数类型无继承关系、且都能匹配参数时出现。比如如果你的代码再加一个print(Integer i)方法,此时传null就会编译报错——因为String和Integer都是Object的子类,但二者之间没有继承关系,编译器没法判断哪个更具体,这才会触发歧义。
而你的代码里只有String和Object两个参数类型,它们是明确的父子继承关系,编译器能清晰判定优先级,所以不会出现歧义错误。
内容的提问来源于stack exchange,提问作者Sourabh




