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

Abh*_*ain 13 java

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

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

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

Mic*_*rdt 16

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

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

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


pol*_*nts 13

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

是!正如您所知,运算符+可以表示两种不同的东西,字符串连接或数字加法.根据定义,这是操作员过载.

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

JLS 3.12运算符

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

  =     >     <     !     ~     ?      :
  ==    <=    >=    !=    &&    ||     ++     --
  +     -     *     /     &     |      ^      %     <<     >>    >>>
  +=    -=    *=    /=    &=    |=     ^=     %=    <<=    >>=   >>>=
Run Code Online (Sandbox Code Playgroud)

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

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"
Run Code Online (Sandbox Code Playgroud)

我们可以重载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参考

揭示问题


Kha*_*han 10

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

  • @Abishek:正如您所发现的那样,Java中有*运算符重载. (9认同)

bdh*_*har 5

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

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

有关信息,请参阅此内容


归档时间:

查看次数:

843 次

最近记录:

11 年,2 月 前