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