为什么+使用Java中的Strings?

Vex*_*toR 7 java string operator-overloading string-concatenation

Java不能执行运算符重载,但+对于StringInteger其他一些类都可以正常工作.这怎么可能?

更新:
为什么这样做?

Integer i = 4;
Integer p = 5;

System.out.println(i*p); // prints 20
Run Code Online (Sandbox Code Playgroud)

Viv*_*ath 7

+不是运算符重载的示例.+作为连接运算符算术加法运算符构建在语言中.

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

编辑

它适用于其他类,如IntegerDouble由于自动装箱.

如果您查看执行字符串连接的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即使它们不是真正的原始类型.


Isa*_*ett 6

由于自动装箱,它适用于像Integer这样的原始包装器.

它适用于String,因为这是串联字符串特殊情况:

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


yan*_*yan 5

+是一个内置的操作.这是一个例外,不是一个规则.