【问题标题】:What is the difference between an Operator and Method?运算符和方法有什么区别?
【发布时间】:2011-02-12 03:58:48
【问题描述】:

Java中算子和方法的求值规则有什么区别?

【问题讨论】:

  • 你的问题在 C 或 Java 中都没有意义。
  • 有相当多的语言允许运算符重载(使用方法或函数,或者你怎么称呼它)。 C 和 Java 都不在其中。例如 C++ 和 Python。
  • @Greg:我只是想知道在 Java 中如何评估运算符和方法。
  • 很多操作符可以被编译器映射成简单的机器语言操作,所以编译器直接做这个。另一方面,方法通常被编译为对该方法的代码的机器语言翻译调用,除非编译器已内联该方法。
  • @JamesKPolk 但它在 c# 中是有意义的。我阅读了 Illustrated CSharp 2012 并在第 8 章作者说:“运算符是表示返回单个结果的操作的符号”。

标签: java operator-keyword


【解决方案1】:

操作符可以看作是语法糖

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

right + left而不是Class.Plus(right, left)更方便。

【讨论】:

  • 完全没有,如果你认为“+”是一种方法,属于哪个类?像“toString()”方法一样的对象?
【解决方案2】:

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

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

我认为你应该使用适合你的东西。

在 Java 中有建议使用 StringBuffer 而不是 + 运算符和 String,但最新的 Java 实现对 + 运算符进行了更好的优化,所以这个建议对于新代码来说不是那么好。

【讨论】:

    【解决方案3】:

    Femaref 的回答还不错;我想扩展它。

    操作符(通常)被硬连接到语言中:像+-*/ 这样的东西通常由编译器直接翻译成机器语言(如果这是它的底层机制的话语言系统),无需显式调用库中的方法。例如,这就是它在 C 中的样子。如果这些运算符未在语言中定义,则必须编写 plus(2,2) 而不是 2 + 2

    用该语言定义的运算符具有内置优先级的好处。 */ 通常比 +- 具有更高的优先级,因此您可以编写 3 * 3 + 4 * 4 并获得 25,而不是没有此类优先级或不同优先级的 52 或 84。

    当运算符被编译器识别但仍委托给库时,这条线会变灰。 FORTRAN 中的复数可能就是一个例子:通常编译器不会费心将复杂的操作直接编译成机器码,而是会生成机器码来调用库。

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

    有些语言允许你重载他们的操作符,所以你可以用一个方法调用来代替操作符通常做的任何事情。

    大多数语言不允许您定义自己的运算符来支持与内置运算符相同的机制。 Scala 在这里是个例外。如果您愿意,您可以定义一个+++ 运算符并将其连接到您提供的方法。有些人认为运算符重载会使代码更难理解,所以这是否是一个好主意还没有定论。

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2016-03-31
        • 1970-01-01
        • 2022-06-10
        • 2018-08-16
        • 2012-10-10
        • 1970-01-01
        • 1970-01-01
        • 2010-11-15
        • 2021-04-19
        相关资源
        最近更新 更多