+运算符对Java中的数字和字符串的行为有何不同?

Java没有运算符重载的概念。

Still +运算符表现为带数字的加法运算符,并将运算符与字符串连接起来。 这类似于运算符重载行为。

那么,Java是否有运算符重载?

Java语言是否会使某些运算符超载?

是! 正如您所知,运算符+可能意味着两个不同的东西,字符串连接或数字加法。 根据定义 ,这是操作员过载。

这是所有 Java运算符的列表:

JLS 3.12运算符

以下37个令牌是由ASCII字符组成的运算符:

  = > < ! ~ ? : == <= >= != && || ++ -- + - * / & | ^ % << >> >>> += -= *= /= &= |= ^= %= <<= >>= >>>= 

其中一些运营商超载。 这里有些例子:

 System.out.println( 3 + 4 + "X" ); // prints "7X" System.out.println( 3 + (4 + "X") ); // prints "34X" System.out.println( "X" + 3 + 4 ); // prints "X34" System.out.println( "X" + (3 + 4) ); // prints "X7" System.out.println(0 == 0); // prints "true" System.out.println(new Integer(0) == new Integer(0)); // prints "false" System.out.println(true & (1 & 2) == 12); // prints "false" 

我们可以重载Java语言中定义的运算符吗?

绝对不! 所有Java运算符都完全按照语言规范的指定。 没有“语言外”的语义:Java操作员永远不能做一些语言没有指定的东西。

也就是说, 除非语言发生变化否则以下是保证的事实:

  • someString + whateverALWAYS字符串连接
  • referenceType == anotherReferenceType 始终是引用相等
  • 没有像3 * "a lady""my heart" / 2甚至10**3 ~= 999这样的时髦的东西

然而,正如上面的代码片段所示,即使当前的运算符重载状态仍然会非常混乱,特别是对于初学者。 通过不允许语言外过载,至少这种混淆是有限的:一旦程序员了解Java语言中的所有运算符在各种重载场景中的作用,它们在所有 Java代码中的确切语义就变得清晰和精确。

运算符重载可能非常混乱。 有些人认为它已经“糟糕”了。 允许用户重载Java操作符以执行语言规范之外的操作只会导致更多的混淆。

这是Java Puzzlers的摘录,Puzzle 30:Looper的儿子

语言设计师的课程与[另外两个谜题]相同。 运算符重载可能会令人困惑。 也许+运算符不应该因字符串连接而过载。 提供字符串连接运算符可能是值得的,但它不一定是+


您是否需要C ++来支持Java中的运算符重载?

不! 这完全与它无关。 Java编译器需要做的就是根据语言的语法规则解析程序源代码,并为每个操作符确定操作数的类型。 这些信息足以推断出运营商的意义,然后按照语言的规定采取相应的行动。


附录

JLS参考

  • 15.18加法运算符
    • 15.18.1字符串连接运算符+
    • 15.18.2数值类型的加法运算符(+和 – )
  • 15.21平等运营者
    • 15.21.1数值等式算子==和!=
    • 15.21.2布尔等式运算符==和!=
    • 15.21.3参考等式运算符==和!=
  • 15.22按位和逻辑运算符
    • 15.22.1整数按位运算符&,^和|
    • 15.22.2布尔逻辑运算符&,^和|

揭示问题

  • 为什么char +另一个char =一个奇怪的数字
  • 是否保证Java中的新Integer(i)== i?
  • 在Java中比较两个整数时会发生自动拆箱吗?
  • Java String.equals与==

它基本上是运算符重载 – 只是内置于语言中。

“Java没有运算符重载的概念”只是真的,因为开发人员不能超载运算符。

语言规范可以严格地说,所有算术运算符都被重载以处理涉及多个数值类型的计算。 甚至在那里,它有时会产生混淆(例如,如果你想要一个int值的div来产生分数结果,必须将一个操作数转换为double )。

+运算符IS重载。 Java只是阻止你自己重载它。

Concat运算符是Java提供的特殊支持。 以下是Javadoc的引用。

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

有关信息,请参阅此内容

Java中运算符的多态处理是运算符重载的一种forms,因为传统上使用该术语。 例如,阅读关于运算符重载的维基百科页面,您将看到第一段中提到的Java样式的重载。

“在计算机编程中,运算符重载(不太常见的称为运算符ad-hoc多态性)是多态的一个特定情况,其中部分或全部运算符(如+,=或==)具有不同的实现,具体取决于其参数的类型。有时,重载是由语言定义的;有时程序员可以实现对新类型的支持。“

您正在谈论的function只是内置于Java中。 您仍然无法控制运算符重载。

Java不允许程序员重载运算符,但内置类型的操作符内置支持(我认为String是唯一支持任何运算符的对象,而不是自动装箱的东西)。

我觉得这种行为更像是一种类型的隐式转换,而不是像运算符重载一样。

Java中没有运算符重载,因为程序员不能自己超载任何运算符。 但是,Java语言具有某种集成的运算符重载,它根据上下文为+运算符分配不同的行为。

操作符被编译成不同的字节码指令,具体取决于操作数:

对于String“addition”,将在后台创建并使用StringBuilder

对于int添加,使用JVM命令iadd。

对于双重添加,使用JVM命令dadd。

等等…