toString是否有任何特殊之处,使其与Override相比更加独特且更有用,而不仅仅是单独使用toString方法并创建一个单独的方法。
例如以下代码。 Override toString方法的优点/缺点是什么?这两种方法都返回相同的输出。
@Override
public String toString(){
return String.format("%s is a %s", "Apple", "fruit.");
}
public String newMethod(){
return String.format("%s is a %s", "Apple", "fruit.");
}
答案 0 :(得分:10)
你应该这样做有两个主要原因(可能还有更多):
这是一个惯例。通过遵守惯例,您班级的其他用户将会本能地知道如何使用它们。例如,如果我想要您构建的类的字符串表示形式,我首先想到的是在其上调用toString
。我从不想到为此调用自定义方法。
构建框架类时考虑到了这一点。例如,System.out.println(myObj)
会在ToString
上致电myObj
。
答案 1 :(得分:6)
如果您实施toString()
方法,则可以执行以下操作:
MyType myobject = new MyType();
System.out.println(myobject);
这将自动调用toString()
方法。
如果您要实现自己的方法,并将其称为newMethod()
,则必须执行此操作:
MyType myobject = new MyType();
System.out.println(myobject.newMethod());
答案 2 :(得分:5)
覆盖的优势在于Java会自动使用它而不是toString()
提供的Object
。
尝试运行
System.out.println(yourObject);
有没有
@Override
public String toString(){
return String.format("%s is a %s", "Apple", "fruit.");
}
方法并观察差异。
答案 3 :(得分:3)
每当要以字符串形式打印对象时,例如当您执行System.out.print(object)
时,就会调用toString()
。所以它是一个实现约定,你应该坚持下去。
答案 4 :(得分:2)
toString()
由Object
继承,因此Java中的任何对象都可以调用此方法。
正如其他人所说,它被多种方法使用,例如System.out.println(someObject)
。
如果由于某种原因你真的想要另一种方法做toString()
做同一个但用另一个名字做的方法,你可以这样做:
@Override
public String toString(){
return String.format("%s is a %s", "Apple", "fruit.");
}
public String newMethod(){
return toString();
}
答案 5 :(得分:2)
在Java中,toString()是将任何对象转换为其对应的String表示的标准方法。因为这是标准化的,所以各种代码都可以依赖它,包括可以使用Reflection递归打印出对象图的调试代码。
如果您希望您的方法能够参与此方法,那么您将覆盖toString()。另一方面,如果你正在创建一个返回一些任意String的方法,并且你不希望它成为对象的规范toString()表示(可能是现有的toString()方法做得更好),那么你给它另一个名称,如newMethod()。
从Object继承的默认toString()方法没有用处。它只返回对象的类和哈希码。
答案 6 :(得分:1)
当需要将实例转换为字符串时调用toString
方法,例如,当您执行类似System.out.println(something)
(在java中)或Console.WriteLine(something)
(在C#)。它也很有用,因为当您使用调试器显示变量值时,您可以看到toString
输出。
答案 7 :(得分:1)
因为JVM默认会调用Object的toString()而你不必显式调用它。
如果您继续执行newMethod()
,则必须按以下方式打印:sysout(objOfYourClass.newMethod());
如果你覆盖toString(),你可以简单地说:sysout(objOfYourClass);
答案 8 :(得分:1)
ToString()
方法是每个对象都有的方法。因此,当您不知道对象是什么时,您可以随时在其上调用ToString()
。此外,许多方法都使用ToString()
方法,例如Console.WriteLine
(C#)和System.out.println
(Java)
答案 9 :(得分:1)
一个衬垫:System.out.println(yourclassobject)将隐式调用toString()。
答案 10 :(得分:0)
由于JVM不会调用toString()
以外的自定义方法,因此您需要覆盖System.out.println(obj);
答案 11 :(得分:0)
每个对象都应该有一个toString
方法,因此您可以随时调用它并期望接收该对象的字符串表示。
例如System.out.println
依赖它来将对象的字符串表示形式打印到stdout。
答案 12 :(得分:0)
如Java Language Specification所指定,toString方法旨在提供对象的字符串表示形式。通常,toString方法返回一个“以文本形式表示”此对象的字符串。结果应该是简洁但内容丰富的表示形式,人(我的重点)易于阅读。建议所有子类都重写此方法。对于调试和记录日志很有用,但是可以在不故意破坏合同的情况下更改结果。对于表示对象的精确字符串,最好提供一个单独的方法,例如枚举时的 name 。这种方法不应该改变。
默认的toString通常不是那么有用,因此建议覆盖它。