论坛首页 Java企业应用论坛

java中的null

浏览 8744 次
锁定老帖子 主题:java中的null
精华帖 (0) :: 良好帖 (1) :: 新手帖 (8) :: 隐藏帖 (3)
作者 正文
   发表时间:2011-11-10  
        Object obj = null;
        System.out.println(String.valueOf(obj));
        System.out.println(String.valueOf(null));

这两个结果竟然不一样
第二句话报空指针错误
我的理解,第一个obj是对象,第二个null不是对象,是类似基本类型的常量
   发表时间:2011-11-10  
第一个 是指向null的引用
第二个是null
怎么可能一样
0 请登录后投票
   发表时间:2011-11-10  
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)

两者使用的重载方法不一样的
0 请登录后投票
   发表时间:2011-11-10  
看JDK源码咯.
第一个调用的是:
public static String valueOf(Object obj) {
	return (obj == null) ? "null" : obj.toString();
    }


第二个调用的是:
public String(char value[]) {
	int size = value.length;
	char[] v = new char[size];
	System.arraycopy(value, 0, v, 0, size);
	this.offset = 0;
	this.count = size;
	this.value = v;
    }

int size = value.length;就报错了
null没有类型,所以去调用了String最基础的构造器类型char value[]
0 请登录后投票
   发表时间:2011-11-10  
thread 写道
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)

两者使用的重载方法不一样的

第二个为啥是调用String java.lang.String.valueOf(char[] data)?
0 请登录后投票
   发表时间:2011-11-10  
cxaseb0204 写道
看JDK源码咯.
第一个调用的是:
public static String valueOf(Object obj) {
	return (obj == null) ? "null" : obj.toString();
    }


第二个调用的是:
public String(char value[]) {
	int size = value.length;
	char[] v = new char[size];
	System.arraycopy(value, 0, v, 0, size);
	this.offset = 0;
	this.count = size;
	this.value = v;
    }

int size = value.length;就报错了
null没有类型,所以去调用了String最基础的构造器类型char value[]

关键是第二个为啥会掉char数组的重载??!
0 请登录后投票
   发表时间:2011-11-10  
ol_beta 写道
cxaseb0204 写道
看JDK源码咯.
第一个调用的是:
public static String valueOf(Object obj) {
	return (obj == null) ? "null" : obj.toString();
    }


第二个调用的是:
public String(char value[]) {
	int size = value.length;
	char[] v = new char[size];
	System.arraycopy(value, 0, v, 0, size);
	this.offset = 0;
	this.count = size;
	this.value = v;
    }

int size = value.length;就报错了
null没有类型,所以去调用了String最基础的构造器类型char value[]

关键是第二个为啥会掉char数组的重载??!


直接debug原码就可以了
0 请登录后投票
   发表时间:2011-11-10   最后修改:2011-11-10
ol_beta 写道
thread 写道
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)

两者使用的重载方法不一样的

第二个为啥是调用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)方法。
3 请登录后投票
   发表时间:2011-11-10  
null是一个特殊的变量,它什么都不是既不是0,也不是空对象,就是什么都没有
0 请登录后投票
   发表时间:2011-11-10  

8楼是正确的,附上 JAVA规范:

JLS 15.12.2.5 Choosing the Most Specific Method

 

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics