繁体   English   中英

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

[英]Why does + work with Strings in Java?

Java 不能进行运算符重载,但+StringInteger以及其他一些类可以正常工作。 这怎么可能?

更新:
为什么这样做?

Integer i = 4;
Integer p = 5;

System.out.println(i*p); // prints 20

+不是运算符重载的示例。 +作为连接运算符算术加法运算符内置于语言中。

这意味着用 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即使它们不是实际的原始类型。

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

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

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

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

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的地方。 原语首先被转换成它们的引用类型IntegerDouble 、&c。 — 然后通过toString()方法进入String

另一种特殊情况是当一个String和一个非String与字符串连接运算符+ ,如JLS §5.4 — String Conversion 中所述

为完整起见: +在其更常见的“将数字加在一起”的作用在 §15.18, §15.18.2的另一部分中进行了描述- 数字类型的加法运算符(+ 和 -)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM