static String s;
public static void main(String[] args){
System.out.println(s);
}
简单问题 这样会打印出null.很简单
但是不知道我理解的正确不正确,每个打印语句其实调用的是toString()方法.
但是当我把程序改成
static String s;
public static void main(String[] args){
System.out.println(s.toString());
}
就会报异常.
报异常我能理解.但是第一个程序能打印出null,让我想不通.(能打印出null说明,他把null转成了字符串).
请问是怎么回事.内部是怎么把null转成字符串的或者说是用什么方法转的...

解决方案 »

  1.   

    每个打印语句其实调用的是toString()方法,这句话严重有问题。。
      

  2.   

    第一种会打印出null 是因为引用类型对象的默认值为NULL,但第二个你调用了String的toString 方法 就会抛出空指针异常 因为 对象为空 调用不了它的方法
      

  3.   

    看一下源代码不就知道了?    public void print(String s) {
    if (s == null) {
        s = "null";
    }
    write(s);
        }
      

  4.   

    你没有理解我的意思吗?我当然知道默认值是null,我想问的是,打印语句调用的是toString方法(如果你认为不是调用toString方法,那么请你解释下是怎么打印出字符串来的).那么为什么第一种可以打印出null
      

  5.   

    这个才是我想要的答案(这样打印语句调用的是toString()方法就没错了).请问源代码是怎么查看的.
      

  6.   

    去看看 System.out.println() 这个函数的源码就非常清楚了
      

  7.   

    是要懂内存分析,下载SRC 源码
      

  8.   

    JDK自带,去目录里面找这个文件: src.zip顺便贴给你吧:    public void println(String x) {
    synchronized (this) {
        print(x);
        newLine();
    }
        }    public void print(String s) {
    if (s == null) {
        s = "null";
    }
    write(s);
        }
      

  9.   

    这个才是我想要的答案(这样打印语句调用的是toString()方法就没错了).请问源代码是怎么查看的.
    eclipse里面可以按住CTRL+鼠标左键点你要查看的方法
      

  10.   

    这个才是我想要的答案(这样打印语句调用的是toString()方法就没错了).请问源代码是怎么查看的.
    这里没有调用toString方法。。只有当你想打印一个对象的时候,print调用String.valueOf(Object o)才会调用对象的toString方法
      

  11.   

    谢谢大家了.我知道怎么回事了.
     public void println(Object x) {
            String s = String.valueOf(x);
            synchronized (this) {
                print(s);
                newLine();
            }
        }
    public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
        }这应该是正确的理解.所以说  打印语句调用的是toString方法...
      

  12.   

    打印语句调用的是toString方法... 
    你这结论这么难以纠正?。。你没看见println重载了多次?
      

  13.   

    你说的是对的,我知道哪里错了.是重载了多次.我全看了一边.不过还有write()方法没有看懂.似乎有点难理解