是toString()定义为java.lang.String返回这个?

P45*_*ent 22 java language-lawyer

考虑

String foo = s.toString();
Run Code Online (Sandbox Code Playgroud)

对于非null java.lang.String实例s.

这是定义为自己返回,还是由特定的Java实现决定?出于兴趣是一个"深刻的副本"采取?

检查我的JDK源代码确认s已返回,但JLS是否坚持这一点?我已经被认为toString()是一种任意的序列化,也许是对象的代表,但不一定如此.例如,完全合理(至少在我看来)实现可以用引号字符包围字符串.

ass*_*ias 23

您在JLS中找不到任何保证,但在javadoc中确实有一个保证:

这个对象(已经是一个字符串!)本身就返回了.

  • @ P45Imminent但为什么你期望这样做? (2认同)
  • @corsiKa我相信他正在质疑,如果字符串为"str",是否可能使`str == str.toString()`为false. (2认同)

Sur*_*tta 20

它返回自己

 /**
     * This object (which is already a string!) is itself returned.
     *
     * @return  the string itself.
     */
    public String toString() {
        return this;
    }
Run Code Online (Sandbox Code Playgroud)

查看源代码,您可以轻松找到它.

我确信我们无法为每个方法的实现找到Java语言规范.就像toString()String类的任何其他Java类方法一样只返回它自己的字符串表示.

更新:

既然你的实际问题是关于为什么它自己返回而不是副本或者像引号一样的黑客来制作一个新的String,我会稍微不同意.我的理由相同(可能还有其他很好的理由),因为你toString()在实际的字符串实例(s)本身上调用方法,我认为这里没有任何害处.如果你想玩游戏,那么s无论如何你都会直接使用实例.

  • @ANS JavaDoc保证**每个**JDK实现都必须遵守.源代码只是一个实现细节.JavaDoc是必须坚持的合同.对于每一件软件来说都是如此.源代码只是一个可以(并且在大多数情况下可能会)改变一些时间的细节. (12认同)
  • 对于`为什么它返回它自己而不是副本或者像引号一样的黑客来创建一个新的String`,我认为在String类中返回`this`是完全安全的,因为String对象是不可变的. (5认同)
  • 的确,我做到了,但JLS*坚持*吗? (2认同)
  • @ANS:哪个源代码?Oracle JDK的?Oracle JRockit的?IBM J9 JDK的?IcedTea项目的?Apache Harmony的?GNU Classpath的?Excelsior JET的? (2认同)
  • 我不相信这回答了这个问题.OP明确表示他/她已经查看了JDK源代码并看到`toString` _does_返回`this`,但问题是JLS是否需要它. (2认同)

Boa*_*ann 19

是.请参阅Java语言规范§1.4 - 与预定义类和接口的关系:

如上所述,此规范通常是指Java SE平台API的类.特别是,某些类与Java编程语言有特殊的关系.实例包括类,如Object,Class,ClassLoader,String,Thread,和在包中的类和接口java.lang.reflect,等等.此规范约束此类和接口的行为,但不提供完整的规范.读者可以参考Java SE平台API文档.

所以这些类的javadoc(这是"Java SE平台API文档")是规范性的,是整个语言规范的一部分.并明确说明:

public String toString()

这个对象(已经是一个字符串!)本身就返回了.

没有解释的余地​​.

(如果他们改变它做任何不同的事情,它会打破无数的程序.)

  • 这是(到目前为止)这里最好的答案,也是唯一一个完全处理这个问题的答案.重要的是,JLS遵循Javadoc以获得某些类的必需功能. (3认同)