黑马程序员技术交流社区

标题: System.out.println()打印的就是括号里面对象的toString()? [打印本页]

作者: 李哲    时间: 2012-3-29 21:15
标题: System.out.println()打印的就是括号里面对象的toString()?
有没有解释?原因?
作者: newlaw2013    时间: 2012-3-29 21:25
是的,打印的就是对象的toString方法。
因为System.out.println()的这个方法源码中调用了String.valueOf(Objec o),
public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }
而String.valueOf(x)的源码就是去调用该对象的toString()方法,源码如下:
public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }
从这段源码中就可以看出,为什么我们调用System.out.println(null),传递一个null的时候,系统可以直接打印出“null”字符串。
遇到问多看源码和API文档是个非常好的习惯,我自己也在坚持,感觉受益匪浅。
作者: 龚龙    时间: 2012-3-29 21:25
你要打印的对象只有重写toString 方法后,System.out.println()才自动调用你对象的toString方法,否则你打印出来的就是这个对象地址....
作者: 许飞翔    时间: 2012-3-29 21:46
System.out.println()里面如果是一个对象,则会自动加上一个toString()方法,
把该对象变成它所对应的字符串。
比如:
System.out.println(a);,
其中a是个对象。那么系统会自动把这句话变成System.out.println(a.toString());
作者: 姚伟涛    时间: 2012-3-29 22:16
它通常只是为了方便输出,比如System.out.println(xx),括号里面的“xx”如果不是String类型的话,就自动调用xx的toString()方法

  总而言之,它只是sun公司开发java的时候为了方便所有类的字符串操作而特意加入的一个方法
作者: 何万县    时间: 2012-3-29 23:41
有原因,每个类都是Object类的子类,toString()方法是Object类的方法,所以每个类都继承这个方法,你可以重写覆盖也可以不重写,你用System.out.println()来打印这个对象的时候会直接调用toString()方法,默认好像是显示这个对象所属的类和这个对象的hash值,如果想显示这个对象的所有属性那么你需要在这个对象所属类中重写toString方法来实现。
作者: 李增强    时间: 2012-3-29 23:46
是的,但是前提条件是你的对象覆写了toString这个方法,若是没有覆写,打印出来都是一堆内存地址。
作者: 丁佼    时间: 2012-3-30 00:22
沙发正解,要么就只管使用,想搞懂实现原理就要去看原始代码。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2