小编典典

+运算符在Java中如何与数字和字符串不同?

java

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

Still +运算符的行为与带数字的加法运算符和带字符串的串联运算符相同。这类似于操作员的重载行为。

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


阅读 221

收藏
2020-11-23

共1个答案

小编典典

Java语言会重载某些运算符吗?

是! 如您所知,运算符+可以表示两种不同的含义,即字符串串联或数字加法。 根据定义 ,这是一个运算符重载。

以下是 所有 Java运算符的列表:

[JLS

3.12运算符](http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#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 + whatever _ 始终_ 是字符串连接
  • referenceType == anotherReferenceType是 _ ALWAYS_ 参考平等
  • 不时髦之类的东西3 * "a lady"或者"my heart" / 2甚至10**3 ~= 999

但是,如上面的代码片段所示,即使操作员超载的当前状态仍然会造成很大的混乱,尤其是对于初学者而言。通过不允许语言外的重载,至少可以限制这种混乱:一旦程序员了解了Java语言中
所有 运算符在各种重载情况下的功能,它们在 所有 Java代码中的确切语义就变得清晰而精确。

操作员重载可能会造成混乱。有人认为它已经足够“糟糕”了。为了允许用户重载Java运算符以执行语言规范之外的事情,只会导致更加混乱。

这是 Java Puzzlers 的摘录 ,《 Puzzle 30:Looper之子》

语言设计者的课程与[其他两个难题]相同。操作员重载可能会造成混淆。也许+不应该为字符串连接重载运算符。提供一个字符串连接运算符可能很值得,但不必如此+


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

不! 这有什么用它做 的一切
。Java编译器所需要做的就是根据语言的语法规则解析程序源代码,并为每个运算符确定操作数的类型。此信息足以推断出运算符的含义,然后根据语言指定采取相应的措施。


附录

JLS参考

2020-11-23