结论探讨
我们以实例来看,以下的测试代码,分别会输出什么呢?
代码
测试代码
public class Test0901 {
public static void main(String[] args) {
Object obj = new Object();
new Test0901().check(null); //输出c1
new Test0901().check(obj); //输出c2
}
public void check(String arg) {
System.out.println("c1");
}
public void check(Object obj) {
System.out.println("c2");
}
}
输出结果
c1
c2
结论
可以看到
check(null)
其实是调用了public void check(String arg)
。check(obj)
调用了public void check(Object obj)
。
这可以得出一个结论就是方法调用时参数类型的匹配都是遵循最小匹配原则。就是选择最接近参数类型的方法参数进行匹配,匹配不了再向上寻在父类匹配。
验证
代码
我们可以参照以下实例验证
测试代码2
public class Test0901 {
public static void main(String[] args) {
Object obj = new Object();
new Test0901().check(null); //输出c1
new Test0901().check(obj); //输出c2
}
// public void check(String arg) {
// System.out.println("c1");
// }
public void check(Object obj) {
System.out.println("c2");
}
}
结果
c2
c2
结论
可以看到
check(null)
和check(obj)
其实都调用了public void check(Object obj)
。
说明方法调用时,若是传递的参数不是严格匹配当前类,就会出现向上引用。