Collection c = new HashSet();
c.add(new Name("name1","ttt"));
c.add(new Name("name2","fff"));
c.add(new Name("name3","ggg"));
System.out.println(c);
为什么可以直接打印出c出来?

解决方案 »

  1.   

    API中有一个这样的方法解释:
    println(Object x) 
              打印 Object,然后终止该行。这里调用的就是这个方法。
      

  2.   


    HashSet extends AbstractSet<E>AbstractSet<E> extends AbstractCollection<E>AbstractCollection重写了toString():public String toString() {
            Iterator<E> i = iterator();
    if (! i.hasNext())
        return "[]"; StringBuilder sb = new StringBuilder();
    sb.append('[');
    for (;;) {
        E e = i.next();
        sb.append(e == this ? "(this Collection)" : e);
        if (! i.hasNext())
    return sb.append(']').toString();
        sb.append(", ");
    }
        }
      

  3.   


    这个我理解,可是为什么不是打印出来类名加@那种格式的呢?应该是重写了toString方法,可是不知道怎么重写的
      

  4.   

    System.out是PrintStream的对象,PrintStream的println(Object o)函数,打印的是o.toString返回的字符串.所以,这个类只要重写toString方法,就可以控制println打印的内容.那么,println是如何打印o.toString的内容的呢?
    下面是toString的代码:public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }可以看出,它打印的是String.valueOf(x),x是一个Object.再看看valueOf的代码:public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }可以看出这里调用了toString;
      

  5.   

    系统自己实现了对 sysout的多种重载 你看到的只是将对象地址打印出来了  集合对象toString返回内存地址
    你可以去找找源码看看
      

  6.   

    我又查了一下。打印对象是,调用的是String.valueOf(Object obj)。API中是这样写的:valueOf
    public static String valueOf(Object obj)返回 Object 参数的字符串表示形式。 参数:
    obj - 一个 Object。 
    返回:
    如果参数为 null,则字符串等于 "null";否则,返回 obj.toString() 的值。
    另请参见:
    Object.toString()
    也就是调用了toString()方法,这里调用的是HashSet父类的toString()方法。
    定义如下:
    toString
    public String toString()返回此 collection 的字符串表示形式。该字符串表示形式由 collection 元素的列表组成,这些元素按其迭代器返回的顺序排列,并用方括号 ("[]") 括起来。相邻元素由字符 ", "(逗号加空格)分隔。通过 String.valueOf(Object) 可以将元素转换成字符串。
    此实现会创建一个空字符串缓冲区,追加一个左方括号,然后在 collection 上进行迭代,依次追加每个元素的字符串表示形式。每追加一个元素后(最后一个元素除外),将追加字符串 ", "。最后,追加一个右括号。从字符串缓冲区获取一个字符串并返回它。 
    覆盖:
    类 Object 中的 toString
    返回:
    此 collection 的字符串表示形式。
      

  7.   

    我想说的是打印c 就是调用c的toString方法,可是API里容器没有这个方法啊?那怎么谈得上重写这个方法呢
      

  8.   

    是HashSet继承了AbstractCollection的方法。刚才楼上的兄弟已经说明了。
    从类 java.util.AbstractCollection 继承的方法 
    addAll, containsAll, retainAll, toArray, toArray, toString 
    你查HashSet的API,肯定能看到这一行,再找AbstractCollection的方法,看toString()方法的定义,应该就能明了了。
      

  9.   

        public String toString() {
            Iterator<E> i = iterator();
    if (! i.hasNext())
        return "[]"; StringBuilder sb = new StringBuilder();
    sb.append('[');
    for (;;) {
        E e = i.next();
        sb.append(e == this ? "(this Collection)" : e);
        if (! i.hasNext())
    return sb.append(']').toString();
        sb.append(", ");
    }
        }这是hashset的tostring方法
    其中,sb.append(e == this ? "(this Collection)" : e);中的e就是你集合里面的对象,调用了e 的tostring方法的返回结果append进去。
    在你这里是一个Name类,也就是说,他会打印出类似[Name(..).toString],[Name(..).toString],[Name(..).toString]的东西。
    LZ应该把你的name类和最终打印出来的东西放上来才好参考。