最近在看一些java的源码,看到
String的valueOf(Object obj)这段源码,如下:
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
于是我传了个null值进去:如下:
System.out.println(String.valueOf(null));
原以为会在控制台打印出字符串null,然而。。。,抛了NullPointerException
出了这个结果那它就只可能调用的是valueOf(char data[]) 这个方法了,因为其他几个重载方法接收的参数都是基本类型
public static String valueOf(char data[]) {
return new String(data);
}
然后我翻看了下Effective Java,第41条 慎用重载 。当然里面并没有找到为什么调用
valueOf(char data[]),而没有调用valueOf(Object obj)的答案。于是我就又测了个例子如下:
public class CollectionClassifier {
public static String classify(List<?> s){
return "List";
}
public static String classify(Collection<?> s){
return "Collection";
}
public static void main(String[] args) {
System.out.println(classify(null));
}
}
打印到控制台的结果是:List。
个人总结:当多个方法可以接收相同参数的时候,会执行参数是“子类”那个方法。比如上面的例子所有的对象都继承自Object,所以调用的是valueOf(char data[]),第二个例子List继承自Collection方法,所以调用的是classify(List<?> s)方法。