当前位置: 首页 > 面试题库 >

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

孔磊
2023-03-14
问题内容

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

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

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


问题答案:

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参考

  • 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布尔逻辑运算符&,^和|


 类似资料:
  • 目标 了解实例化 String 对象和设置其值的多种方法 了解字符串串联和方法链 熟悉 Java 语言的算术运算符 字符串 目前为止,您已经遇到过多种类型的 String。在 Java 语言中,字符串是 String 类型的一级对象,包含可帮助您处理它们的方法。 在 C 语言中,处理字符串需要大量精力,因为它们是您必须操作的 8 位字符组成的以 null 结尾的数组。(在字符串方面,与 C 语言最

  • 问题内容: 假设字符串a和b: 在幕后,他们是同一回事吗? 这里将concat反编译为参考。我也希望能够反编译该+运算符,以查看其作用。 问题答案: 不,不是。 首先,语义上略有不同。如果a是null,则抛出一个,但a+=b将把原来的值a就好像它是null。此外,该方法仅接受值,而+操作员会将参数无提示地转换为String(使用对象的方法)。因此,该concat()方法在接受方面更加严格。 要深入

  • 这章我们来着重介绍一下字符串。 刚刚学习Rust的同学可能会被Rust的字符串搞混掉,比如str,String, OsStr, CStr,CString等等…… 事实上,如果你不做FFI的话,常用的字符串类型就只有前两种。我们就来着重研究一下Rust的前两种字符串。 你要明白的是,Rust中的字符串实际上是被编码成UTF-8的一个字节数组。这么说比较拗口,简单来说,Rust字符串内部存储的是一个u

  • 问题内容: 我想将一些转换成这样的运算符: 如何将变量操作转换为运算符? 问题答案: 您可以尝试以下方法:

  • 现在的Rust资料,无论是Book还是RustByExample都没有统一而完全的介绍Rust的操作符。一个很重要的原因就是,Rust的操作符号和C++大部分都是一模一样的。 一元操作符 顾名思义,一元操作符是专门对一个Rust元素进行操纵的操作符,主要包括以下几个: -: 取负,专门用于数值类型。 *: 解引用。这是一个很有用的符号,和Deref(DerefMut)这个trait关联密切。 !:

  • 本章讲解 Rust 中的类型相关基础知识、运算符相关知识、和字符串的基本知识。