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

时间:2010-06-02 07:11:15

标签: java

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

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

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

9 个答案:

答案 0 :(得分:16)

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

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

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

答案 1 :(得分:13)

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

是! 正如您所知,运算符+可能意味着两种不同的东西,字符串连接或数字加法。这是按照定义,一个运算符重载。

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

  

JLS 3.12 Operators

     

以下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 始终 参考平等
  • 没有像3 * "a lady""my heart" / 2或甚至10**3 ~= 999
  • 这类时髦的东西

正如上面的代码段所示,即使是当前的运算符重载状态仍然会让人感到困惑,特别是对于初学者而言。通过不允许超语言重载,至少这种混淆是有限的:一旦程序员了解了Java语言中的运算符 all 在各种重载场景中做了什么,它们在 all <中的确切语义/ em> Java代码变得清晰和精确。

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

以下摘录自 Java Puzzlers,Puzzle 30:Looper之子

  

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


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

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


附录

JLS参考

揭示问题

答案 2 :(得分:10)

+运算符IS重载。 Java只会阻止你自己超载。

答案 3 :(得分:5)

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

  

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

有关信息,请参阅this

答案 4 :(得分:4)

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

  

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

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

对于字符串“添加”,在后台创建并使用StringBuilder

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

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

等...

答案 8 :(得分:0)

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