为什么我必须重写toString方法而不是只创建另一个方法?

时间:2014-02-18 12:30:37

标签: java

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.");
}

13 个答案:

答案 0 :(得分:10)

你应该这样做有两个主要原因(可能还有更多):

  1. 这是一个惯例。通过遵守惯例,您班级的其他用户将会本能地知道如何使用它们。例如,如果我想要您构建的类的字符串表示形式,我首先想到的是在其上调用toString。我从不想到为此调用自定义方法。

  2. 构建框架类时考虑到了这一点。例如,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());

您可以阅读有关toString()方法herehere的更多详细信息。

答案 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通常不是那么有用,因此建议覆盖它。