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

时间:2013-06-19 07:49:39

标签: 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()? (情况:根本没有操作或以前的字符串继承)

1 个答案:

答案 0 :(得分:6)

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

您可能正在考虑的是,an overload of System.out.println采用Object(而不是字符串) - 这是编译器链接到的方法。并且该方法的这个特定实现在传入的Object上调用toString(在运行时)。这只是代码,它与编译器行为无关。

因此将对象传递给System.out.println“可行”。传递stringBuild+2根本就不能编译 - +上没有StringBuilder运算符,它接受一个int。 (并且你不能自己创建一个,因为Java不允许运算符重载。)

正如ADTC和tom指出的那样,有一个隐式字符串转换,其中 second 参数用于字符串连接(字符串的+运算符)。因此,虽然stringBuild没有+运算符,stringBuild.toString()会,而可以调用stringBuild.toString()+2