首页 > 解决方案 > 当我调用 System.out.println("foo" + bar) 时到底发生了什么?

问题描述

我发现 System.out.println(Object obj) 在此链接上的工作原理:对象如何隐式调用 toString 方法?

但是,我还是有些迷茫。所以,我想这更像是一个附加/连接(我不知道正确的术语),但是当我同时调用 System.out.println(Object obj ) 和 System.out.println("foo" + bar) 我想要一个清晰的画面。

对于某些背景——我创建了一个名为 Place 的类,它有自己的 toString()。

System.out.println("foo" + bar);

    Place test = new Place("Disneyland");
    System.out.println("Testing " + test);

此代码从 println 语句转到我的 Place 类中的 toString() 方法,但随后 Eclipse 拉出一个新页面,其中显示 String.valueOf(Object) line: not available; 找不到来源。然后,在我再次进入之后,我得到了相同类型的错误页面,但不是 StringBuilder.append(Object)。然后我再次进入,我想要输出的所有内容都已正确输出。是什么让这些中间异常页面被拉起?

标签: java

解决方案


+上下文中的运算符执行字符串连接。字符串连接在Java 语言规范中有完整的描述。该部分中引用了 的转换,bar并在另一部分中对其进行了全面描述。

您在调试器中看到的原因是您没有在 Eclipse 中正确安装 JDK 源代码,因此它无法进入 JDK 类。String.valueOf()用于在运行时进行字符串转换,字符串连接最终由javac编译器使用StringBuilder该类实现(这就是您看到它的原因)。正如规范所解释的,字符串转换最终使用对象的toString()方法。这就是为什么您要在调试器中浏览该代码的原因。如果您安装了 JDK 源,它会更清晰一些,因为实际的 JDK 源代码会出现,而不是“找不到源”消息。


推荐阅读