Java 中的字符串操作符有一种特殊用法:正如你所看到的那样,+ 和 += 操作符都可以连接字符串。这种用法感觉十分自然,尽管这并不符合它们的传统使用方式。
对C++
来说这个功能看起来还不错,因此它引入了操作符重载(operator overloading),允许C++
程序员为几乎所有的操作符添加新含义。遗憾的是,操作符重载在和C++
的一些其他限制结合后,变成了一个相当复杂的特性,使得程序员不容易将它们设计到自己的类中。尽管 Java 如果要实现操作符重载的话肯定比C++
中的简单许多(就像C#
语言所演示的那种简单直接的操作符重载),它仍然被认为过于复杂,所以 Java 程序员无法像C++
和C#
程序员那样实现自己的重载操作符。
如果表达式以一个字符串开头,则其后的所有操作数都必须是字符串类型的(编译器会自动把双引号里的字符序列转换成字符串):
// operators/StringOperators.java
public class StringOperators {
public static void main(String[] args) {
int x = 0, y = 1, z = 2;
String s = "x, y, z ";
System.out.println(s + x + y + z);
// 将x转为字符串
System.out.println(x + " " + s);
s += "(summed) = "; // 拼接操作符
System.out.println(s + (x + y + z));
// Integer.toString()的简化版:
System.out.println("" + x);
}
}
/* 输出:
x, y, z 012
0 x, y, z
x, y, z (summed) = 3
0
*/
注意第一个语句的输出是 012,而不是对整数求和得到的 3。这是因为 Java 编译器将 x、y 和 z 转换为它们的字符串表示形式,然后进行了拼接,而不是先将它们相加。第二个打印语句将前面的变量转换为字符串类型,因此字符串转换并不取决于先后顺序。最后,你会看到 += 操作符将一个字符串拼接到变量 s 后,使用括号来控制表达式执行的顺序,因此表达式先对 int 类型的变量进行了求和,然后才显示了结果。
注意 main() 方法里的最后一个示例:你有时会看到一个空的字符串后跟一个 + 和一个基本类型,这是执行类型转换的一种方式,这样就不用调用更麻烦的显式方法(此处为 Integer.toString())。