在Java的静态分派即方法执行版本的分派这篇文章中,我介绍了Java
执行重载方法时的规则,本篇中继续以String
的valueOf
方法来简单介绍Java
中的静态分派的应用。
valueOf 中的秘密
String
中的valueOf
方法大致可以分为三种:
String.valueOf(Object)、String.valueOf(char[])、String.valueOf(基本数据类型)
案例:
Integer arg = null;
String.valueOf(arg); // 输出 null
String.valueOf(null); // 抛java.lang.NullPointerException
为什么?
因为Java
中所有类的顶级父类都是Object
,从Java重载方法的执行这篇文章中我们知道,方法重载时,char[]
数组优先于Object
,因此null
会调用String.valueOf(char[])
方法。对于Integer arg = null;
与数组类型不匹配,因此调用String.valueOf(Object)
方法。
String.valueOf(Object)原码:
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
String.valueOf(char[])原码:
public static String valueOf(char data[]) {
return new String(data);
}
public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}
使用技巧
对象转成String类型,有三种方法:强转、.toString()、String.valueOf(Object)。
- 强转
只有类型匹配的才可以强转,例如Object obj = new Integer(10); String str = (String) obj;
会抛CalssCastException
异常 .toString()
必须保证对象不为null
,否则抛NullPointerException
异常String.valueOf(Object)
方法实现避免了CalssCastException
和NullPointerException
,但是要注意,如果对象为null
,那么返回的值是"null"
字符串,而不是null
。一定要注意这一点,在实际开发中,这个方法是比较常用的。
开发中的应用
例如两个人A和B对接接口,A发送一些数据给B,B去解析
A:
// 发送的数据为 Integer 类型
Object arg = new Integer(2);
// 发送给B的伪代码
send(arg);
B:
// 接收A参数的伪代码
Object arg = receive();
// B知道参数是一个数值类型的,但是B这边不知道A发的具体的类型
// Long rec = (Long) arg; 报错了,因为类型转换异常
// 使用 String.valueOf 可以避免
String rec = String.valueOf(arg);
if(!"null".equals(rec)){
Long result = Long.valueOf(rec);
}