为什么+;在Java中使用字符串?
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
+
对于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()