4

当我将某些类的实例(例如ArrayList)打印到流中时,例如System.out.println(ArrayList)的实例,它不会打印参考 id(例如 ArrayList@2144c53d),而是打印带有某些格式的实际值(例如 [1,2, 3,4])。我想知道如何为自己的课程做到这一点?我是否可能必须定义一些方法/实现一些接口?

4

5 回答 5

10

很简单:您覆盖该Object.toString()方法。例如:

public class Person {
    private final String name;
    private final LocalDate birthDate;

    public Person(String name, LocalDate birthDate) {
        this.name = name;
        this.birthDate = birthDate;
    }

    @Override public String toString() {
        return String.format("%s (born %s)", name, birthDate);
    }
}

对于更复杂的处理,您可能需要考虑实现Formattable接口 - 尽管我自己从未亲自这样做过。

于 2013-03-19T17:27:44.027 回答
4

当您尝试使用 打印类的对象时System.out.print,它会在该类中查找toString()方法。如果在给定的类中没有找到,那么它会尝试在其超类中查找该方法,直到找到一个。然后打印类中定义String的方法返回。toString()如果一个类没有扩展任何东西,那么它默认调用的toString方法Object,它返回的字符串是这样的:

public String toString() 
{
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

这就是为什么在打印自己的类对象时会得到这种类型的输出。要打印不同的内容,您应该覆盖toString()您自己的类中的方法。例如:

public class MyClass
{
  private int roll;
  private String name;
  MyClass(int roll,String name)
  {
    this.roll = roll;
    this.name = name;
  }
  @Override
  public String toString()
  {
    return "roll="+roll+",name="+name;
  }
}
于 2013-03-19T17:29:59.590 回答
2

. 我想知道如何为自己的课程做到这一点?

通过覆盖toString()你的类中的方法。

public class MyClass {
@override
public String toString(){
return "I am a legend MwhAhAH";
}
}

如果你没有在你的类中覆盖 toStirng(),Object#toString()将被调用,它返回yourclassname+ "@"+ hexnumberOfHashcode.

public String toString() {
  237           return getClass().getName() + "@" + Integer.toHexString(hashCode());
  238       }

ArrayList 确实覆盖了 toString 方法:

  public String toString() {
431        Iterator<E> i = iterator();
432        if (! i.hasNext())
433            return "[]";
434
435        StringBuilder sb = new StringBuilder();
436        sb.append('[');
437        for (;;) {
438            E e = i.next();
439            sb.append(e == this ? "(this Collection)" : e);
440            if (! i.hasNext())
441                return sb.append(']').toString();
442            sb.append(", ");
443        }
444    }
445
446} 
于 2013-03-19T17:27:52.837 回答
1

覆盖

toString()方法。

此方法是 Object 类,它基本上提供类似的输出。

getClass().getName() + '@' + Integer.toHexString(hashCode())

要获得其他任何内容,您需要在课堂上覆盖它。

示例:当您打印 ArrayList 时,ArrayList 将提供 ArrayList 元素而不是 ArrayList@2144c53d

 public String toString() {
   return "Stackoverflow";
 }
于 2013-03-19T17:27:54.753 回答
0

很简单,你应该只需要覆盖toString()方法。

需要执行以下操作:

public class MyClass {
    @override
    public String toString(){
        return "My custom string, perhaps using some of the class propertis";
    }
}
于 2013-03-19T17:30:06.997 回答