[英]Why does + work with Strings in Java?
Java 不能进行运算符重载,但+
对String
和Integer
以及其他一些类可以正常工作。 这怎么可能?
更新:
为什么这样做?
Integer i = 4;
Integer p = 5;
System.out.println(i*p); // prints 20
+
不是运算符重载的示例。 +
作为连接运算符和算术加法运算符内置于语言中。
这意味着用 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 不允许自定义运算符重载,但编译器开发人员仍然可以告诉编译器 String1 + String2 == String1String2,并替换 + 运算符的正确连接方法调用。
Java 语言为字符串连接运算符 ( + ) 以及将其他对象转换为字符串提供了特殊支持。
String s = "string 1" + "string 2";
实际执行的是
(new StringBuilder()).append("string 1").append("string 2").toString()
正如@yan 所说,这是例外,而不是规则。 字符串在 Java 中具有特殊的地位。 Java 语言规范中有一个完整的小节专门针对+
作为字符串连接运算符的作用:第15.18.1 节。
关于您的更新,这是另一个特殊情况。 Java是有时,视情况而定,足够聪明到事情是不是转换String
s转换String
■当String
都需要秒。 其中一种特殊情况是您所描述的,其中原语出现在需要String
的地方。 原语首先被转换成它们的引用类型Integer
、 Double
、&c。 — 然后通过toString()
方法进入String
。
另一种特殊情况是当一个String
和一个非String
与字符串连接运算符+
,如JLS §5.4 — String Conversion 中所述。
为完整起见: +
在其更常见的“将数字加在一起”的作用在 §15.18, §15.18.2的另一部分中进行了描述- 数字类型的加法运算符(+ 和 -) 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.