运算符和方法有什么区别?

时间:2010-04-25 19:21:56

标签: java operator-keyword

运算符的评估规则和Java中的方法有什么区别?

4 个答案:

答案 0 :(得分:3)

操作员可被视为

的语法糖
static Foo Plus (Foo right, Foo left)
 {
   // do stuff
   return output;
 }

编写right + left代替Class.Plus(right, left)更方便。

答案 1 :(得分:1)

Femaref的答案非常好;我想扩展它。

操作员(通常)硬连接到语言中:+-*/这样的东西通常由编译器直接翻译成机器语言(如果这是该语言系统的基础机制),而无需在库中显式调用方法。例如,它就是C中的原因。如果未使用该语言定义这些运算符,则必须使用代码plus(2,2)代替2 + 2

该语言定义的运营商具有内置优先级的优势。 */的优先级通常高于+-,因此您可以撰写3 * 3 + 4 * 4并获得25,而不是52或84没有这种优先权或不同的优先权。

当编译器识别操作符但仍然委托给库时,该行变为灰色。 FORTRAN中的复数可能是一个例子:编译器通常不会费心直接将复杂操作编译为机器代码,但会生成机器代码来调用库。

大多数人只考虑算术运算符,例如+-等等。但您也可以考虑使用方括号([ ])作为数组索引的运算符。

某些语言允许您重载其运算符,因此您可以将调用替换为操作符通常执行的方法。

大多数语言都不允许您定义自己的运算符,这些运算符支持与内置运算符相同的机制。斯卡拉是个例外;如果您愿意,可以定义一个+++运算符,并将其与您提供的方法连接起来。有些人认为运算符重载会使代码更难理解,所以评委们仍然不清楚这是否是一个好主意。

答案 2 :(得分:0)

在C和Java中,您不能覆盖类的“+”运算符,因此您的问题对其他语言有意义。

有些语言可以覆盖运算符,例如C ++和Python。如果你对这种比较感兴趣,为什么不尝试?即使您的测试显示'+'运算符比.add()方法更慢/更快,如果您更改编译器或环境,这可能会更改。

我认为你应该使用对你有益的东西。

Java中有建议使用StringBuffer代替+运算符String,但最新的Java实现为+运算符提供了更好的优化,所以这个建议不是那样的适合新代码。

答案 3 :(得分:0)

我会对你的要求做出不同的猜测。例如,您可能会询问Java在以下两种情况下对bar()baz()执行顺序的保证:

foo.bar() + foo.baz()
fee(foo.bar(), foo.baz())

在这两种情况下,在bar()之前肯定会调用baz()(JLS 15.7.1,4)