Java 在这种情况下,编译器中实际发生了什么

Java 在这种情况下,编译器中实际发生了什么,java,compiler-construction,stringbuilder,Java,Compiler Construction,Stringbuilder,鉴于以下片段,我有一个小问题: StringBuilder stringBuild = new StringBuilder(3); stringBuild.append("hello"); System.out.println(stringBuild+2); // if I omit the (+2) bit hence only stringBUild it works 它是否仅在某些情况下对对象自动调用toString()?(情况:要么根本没有操作,要么以前的字符串继续)编译器从不隐式调用

鉴于以下片段,我有一个小问题:

StringBuilder stringBuild = new StringBuilder(3);
stringBuild.append("hello");
System.out.println(stringBuild+2); // if I omit the (+2) bit hence only stringBUild it works

它是否仅在某些情况下对对象自动调用
toString()
?(情况:要么根本没有操作,要么以前的字符串继续)

编译器从不隐式调用方法参数上的
toString()

您可能想到的是,有一个函数接受
对象(而不是字符串)-这是编译器将链接到的方法。这个方法的特定实现在传入的对象(运行时)上调用
toString
。这只是代码,与编译器行为无关

因此,将一个对象传递到
System.out.println
“起作用”。传入
stringBuild+2
根本无法编译-在
StringBuilder
上没有接受int的
+
运算符(而且您自己也不能创建一个,因为Java不允许运算符重载)


正如ADTC和tom所指出的那样,存在隐式字符串转换,第二个参数是字符串连接(字符串的
+
运算符)。因此,虽然
stringBuild
没有
+
操作符,
stringBuild.toString()
会有,您可以调用
stringBuild.toString()+2

,但您可能需要添加Java中没有自定义操作符重载。所有算术运算符仅用于算术运算,用于字符串串联的
+
除外(还有其他吗?)。
+
符号仅适用于
字符串类型的对象。因此,执行
stringBuild.toString()+2
将有效。隐式调用
toString()
的示例:
“hello”+新对象(){public String toString(){return“world!”;}
。请参考JLS和。谢谢这两个-很好的观点,我已将它们包括在答案中@tom,我从字符串转换中得到的信息只有strign串联运算符才会发生。如果您知道发生这种情况的另一种情况,请告诉我。