字符串显然可以是concatinated,并且无论如何都是原始数字类型。此外,人们可以连接路径和字符串等。这在java内部如何工作?是否有一些隐藏的c ++ - 类似的运算符定义?
答案 0 :(得分:2)
Java中没有运算符重载。所有这些都是编译器内部的。
当Java编译器翻译您的程序时,它知道每个表达式和子表达式的编译时类型。当它在一侧看到+
表达式String
时,它会应用字符串连接。当它看到两种不同的类型时,它会应用类型提升规则,依此类推。这个过程类似于支持运算符重载的语言中的重载解析,但它完全对使用该语言的程序员隐藏。
答案 1 :(得分:0)
+运算符用作加法运算符或字符串连接运算符。选择取决于操作数,即它们是原始数字类型,例如:int,short,long,float,double等.java编译器执行加法运算。但是,如果任何操作数是字符串,则它执行连接。 15.18.1字符串连接运算符+ 如果只有一个操作数表达式是String类型,那么字符串转换(第5.1.11节) 在另一个操作数上执行以在运行时生成一个字符串。 字符串连接的结果是对String对象的引用 两个操作数字符串的串联。左手操作数的字符 在新创建的字符串中位于右侧操作数的字符之前。 除非表达式是常量,否则将新创建String对象(第12.5节) 表达式(§15.28)。 实现可以选择一步执行转换和连接 避免创建然后丢弃中间String对象。要增加 重复字符串连接的性能,Java编译器可能使用StringBuffer 类或类似技术,以减少中间String对象的数量 通过评估表达式创建。 对于基本类型,实现还可以优化包装器的创建 对象通过直接从基本类型转换为字符串。 [链接] [http://docs.oracle.com/javase/specs/#39990]页面564