java - 当我调用 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 语言规范中有完整的描述。该部分中引用了 的转换,bar
并在另一部分中对其进行了全面描述。
您在调试器中看到的原因是您没有在 Eclipse 中正确安装 JDK 源代码,因此它无法进入 JDK 类。String.valueOf()
用于在运行时进行字符串转换,字符串连接最终由javac
编译器使用StringBuilder
该类实现(这就是您看到它的原因)。正如规范所解释的,字符串转换最终使用对象的toString()
方法。这就是为什么您要在调试器中浏览该代码的原因。如果您安装了 JDK 源,它会更清晰一些,因为实际的 JDK 源代码会出现,而不是“找不到源”消息。
推荐阅读
- python-3.x - sklearn:修改隔离森林参数的权重
- apache-spark - 一些 YARN 工作节点未加入集群,而我在 Dataproc 上创建 spark 集群
- python - Python变量范围,为什么funcs打印相同的值?
- sql - Big Query - 使用视图管理用户访问
- android - 如何在 Android Studio 中将 AVD 模拟器缩放到 1:1?
- c# - 每次在c#中以编程方式单击按钮时如何添加组合框的新实例
- r - R中零点之间向量的总和
- java - 不使用 Spring Data QBE 调用 JPA Hibernate Converter
- c# - 关闭一个表单并打开另一个而不结束应用程序
- javascript - 如何测试使用 Teaspoon-mocha 和 Sinon 重新加载位置的功能