为什么Java不需要运算符重载?

时间:2010-08-24 18:07:11

标签: java operator-overloading

为什么Java不需要运算符重载?有没有什么方法可以在Java中支持它?

10 个答案:

答案 0 :(得分:15)

Java仅允许对基本数字类型进行算术运算。这是一个混合的祝福,因为虽然在其他类型(如复数,向量等)上定义运算符很方便,但总是存在依赖于实现的特性。因此,运营商并不总能按照您的期望去做。通过避免运算符重载,它更透明,当调用函数时。一些人的眼中有明智的设计。

答案 1 :(得分:8)

Java不需要“运算符重载”,因为没有语言需要

a + b只是a.Add(b)的“语法糖”(实际上,有些人认为a.Add(b)只是Add(a,b)的语法糖

答案 2 :(得分:6)

This related question可能有所帮助。简而言之,由于C ++中的重载问题,在设计Java时有意避免了运算符重载。

Scala是一种较新的JVM语言,其语法允许方法重载该函数,就像运算符重载一样,没有C ++运算符重载的限制。例如,在Scala中,可以定义名为+的方法。也可以在方法调用中省略.运算符和括号:

case class A(value: Int) {
   def +(other: A) = new A(value + other.value)
}

scala> new A(1) + new A(3)                                                           
res0: A = A(4)

答案 3 :(得分:5)

答案 4 :(得分:4)

java-oo compiler plugin可以在Java中添加运算符重载支持。

答案 5 :(得分:3)

Java不支持程序员的运算符重载。这与声明Java不需要运算符重载不同。

运算符重载是语法糖,用于表示使用(算术)符号的操作。出于显而易见的原因,Java编程语言的设计者选择省略对语言中的运算符重载的支持。此声明可在 Java Language Environment whitepaper

中找到
  

没有提供任何手段   程序员可以超载标准   算术运算符。再一次,   运算符重载的影响可以   通过声明一个轻松实现   class,适当的实例变量,   和适当的操纵方法   那些变数。消除操作员   超载导致伟大   简化代码。

在我个人看来,这是一个明智的决定。请考虑以下代码:

String b = "b";
String c = "c";
String a = b + c;

现在,很明显bc被连接起来以产生a。但是,如果考虑使用支持运算符重载的假设语言编写的以下代码段,则很明显使用运算符重载不会产生可读代码。

Person b = new Person("B");
Person c = new Person("C");
Person a = b + c;

为了理解上述操作的结果,必须查看Person类的重载加法运算符的实现。当然,这会导致繁琐的调试会话,并且代码更好地实现为:

Person b = new Person("B");
Person c = new Person("C");
Person a = b.copyAttributesFrom(c);

答案 6 :(得分:2)

并不是说java不需要“运算符重载”,它只是由其创建者做出的选择,希望保持语言更简单。

答案 7 :(得分:2)

好吧......我们有一个非常讨论和常见的问题。今天,在软件行业,主要有两种不同类型的语言:

  • 低级语言
  • 高级语言

这种区别在大约10年前是有用的,目前的情况有点不同。 今天我们讨论业务就绪应用程序。 商业模式是一些特定的模型,其中程序需要满足许多要求。它们非常复杂和严格,以至于使用c或c ++这样的语言编写应用程序将花费大量时间。出于这个原因,发明了混合语言。

我们通常知道两种语言:

  • 编译
  • 被解释的

嗯,今天还有另外一个:

  • 编译/解释:用一个词:MANAGED。

托管语言是为了生成另一个代码而编译的语言,这些代码与原始代码不同,但处理起来要复杂得多。然后,这个中级语言由运行最终程序的程序进行插入。

这是我们从Java中了解到的常见动态...它是一种适用于业务就绪应用程序的成功方法。 那么,现在回答你的问题...

运算符重载是一个涉及多级继承和低级语言的其他高级特性的问题。 Java,以及C#,Python等,是一种托管语言,易于编写,可用于在极短的时间内构建复杂的应用程序。 如果我们在Java中包含运算符重载,那么语言将变得更加复杂并且难以处理。

如果你用C ++编程,你肯定明白运算符重载是一个非常非常微妙的问题,因为它可能导致非常复杂的情况,有时编译器可能会因为冲突而拒绝编译等等...引入运算符重载是为了要小心。它非常强大,但是我们付出了这么大的力量,需要处理大量的问题。

OKOK它是真的,你可能会告诉我:“嘿,但C#使用运算符重载......你到底在告诉我什么?为什么c#支持它们而Java不支持?”。 嗯,这就是答案。 C#,是的,实现了运算符重载,但它不像C ++。有许多运算符不能在c#中重载,比如“new”或许多其他你可以在c ++中重载...所以C#支持运算符重载,但是比c ++或其他完全支持它的语言要低得多。但这对早先的问题不是一个好的答案...... 真正的答案是C#比Java更复杂。这是一个专业人士,但也是一个骗局。决定语言的位置是一个问题:高水平,高水平,非常高水平? 好吧,Java不支持op重载,因为它希望快速且易于管理和使用。在引入op重载时,语言还必须承载由此新功能引起的大量问题。

这就像质疑:“为什么Java不支持多重继承?” 因为管理起来非常复杂。考虑一下......对于托管语言来说,支持多重继承是不可能的......没有通用的类树,没有对象类作为所有类的公共基类,没有向上转换的可能性(安全)和许多问题需要处理,管理,预见,保持计数...

Java希望变得简单。 即使我相信这种语言的未来实现将导致支持op重载,您将看到重载动态将涉及到在C ++中重载的所有可能性的更少集合。

这里的许多其他人也告诉过你,重载是没用的。 嗯,我属于那些认为这不正确的人。 好吧,如果你这样认为(op重载是没用的),那么托管语言的许多其他功能也是无用的。想想接口,类等等,你真的不需要它们。您可以使用抽象类进行接口实现......让我们看一下c#...这么多糖语法,LINQ等等,它们并不是真的有必要,但是它们可以加快您的工作...... 好吧,在托管语言中,所有加速开发过程的东西都是受欢迎的,并不意味着无用。如果您认为这些功能没有用,那么整个语言本身就没用了,我们都会回来用c ++,ada等编写复杂的应用程序。管理语言的附加价值就是要在这些元素上进行测量。

Op重载是一个非常有用的功能,它可以用Java等语言实现,这会改变语言结构和目的,这将是一件好事,但也是一件坏事,只是一个品味问题。 但是今天,Java比C#更简单,因为Java不支持op重载。

我知道,也许我有点长,但希望它有所帮助。再见

答案 8 :(得分:1)

Java不支持运算符重载(一个引用是Wikipedia Operator Overloading页面)。这是Java创建者的一项设计决策,旨在避免在其他语言(尤其是C ++)中运算符重载时出现的问题。

答案 9 :(得分:0)

检查Java Features Removed from C and C++ p 2.2.7不再有操作员重载。

  

没有提供任何手段   程序员可以超载标准   算术运算符。再一次,   运算符重载的影响可以   通过声明一个轻松实现   class,适当的实例变量,   和适当的操纵方法   那些变数。消除操作员   超载导致伟大   简化代码。