Java 中的字符串操作符有一种特殊用法:正如你所看到的那样,+ 和 += 操作符都可以连接字符串。这种用法感觉十分自然,尽管这并不符合它们的传统使用方式。

    C++来说这个功能看起来还不错,因此它引入了操作符重载(operator overloading),允许C++程序员为几乎所有的操作符添加新含义。遗憾的是,操作符重载在和C++的一些其他限制结合后,变成了一个相当复杂的特性,使得程序员不容易将它们设计到自己的类中。尽管 Java 如果要实现操作符重载的话肯定比C++中的简单许多(就像C#语言所演示的那种简单直接的操作符重载),它仍然被认为过于复杂,所以 Java 程序员无法像C++C#程序员那样实现自己的重载操作符。

    如果表达式以一个字符串开头,则其后的所有操作数都必须是字符串类型的(编译器会自动把双引号里的字符序列转换成字符串):

    1. // operators/StringOperators.java
    2. public class StringOperators {
    3. public static void main(String[] args) {
    4. int x = 0, y = 1, z = 2;
    5. String s = "x, y, z ";
    6. System.out.println(s + x + y + z);
    7. // 将x转为字符串
    8. System.out.println(x + " " + s);
    9. s += "(summed) = "; // 拼接操作符
    10. System.out.println(s + (x + y + z));
    11. // Integer.toString()的简化版:
    12. System.out.println("" + x);
    13. }
    14. }
    15. /* 输出:
    16. x, y, z 012
    17. 0 x, y, z
    18. x, y, z (summed) = 3
    19. 0
    20. */

    注意第一个语句的输出是 012,而不是对整数求和得到的 3。这是因为 Java 编译器将 x、y 和 z 转换为它们的字符串表示形式,然后进行了拼接,而不是先将它们相加。第二个打印语句将前面的变量转换为字符串类型,因此字符串转换并不取决于先后顺序。最后,你会看到 += 操作符将一个字符串拼接到变量 s 后,使用括号来控制表达式执行的顺序,因此表达式先对 int 类型的变量进行了求和,然后才显示了结果。

    注意 main() 方法里的最后一个示例:你有时会看到一个空的字符串后跟一个 + 和一个基本类型,这是执行类型转换的一种方式,这样就不用调用更麻烦的显式方法(此处为 Integer.toString())。