使课程可打印

时间:2013-03-19 17:27:08

标签: java

当我将某些类的实例(例如ArrayList)打印到流中时,例如System.out.println( ArrayList )的实例,它不打印引用ID(例如ArrayList @ 2144c53d),而是实际值,带有一些格式(例如[1,2] 1,3,4])。我想知道如何为自己的班级做这件事?我是否可能需要定义一些方法/实现一些接口?

5 个答案:

答案 0 :(得分: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界面 - 尽管我自己从未亲自这样做过。

答案 1 :(得分:4)

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

Object

这就是为什么在打印自己的类对象时获得此类输出的原因。要打印不同的内容,您应该覆盖自己班级中的public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } 方法。例如:

toString()

答案 2 :(得分: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} 

答案 3 :(得分:1)

覆盖

toString()方法。

这个方法是Object类,基本上给出类似的输出。

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

要获得其他任何内容,您需要在课程中重写此内容。

示例:当您打印arraylist时,ArrayList给出了ArrayList @ 2144c53d的arraylist元素intead

 public String toString() {
   return "Stackoverflow";
 }

答案 4 :(得分:0)

很简单,您只需要覆盖toString()方法。

需要完成以下内容:

public class MyClass {
    @override
    public String toString(){
        return "My custom string, perhaps using some of the class propertis";
    }
}