在statement中
System.out.println(String.valueOf(null));有一个method的调用
publicstatic String valueOf(char data[]),其源代码如下:
public static String valueOf(char data[]) { return new String(data);}那就是为什么你得到 NPE
另一方面,在statement中
Object a = null; String as =String.valueOf(a);有一个method的调用
public static String valueOf(Objectobj),其源代码如下:
public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString();}这就是为什么您得到 “空” 而不是 NPE的原因
Java语言规范中的一些理论问题:15.12.2.5选择最具体的方法
如果多个成员方法既可访问又可应用于方法调用,则必须选择一个成员方法来为运行时方法分派提供描述符。 Java编程语言使用选择 最具体 方法的规则。
A
char[]是类型
Object,但不是全部
Object都是类型
char[]。型
char[]是 更具体的
比对象和作为Java语言规范所描述的,
String.valueOf(char[])过载被选择在这种情况下。
编辑
还值得一提的是伊恩·罗伯茨([IanRoberts提到的内容(在下面的评论中):
这是需要注意的重要的是它的,如果没有一个统一的超载比所有其他更具体的编译错误-
如果有一个valueOf(String)方法,以及valueOf(Object)和valueOf(char[])随后的非类型化的调用String.valueOf(null)是不明确



