黑马程序员技术交流社区

标题: toString() 方法疑惑求解!!! [打印本页]

作者: 聖手`书生    时间: 2013-4-23 20:58
标题: toString() 方法疑惑求解!!!
我们都知道,java的Object提供了个toString方法,返回该对象的字符串表示。

而String类中已经复写了该方法,返回String对象本身;所以我们调用String类对象时,直接打印String类对象的引用就可以打印该字符串对象。

从我学习的经验来看,如果某个类复写了toString()方法,那么打印该类对象的引用,就可以直接输出toString方法的返回值。

问:我这样理解是否正确??给点意见哈。
作者: wangyougu010    时间: 2013-4-23 21:02
这个得看情况,如果是自定义类对象,那么重写toString后,可以选择返回自定义对象的某些属性,比如,自定义了Persson类,有学号id,姓名name这两个属性,这个时候如果直接打印Person类的对象,输出的会是Person类名跟地址。
作者: 张洪慊    时间: 2013-4-23 21:05
当你用System.out.println(对象)时:
(API)
用的是:public void println(Object x)
          打印 Object,然后终止该行。此方法首先调用 String.valueOf(x) 获取打印对象的字符串值,然后的行为如同先调用 print(String) 再调用 println() 一样。
而String类中:
    static String valueOf(Object obj)
          如果参数为 null,则字符串等于 "null";否则,返回 obj.toString() 的值。
   obj.toString():调用了你传入的对象所属类的toString()方法,该方法从 Object继承/被复写.
作者: breeze    时间: 2013-4-23 22:04
如果重写了toString()会返回一个期望的字符串, 如果不重写, 返回的是 类名@hashCode()
class Test {
        public static void main(String[] args) {
                Student s = new Student("张三", 14);
                //就是将对象信息以字符串的形式打印, 其实就是自定义的的toString()方法
                System.out.println(s);        //这里的s其实就是s.toString();
        }
}
class Student {
        String name;
        int age;

        Student(String name, int age) {
                this.name = name;
                this.age = age;
        }

        //重写toString()
        public String toString() {
                //这里可以返回任意一个字符串, 但是一般返回的是这个对象的属性信息
                return "姓名: " + this.name + " 年龄: " + this.age;
        }
}
作者: Miss小强    时间: 2013-4-24 14:16
  1. public void println(Object x) {
  2.         String s = String.valueOf(x);
  3.         synchronized (this) {
  4.             print(s);
  5.             newLine();
  6.         }
  7.     }
复制代码
我们知道System。out是PrintStream的对象。println方法的源代码就是上面那个;
String的valueOf的源代码是这个:
  1. public static String valueOf(Object obj) {
  2.         return (obj == null) ? "null" : obj.toString();
  3.     }
复制代码
在看Object的toString源代码:
public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
这样应该一目了然了吧,源代码都是这样的了,还能有错嘛,就是你说的那样;
如果是空就打印null,如果out.println(obj);obj覆盖了toString的方法就调用它,输出他的返回值;
如果没有就用父类Object的返回值;

作者: xiewen    时间: 2013-4-26 10:30
你这样理解非常正确。
作者: hmr8    时间: 2013-5-1 10:11
这是多的,这就是多态的特性!




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