为什么Java的+运算符可拼接String与StringBuilder,却无法拼接其他类对象?
Java
+运算符特殊行为原理说明 核心规则
Java是不支持用户自定义运算符重载的,只有+运算符是语言层面唯一做了特殊重载的运算符,仅支持两类合法运算场景,具体规则来自Java语言规范:
- 算术运算场景:两个操作数均为基础数值类型或其对应包装类时,执行数值加法运算
- 字符串拼接场景:只要任意一个操作数为
String类型,编译器就会自动将另一个操作数转换为字符串类型,再执行拼接操作,另一个操作数为任意引用类型时都会自动调用其toString()方法完成转换。
两种场景差异的原因
- 你测试的
new StringBuilder("abc") + new String("zyz")符合字符串拼接场景规则:右侧操作数是String类型,触发拼接逻辑,编译器会自动调用StringBuilder的toString()方法将其转为字符串,再完成拼接,所以不会报错。 - 你测试的
new Person() + d1场景中,两个操作数既不都属于数值类型,也没有任意一个是String类型,没有命中+运算符的任何合法运算规则,所以编译期直接报类型不匹配错误。
补充验证
你可以尝试运行System.out.println(new Person() + "测试字符串");,这段代码是可以正常编译执行的,输出结果为Person对象的toString()返回值拼接"测试字符串"的结果,进一步印证了上述规则的有效性。
内容的提问来源于stack exchange,提问作者abc123
相关产品推荐
相关产品推荐

