为什么Java不需要运算符重载?有没有什么方法可以在Java中支持它?
答案 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;
现在,很明显b
和c
被连接起来以产生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 ++这样的语言编写应用程序将花费大量时间。出于这个原因,发明了混合语言。
我们通常知道两种语言:
嗯,今天还有另外一个:
托管语言是为了生成另一个代码而编译的语言,这些代码与原始代码不同,但处理起来要复杂得多。然后,这个中级语言由运行最终程序的程序进行插入。
这是我们从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,适当的实例变量, 和适当的操纵方法 那些变数。消除操作员 超载导致伟大 简化代码。