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

标签 java operator-overloading

从 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=执行引用复制,所以 ab现在指的是相同的值。结果,比较将产生“相等”,因为对象将与自身相等。

副本和引用之间的差异只会增加运算符重载的困惑。正如@Sebastian 提到的,Java 和 C# 都必须分别处理值和引用相等性 -- operator+可能会处理值和对象,但 operator=已经实现来处理引用。

在 C++ 中,您应该一次只处理一种比较,这样就不会那么困惑。例如,在 Complex , operator=operator==都在研究值——分别复制值和比较值。

关于java - 为什么 Java 不提供运算符重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77718/

相关文章:

java - Glassfish 将字符串 "ejb"附加到特定 mobule 的 EJB 的 JNDI

java - 我们如何在没有logstash和beats的情况下通过java将数据摄取到 Elasticsearch

java - 有效地查找数组中的最大元素

c++ - 在模板类中重载下标运算符

c++ - 为什么需要运算符重载?

java - XSLT - 获取区域设置的时区偏移量

java - 在 Java 中比较整数

c++ - 链表中的后增量运算符

C++11 为 std::chrono::time_point 添加流输出运算符

c++ - 隐式转换运算符不参与运算符重载