当我将某些类的实例(例如ArrayList
)打印到流中时,例如System.out.println(
ArrayList)
的实例,它不会打印参考 id(例如 ArrayList@2144c53d),而是打印带有某些格式的实际值(例如 [1,2, 3,4])。我想知道如何为自己的课程做到这一点?我是否可能必须定义一些方法/实现一些接口?
5 回答
很简单:您覆盖该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
接口 - 尽管我自己从未亲自这样做过。
当您尝试使用 打印类的对象时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;
}
}
. 我想知道如何为自己的课程做到这一点?
通过覆盖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}
覆盖
toString()
方法。
此方法是 Object 类,它基本上提供类似的输出。
getClass().getName() + '@' + Integer.toHexString(hashCode())
要获得其他任何内容,您需要在课堂上覆盖它。
示例:当您打印 ArrayList 时,ArrayList 将提供 ArrayList 元素而不是 ArrayList@2144c53d
public String toString() {
return "Stackoverflow";
}
很简单,你应该只需要覆盖toString()
方法。
需要执行以下操作:
public class MyClass {
@override
public String toString(){
return "My custom string, perhaps using some of the class propertis";
}
}