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

Java为什么不提供运算符重载?

卓星波
2023-03-14
问题内容

从C ++到Java,一个显而易见的未解决问题是Java为什么不包括运算符重载?

没有Complex a, b, c; a = b + c;比这简单Complex a, b, c; a = b.add(c);吗?

是否存在已知的原因,有效的论据,不使运算符重载?原因是任意的还是迷失了时间?


问题答案:

假设你想覆盖所引用的对象的先前值a,则必须调用成员函数

Complex a, b, c;
// ...
a = b.add(c);

在C ++中,此表达式告诉编译器在堆栈上创建三(3)个对象,执行加法,然后将结果值从临时对象复制到现有对象中a

但是,在Java中,operator=不对引用类型执行值复制,并且用户只能创建新的引用类型,而不能创建值类型。因此,对于名为的用户定义类型Complex,赋值意味着将引用复制到现有值。

请考虑:

b.set(1, 0); // initialize to real number '1'
a = b; 
b.set(2, 0);
assert( !a.equals(b) ); // this assertion will fail

在C ++中,这会复制值,因此比较结果将不相等。在Java中,operator=执行引用复制,因此a和b现在都引用相同的值。结果,由于对象将比较等于自身,因此比较将产生“等于”。

复制和引用之间的差异只会增加操作符重载的混乱。正如@Sebastian提到的那样,Java和C#都必须分别处理值和引用相等性- operator+可能会处理值和对象,但是operator=已经实现了处理引用的问题。

在C ++中,你一次只能处理一种比较,因此可以减少混乱。例如,在Complexoperator=并且operator==都致力于价值-复制值分别比较值。



 类似资料:
  • 问题内容: 已关闭 。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答。 3年前关闭。 改善这个问题 Java为什么不需要运算符重载?Java有什么方法可以支持它吗? 问题答案: Java仅允许对基本数字类型进行算术运算。这是喜忧参半的事情,因为尽管在其他类型(如复数,向量等)上定义运算符很方便,但始终存在与实现相关的特性。因此,运营

  • targetPixValList是一个包含Double对象的列表,它也包含列表中连续位置的相似值,当我尝试使用Code_1比较两个Double值时,cnt返回零。当我使用code_2时,cnt返回值。 列表的类型是 为什么“==”运算符不能与Double一起使用? 代码_1: Code_2:

  • 我使用GWT2.7,并希望在我的应用程序中提供带有级别信息和警告的日志记录。在我的gwt.xml文件中,我有: 它在开发模式下工作得很好,但在SuperDevMode中,我只能记录严重的日志级别。 为什么SuperDevMode只提供LogLevel严重?

  • 前面章节介绍了 Python 中的各个序列类型,每个类型都有其独特的操作方法,例如列表类型支持直接做加法操作实现添加元素的功能,字符串类型支持直接做加法实现字符串的拼接功能,也就是说,同样的运算符对于不同序列类型的意义是不一样的,这是怎么做到的呢? 其实在 Python 内部,每种序列类型都是 Python 的一个类,例如列表是 list 类,字典是 dict 类等,这些序列类的内部使用了一个叫作

  • 问题内容: 有人知道为什么JUnit 4提供但不提供方法吗? 它提供了(对应于)和(对应于),因此它们似乎没有包含在内就显得很奇怪。 顺便说一下,我知道JUnit插件提供了我正在寻找的方法。我只是出于好奇而问。 问题答案: 我建议您使用较新的样式断言,该断言可以轻松描述各种否定形式,并在断言失败时自动构建对您的期望和得到的结果的描述: 这三个选项都是等效的,请选择最容易阅读的一个。 要使用方法的简

  • 我很想知道为什么Java的可选不提供类似于流的方法。 接口的method javadoc声明: @apiNote此方法主要用于支持调试,您希望在元素流经管道中的某个点时看到这些元素 这几乎完全描述了我的用例: (返回 方法,上述所有内容都会转换为: 也可以这样做(参见此答案): 并将其与方法一起使用: 但我认为这是一个黑客,而不是的干净用法。 从Java 9开始,可以将< code>Optiona