为什么Java不需要操作符重载?

12 浏览
0 Comments

为什么Java不需要操作符重载?

为什么Java不需要操作符重载?有没有办法在Java中支持操作符重载?

0
0 Comments

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

在设计Java时,故意避免了运算符重载,原因是C++中运算符重载存在的问题。

相比之下,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)

在这种情况下,Scala中的+方法实现了两个对象的相加操作,而不是像Java那样使用+运算符。

因此,Java不需要运算符重载,因为它可以通过使用命名的方法实现相同的功能。这种方式更加直观和易于理解,也减少了由于运算符重载导致的潜在问题。

0
0 Comments

为什么Java不需要操作符重载?

操作符重载是一种语法糖,它使得使用操作符来调用方法更加方便。但实际上,操作符重载并不是必需的,因为没有任何一种语言真正需要它。

在Java中,我们可以使用a + b来表示a.Add(b)。实际上,有人甚至会认为a.Add(b)只是Add(a,b)的语法糖。

根据Java的命名约定,方法add应该首字母小写。

我并不是特指Java,而是一般的语言。例如,在Java中,你不能有非成员函数Add(a,b)

看看这个表达式:a.add(b.minus(h).multiply(d.divide(i.add(j))).add(e)).add(c.multiply(f.minus(g.divide(j))))。现在谁还需要a+b!首先,我们可以使用更少的括号来书写同样的表达式:a + (b - h) * (d / (i + j)) + e + c * (f - g / j),显然这种写法更简洁。例如,我可以快速看到被加在一起的组件以及相乘或相除的内容。而使用a.op(b)的写法则更难理解。不知道你怎么看,但是我从小学起就使用"+"操作符,所以对我来说它更清晰明了。

除了语法和易读性之外,操作符在数学中还有优先级。乘法的优先级高于加法。所以a + b * c会先计算b * c,然后将结果加到a上。操作符重载使得处理这些优先级更加容易,否则你在编写方法时还需要考虑优先级顺序。

0
0 Comments

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

Java不需要运算符重载的原因是因为它只允许对基本数值类型进行算术运算。尽管在其他类型(如复数、向量等)上定义运算符很方便,但这也会导致与具体实现相关的特殊情况。因此,运算符并不总是按照预期的方式工作。通过避免运算符重载,可以更清楚地知道调用哪个函数。在某些人看来,这是一个明智的设计选择。

当然,这几乎是正确的,因为Java定义了char和string类型的加法运算。

但他们却忘记了BigInteger和BigDecimal 🙁

更糟糕的是,它们搞错了。C#和Java都将+用于加法和字符串连接,所以我们会遇到奇怪的类型强制转换错误。这些错误与Visual Basic在Java诞生之前五年就解决了的错误完全相同,它们通过将这两个操作符拆分成两个来解决。

在Java中,char是一种数值类型。但是String +的解决方法是一个好点。

值得注意的是,人们总是可以使用令人困惑的变量名,比如xyzzy。人们可能使用一种语言特性来编写混淆的代码,这本身不应该被认为是避免使用该特性的正当理由,特别是当该特性在正确的上下文中使用时,可以用来创建更易读的代码。我觉得令人悲哀的是,不使用Java解决那些可能最优雅地用数学表达的问题的唯一真正理由是,设计者不想要运算符重载。

根据这个回答的逻辑 - 方法名可能会误导,为什么允许程序员给方法命名?让我们用数字来列举它们吧!

谁决定Java不需要运算符重载的人显然从未尝试过使用任意精度计算ISS轨道元素。我试过。结果正确吗?是的。可读性好吗?让我想一想。

0