String类的toString()方法有什么实际用途吗?

21
我在阅读文档时注意到这个问题,从未想象过。它的描述如下:

这个对象(本身就是一个字符串!)将被返回。

除了填充约定或使用计算资源外,Java中对于一个String类型的.toString()方法有什么作用呢?为什么它不会简单地继承自java.lang.Object类中的.toString()方法?
编辑:
我知道在多态情况下必须存在自己的toString()方法,因为它覆盖了父类的toString()方法。但我想知道的是,在使用stringVariable/"String value"和使用stringVariable.toString()/"String value".toString()之间是否存在任何情况,你会得到不同的结果。
例如:像System.out.println(stringVariable.toString());这样的输出操作或像stringVariable = "String value".toString();这样的值赋值操作。

嗨,如果您在解除暂停后没有看到它,请注意Jon的回答中有JohnDoDo的评论。顺便说一句,如果您回来,请考虑恢复所有未被接受的答案——如果当时它们足够好被接受,那些有帮助的人正在因为他们无法控制的事件而受到惩罚。 - halfer
5个回答

40
除了填写规约或使用计算资源外,Java中的`.toString()`在对一个字符串进行操作时的作用是什么?这个作用使用字符串本身无法实现吗?
这意味着当以多态方式调用时,它会给出适当的结果。
为什么它不直接从java.lang.Object类继承`.toString()`呢?
因为那样做不能得到相同的结果,并且几乎肯定不能得到所需的结果。
`Object.toString()`的目的是提供对象的合理有用的字符串表示形式。Object实现提供有关类型的信息和一个可以用于粗略识别提示的值(诊断有用,但仅限于此)。显然,这不是字符串最有用的字符串表示形式-字符串本身才是。
虽然我会说很遗憾`toString`的定义方式相当模糊(结果是为机器、开发人员还是用户消费而设计并不清楚),但对我来说,字符串会在实现中返回自己是显而易见的。

5
《Effective Java》第10条探讨了避免完全指定toString()的原因:因为总会有人认为解析它是个好主意。 - Louis Wasserman
2
@TrevorTrovalds:文档不已经回答了吗?它返回“this object”-因此,如果foo是对String的非空引用,则没有使用foofoo.toString()将给出不同结果的情况。 - Jon Skeet
2
@TrevorTrovalds:嗯,差不多吧 - 不过我不会用它来做那个目的。 - Jon Skeet
@Trevor... 我正在思考一个场景,想象一下使用 str.toString() 抛出 NPE 会比 if str == null 检查更好的情况... - ryvantage
7
@user985358:Trevor,你最近取消了这个答案以及其他一些答案的接受。是这个答案或其他答案有问题,还是你有其他原因取消这么多答案的接受? - JohnDoDo
@JohnDoDo:楼主可能看不到你在那里的评论,因为他们在这个帖子中没有评论(他们可能在你发帖后删除了评论)。我会在问题上做个注释。 - halfer

2

实际例子:

public abstract class MetadataProcessor {

protected void processMetadata() {    
   Map<String, Object> metadata = getMetadata();
   for(String key : metadata.keySet()) {
      if(metadata.get(key) instanceof Date) {
      processDate(metadata.get(key));
   } else { //String or any other object type
      processString(metadata.get(key).toString());
   }
}

private void processDate(Date date) {
   (...)
}

private void processString(String string) {
   (...)
}

/**
* contains document's metadata, values must be String or Date
**/
protected abstract Map<String, Object> getMetadata();
}

如果String的.toString()不返回字符串本身,那么以上代码需要额外添加一个if(foo instanceof String)

1

显然有些过时,但是另一个避免使用(foo instanceof String)的答案是在处理泛型时。

获取每个对象的字符串表示形式可能很烦人,但是字符串是一个奇怪的例外,需要额外的代码才能获得相同的结果。


1

0
在Java中实现toString方法是通过覆盖ObjecttoString方法来完成的。当我们需要一个对象的字符串表示时,使用Java toString()方法。它在Object类中定义。可以重写此方法以自定义ObjectString表示形式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接