20

我正在阅读文档并注意到它。从来没有想过。说明:

这个对象(它已经是一个字符串!)本身被返回。

除了填充约定或使用计算资源之外,.toString()Java 中的 aString对使用String自身不会做的 a 做了什么?为什么它不简单地继承.toString()from 类java.lang.Object

编辑:

我知道在多态的情况下,toString()必须存在自己的方法,因为它会覆盖其父级的toString(). 在第一个问题中我想知道的是,在使用stringVariable/"String value"和使用stringVariable.toString()/之间是否存在任何不同的情况"String value".toString()

前任。gr.:输出操作,System.out.println(stringVariable.toString());stringVariable = "String value".toString();.

4

5 回答 5

39

除了填充约定或使用计算资源之外,Java 中的 .toString() 对使用 String 本身不会的 String 做了什么?

这意味着它在多态调用时会给出适当的结果。

为什么它不简单地从类 java.lang.Object 继承 .toString()?

因为那不会给出相同的结果,而且几乎可以肯定不是预期的结果。

Object.toString()旨在提供对象的合理有用的字符串表示。该Object实现提供了有关类型和值的信息,可用于粗略的身份提示(诊断上有用,但仅此而已)。这显然不是字符串最有用的字符串表示形式——字符串本身就是。

虽然我说遗憾的toString是,它的定义非常模糊(不清楚结果是用于机器、开发人员还是用户消费),但对我来说很明显 aString会在实现中返回自身。

于 2012-07-08T20:26:33.920 回答
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() 不会返回 String 本身,则if(foo instanceof String)在上面的代码中需要额外的。

于 2016-11-21T13:04:38.170 回答
1
public final class String
extends Object
implements Serializable, Comparable<String>, CharSequence

请参阅:https ://docs.oracle.com/javase/10/docs/api/java/lang/String.html

所有对象都有toString()方法(请参阅https://docs.oracle.com/javase/10/docs/api/java/lang/Object.html#toString())。String是一种对象,因此,它还需要一个方法toString()来实现其基类中的方法。

于 2018-06-01T03:05:43.497 回答
1

显然是旧的,但另一个避免 (foo instanceof String) 需要的答案是在处理泛型时。

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

于 2019-10-23T18:47:07.283 回答
0

在java中实现toString方法是通过覆盖Object'toString方法来完成的。toString()当我们需要对象的字符串表示时,使用java方法。它是在Object类中定义的。可以重写此方法以自定义String.Object

于 2016-08-17T05:11:52.553 回答