[英]What is the difference between an Operator and Method?
运算符的评估规则和Java中的方法有什么区别?
操作员可以被视为语法糖
static Foo Plus (Foo right, Foo left)
{
// do stuff
return output;
}
写right + left
而不是Class.Plus(right, left)
更方便。
Femaref的答案非常好; 我想扩展它。
操作符(通常)硬连接到语言中:像+
, -
, *
和/
的东西通常由编译器直接翻译成机器语言(如果这是该语言系统的底层机制),而无需显式调用方法在图书馆里。 例如,它就是C中的原因。 如果没有使用该语言定义那些运算符,则必须使用plus(2,2)
代替2 + 2
。
使用该语言定义的运算符具有内置优先级的优点。 *
和/
通常具有比+
和-
更高的优先级,所以你可以写3 * 3 + 4 * 4
并获得25,而不是52或84,如果没有这样的优先级或不同的优先级你将获得。
当编译器识别操作符但仍然委托给库时,该行变为灰色。 FORTRAN中的复数可能是一个例子:编译器通常不会费心将复杂操作直接编译为机器代码,但会生成机器代码来调用库。
大多数人只考虑算术运算符,如+
, -
等等。 但您也可以考虑使用方括号( [ ]
)作为数组索引的运算符。
有些语言允许您重载其运算符,因此您可以将调用替换为操作符通常执行的方法。
大多数语言都不允许您定义自己的运算符,这些运算符支持与内置运算符相同的机制。 斯卡拉是个例外; 如果您愿意,可以定义+++
运算符,并将其与您提供的方法连接起来。 有些人认为运营商超载会让代码更难理解,所以陪审团仍然不清楚这是否是一个好主意。
在C和Java中,您不能覆盖类的“+”运算符,因此您的问题对其他语言有意义。
有些语言可以覆盖运算符,例如C ++和Python。 如果你对这种比较感兴趣,为什么不尝试? 即使您的测试显示'+'运算符比.add()方法更慢/更快,如果您更改编译器或环境,这可能会更改。
我认为你应该使用对你来说很好的东西。
在Java中有建议使用StringBuffer
而不是+
运算符和String
但是最新的Java实现为+
运算符提供了更好的优化,所以这个建议对于新代码来说并不好。
我会对你所问的问题做出不同的猜测。 例如,您可能会询问Java在以下两种情况下保证执行bar()
和baz()
的顺序:
foo.bar() + foo.baz()
fee(foo.bar(), foo.baz())
在这两种情况下, bar()
肯定在baz()
之前调用(JLS 15.7.1,4)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.