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

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()

您可能会想到的是,有一个an overload of System.out.println带有一个Object(而不是一个String)-这是编译器将链接到的方法。该方法的特定实现对传入的对象(在运行时)调用toString。虽然这只是代码,但与编译器行为无关。

因此,将一个对象传递给System.out.println“工作”。传入stringBuild+2根本无法编译-+上没有StringBuilder运算符,它需要一个整数。 (而且您不能自己创建一个,因为Java不允许操作符重载。)

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

09-04 20:36