重载使得java的类可以有具有多个相同方法名的方法。编译器可以通过方法的参数的类型和个数来区分他们。而返回值和异常是不能作为区别标志的。
输出String String是遵循了方法重载中准确性的原则,你可以把"123"看成String,也可以看成Object,
但是从层次上看Object处在更上层,String是从Object继续过来的,调用testFun(String s)将更准确。
假如代码再加一个重载的方法,传入的参数变为神奇的null看看就知道啦:
public class Test {
public static void main(String[] args) {
Test test = new Test();
test.testFun(null);
}
public void testFun(String str) {
System.out.println("String String");
}
public void testFun(Object o) {
System.out.println("Object void");
}
public void testFun(StringBuffer sb) {
System.out.println("StringBuffer");
}
}
这样的代码编译会报错的,在没有参数为StringBuffer的重载方法时,是没有问题的,null你可以看成String,也可以看成Object,但是调用testFun(String str)更精准;
但是加上参数为StringBuffer的重载方法时,String 和StringBuffer没有继承上的关系, 编译器会感觉,把null看成String类型的,和StringBuffer类型的是一样精准,它就不知道调用哪个方法啦,如果把传入的参数变为"hehe"等任意的字符串,编译顺利通过,试试就知道啦 |