为什么+;在Java中使用字符串?

为什么+;在Java中使用字符串?,java,string,operator-overloading,string-concatenation,Java,String,Operator Overloading,String Concatenation,Java不能进行运算符重载,但是+对于String和Integer以及其他一些类来说可以正常工作。这怎么可能 更新: 为什么这样做有效 Integer i = 4; Integer p = 5; System.out.println(i*p); // prints 20 它适用于像Integer这样的基本包装器,因为 它适用于字符串,因为它是: Java语言为字符串连接运算符(+)以及其他对象到字符串的转换提供了特殊支持。字符串连接是通过StringBuilder(或StringBuffer

Java不能进行运算符重载,但是
+
对于
String
Integer
以及其他一些类来说可以正常工作。这怎么可能

更新:
为什么这样做有效

Integer i = 4;
Integer p = 5;

System.out.println(i*p); // prints 20

它适用于像Integer这样的基本包装器,因为

它适用于字符串,因为它是:

Java语言为字符串连接运算符(+)以及其他对象到字符串的转换提供了特殊支持。字符串连接是通过StringBuilder(或StringBuffer)类及其append方法实现的。字符串转换是通过toString方法实现的,该方法由Object定义并由Java中的所有类继承。有关字符串连接和转换的更多信息,请参阅Gosling、Joy和Steele,Java语言规范


+
是一种内置操作。这是一个例外,不是规则。

Java不允许自定义运算符重载,但编译器开发人员仍然可以告诉编译器String1+String2==String1String2,并用正确的连接方法调用替换+运算符。

+
不是运算符重载的示例<代码>+作为一个浓缩运算符和算术加法运算符内置于语言中

这意味着使用Java编写程序的人不能重载运算符,但就Java语言的语法而言,
+
被定义为串联运算符和加法运算符

编辑

它适用于其他类,例如
Integer
Double

如果您查看执行字符串连接的Java程序的字节码,您将看到它创建
StringBuilder
并使用
append()
方法。Java编译器看到
+
运算符,并意识到操作数是字符串而不是基本类型(如
int

如果查看执行整数加法的程序的字节码,您将看到它使用
iadd
指令执行整数加法。这是因为编译器意识到
+
操作的操作数是整数

至于执行类似于
Integer i=4
的操作,字节码将显示您实际执行的是
Integer i=Integer.valueOf(4)
。这叫做自动装箱。稍后,当您执行类似于
i+p
的操作时,
i
p
都是
Integer
类型,生成的字节码将显示您正在执行
i.intValue()+p.intValue()
,其中两个方法的返回类型都是
int
(实际的字节码指令也是
iadd

这就是为什么
+
即使不是实际的基元类型,也能工作
Integer

Java语言为字符串连接运算符(+)以及其他对象到字符串的转换提供了特殊支持

实际上执行的是

(new StringBuilder()).append("string 1").append("string 2").toString()

正如@yan所说,这是例外,而不是规则。字符串在Java中具有特殊的状态。Java语言规范中有一个完整的小节专门讨论作为字符串连接运算符的
+

关于你的更新,这是另一个特例。根据具体情况,Java有时足够聪明,可以在需要
String
s时将非
String
s的内容转换为
String
s。其中一种特殊情况是您描述的情况,其中原语显示在需要
字符串的位置。原语首先转换为它们的引用类型-
Integer
Double
,&c.-然后通过
toString()
方法进入
String
s

另一种特殊情况是,一个
字符串
和一个非
字符串
与字符串连接运算符
+
组合,如中所述


为完整起见:
+
在§15.18的另一部分中描述了其更常见的“一起添加数字”角色。

谢谢。但是为什么它与Integer等其他类一起工作,请参见更新的问题当编译器将源代码分解为Java IL时,运算符只需由编译器解析。有对数字有效的IL级加法、减法、乘法等指令。此外,+是硬编码的,用于处理字符串;编译器将把“a”+“b”翻译成IL级指令,以连接“a”和“b”。谢谢!是否有支持自动装箱的所有类的列表?自动装箱存在于
int
float
double
boolean
short
byte
我相信。
(new StringBuilder()).append("string 1").append("string 2").toString()