为什么Java不提供操作符重载?

问题:

从C ++到Java,明显的未答复的问题是为什么Java不包括操作符重载?
Complex a, b, c; a = b + c;不比Complex a, b, c; a=b.add(c);简单得多
是否有一个已知的原因,not的有效参数允许运算符重载?原因是任意的,还是时间流逝?

回答:

假设您想要覆盖由’a’引用的对象的先前值,则必须调用成员函数。

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

在C ++中,此表达式指示编译器在堆栈上创建3个对象,将临时对象中的结果值添加到copy到现有对象“a”。
但是,在java中,operator =不执行引用类型的值拷贝,用户只能创建新的引用类型,而不是值类型。因此,对于名为“复合”的用户定义类型,分配意味着将引用复制到现有值。
考虑:

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

在C ++中,这将复制该值,因此比较结果不等于。在Java中,operator =执行引用复制,所以’a’和’b’现在指的是相同的值。因此,比较将产生“相等”,因为对象将与其自身的比较相等。
副本和引用之间的区别只会增加操作员重载的混淆。正如塞巴斯蒂安所提到的那样,Java和C#都必须分别处理价值和参考等级 – 操作符+可能处理值和对象,但是operator =已经被实现来处理引用。
在C ++中,你一次只应该处理一种比较,所以可以减少混淆。例如,在Complex上,operator =和operator ==都在使用值 – 分别复制值和比较值。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Why doesn’t Java offer operator overloading?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

55 + = 64