Java无法执行运算符重载,但对于+
和String
以及其他一些类,Integer
可以正常工作。这怎么可能?
更新:为什么这样做有效?
Integer i = 4;
Integer p = 5;
System.out.println(i*p); // prints 20
+
不是运算符重载的示例。语言中将+
用作合并运算符和算术加法运算符。
这意味着用Java编写程序的人不能重载运算符,但是就Java语言的语法而言,+
被定义为连接和加法运算符。
编辑
由于Integer
,它可用于Double
和autoboxing等其他类。
[如果您看一下执行字符串连接的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
的原因。>>
由于autoboxing,它适用于像Integer这样的原始包装器。
+
是内置操作。这是一个例外,而不是规则。
Java不允许custom
Java语言为字符串连接运算符(+)以及将其他对象转换为字符串提供了特殊的支持。
正如@yan所说,这是例外,不是规则。字符串在Java中具有特殊状态。 Java语言规范的整个小节专门介绍+
作为字符串连接运算符:§15.18.1。