当我调用System.out.println(“ foo” + bar)时到底发生了什么?

时间:2018-11-28 03:09:20

标签: java

通过以下链接,我发现了System.out.println(Object obj)的工作方式:How an object will call toString method implicitly?

但是,我仍然有些困惑。因此,我想这更多是一个附加/串联(我不知道正确的术语),但是当我同时调用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)行:不可用;找不到来源。然后,再次进入后,我得到了相同类型的错误页面,但出现了StringBuilder.append(Object)。然后,我再次进入,想要输出的所有内容均已正确输出。是什么让这些中介例外页面出现?

1 个答案:

答案 0 :(得分:0)

该上下文中的+运算符进行字符串连接。 Java Language Specification中充分描述了字符串连接。该部分引用了bar的转换,并在another section中进行了完整的描述。

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

相关问题