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

问题描述 投票:7回答:6

Java无法执行运算符重载,但对于+String以及其他一些类,Integer可以正常工作。这怎么可能?

更新:为什么这样做有效?

Integer i = 4;
Integer p = 5;

System.out.println(i*p); // prints 20
java string operator-overloading string-concatenation
6个回答
7
投票

+不是运算符重载的示例。语言中将+用作合并运算符算术加法运算符。

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

编辑

由于Integer,它可用于Doubleautoboxing等其他类。

[如果您看一下执行字符串连接的Java程序的字节码,您会发现它创建了StringBuilder并使用了append()方法。 Java编译器看到+运算符,并意识到操作数是字符串而不是原始类型(例如int)。

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

就执行Integer i = 4而言,字节码将表明您实际上在执行Integer i = Integer.valueOf(4)。这称为自动装箱。稍后,当您执行i + p之类的操作,其中ip均为Integer类型时,生成的字节码将显示您正在执行i.intValue() + p.intValue(),其中两种方法的返回类型均为int(实际的字节码指令又是iadd)。

这就是+即使不是真正的原始类型也可以工作Integer的原因。>>


6
投票

由于autoboxing,它适用于像Integer这样的原始包装器。


5
投票

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


2
投票

Java不允许custom


2
投票

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


1
投票

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


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.