java在这种情况下编译器中实际发生了什么
鉴于以下片段,我有一个小问题:
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()
?(情况:要么根本没有操作,要么之前的字符串继续)
# 1 楼答案
编译器从不隐式地对方法参数调用
toString()
你可能想的是,有一个an overload of ^{} 需要一个
Object
(而不是一个字符串)——这是编译器将链接到的方法。该方法的这个特定实现对传入的对象(在运行时)调用toString
。不过这只是代码,与编译器行为无关因此,将一个对象传递给
System.out.println
“works”。传入stringBuild+2
根本无法编译-在StringBuilder
上没有+
运算符,它接受一个int(而且你不能自己创建一个,因为Java不允许运算符重载)正如ADTC和tom所指出的,通过第二个参数到字符串连接(字符串的
+
运算符),存在隐式字符串转换。所以,虽然stringBuild
没有+
操作符,stringBuild.toString()
会有,而你可以调用stringBuild.toString()+2