Object obj = null;
System.out.println(String.valueOf(obj));
System.out.println(String.valueOf(null));
两个结果不一样
第二句话报空指针错误
原因是什么?
System.out.println(String.valueOf(obj));
调用的是 String java.lang.String.valueOf(Object obj)
System.out.println(String.valueOf(null));
调用的是 String java.lang.String.valueOf(char[] data)
两者使用的重载方法不一样的
Java的重载过程分两个阶段。
第一阶段选取所有可获得并且可应用的方法或构造器。看一下String.valueOf()源码,有以下几个重载方法可供选择:
String valueOf(Object obj)
String valueOf(char data[])
String valueOf(boolean b)
String valueOf(char c)
...
因为基本类型不能赋于null,所以可供选择的方法只有valueOf(char data[])和 valueOf(Object obj)。
第二阶段在第一阶段选取的方法或构造器中选取最精确的一个,如果一个方法或构造器可以接受传递给另一个方法或构造器的任何参数,那么我们就说第一个方法比第二个方法缺乏精确性。方法valueOf(Object obj)可以接收任何传给valueOf(char data[])的参数,我们说方法valueOf(Object obj)相对方法valueOf(char data[])缺乏精确性,所以在重载时会选择方法valueOf(char data[])。
如果将调用代码修改如下:
value = String.valueOf((Object)null);
重载时将会选择valueOf(Object obj)方法。