Java重载,参数为null时调用情况
问题
最近看面试题看到这样一道题,如下代码
public static void func(String o) {
System.out.println("aaa");
}
public static void func(Object o) {
System.out.println("bbb");
}
public static void main(String[] args) {
func(null);
}
请说出该方法最后运行的结果,看到这个的时候,答案自己是不确定的。然后去查找相关的资料,最后发现这个应该是执行 输出的 aaa , 在这个程序运行的时候牵扯到 方法重载精确度的问题,应为Object是所有类的超类,所以String精确度更高一些。
验证
验证一下这个结论,做了如下测试
@Test
void contextLoads() {
func(null);
}
public void func(A o) {
System.out.println("aaa");
}
public void func(B o) {
System.out.println("bbb");
}
static class A {
}
static class B extends A {
}
因为A是B的父类,B是A的子类,该程序执行最后输出 bbb,
这也说明 子类的精确度高于父类
这个验证也可以从编辑器看到
编辑器在执行时也会优先选择比较合适的,不用运行也能看出来结果会输出什么。
总结
方法重写传值如果为null,涉及到方法重载精确度原则,出现参数为 Object类与String类时,会进入参数为String的重载方法,因为Object类是Java中的超类,即所有类的父类,精确度相比于String低。
当参数类型相同时,会优先进入子类。子类的精确度高于父类。