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

Rol*_*all 2 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
Run Code Online (Sandbox Code Playgroud)

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

And*_*yle 6

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

你可能想到的是,有一个重载System.out.println需要一个Object(而不是一个字符串) - 这是编译器链接到的方法.并且该方法的这个特定实现调用toString传入的Object(在运行时).这只是代码,它与编译器行为无关.

所以传入一个对象System.out.println"工作".传入stringBuild+2只是不编译 - 没有+运算符在StringBuilder其上采用int.(并且你不能自己创建一个,因为Java不允许运算符重载.)

正如ADTC和tom指出的那样,有一个隐式字符串转换,第二个参数是字符串连接(字符串的+运算符).因此,虽然stringBuild没有+运营商,stringBuild.toString()但是,你可以打电话stringBuild.toString()+2.