Javaの演算子とメソッドの評価ルールの違いは何ですか?
4 に答える
演算子は、
static Foo Plus (Foo right, Foo left)
{
// do stuff
return output;
}
right + left
の代わりに書く方が便利ですClass.Plus(right, left)
。
Femarefの答えはかなり良いです。それを拡張したいと思います。
演算子は(通常)言語に組み込まれています:、のようなもの+
で-
、通常*
、/
ライブラリ内のメソッドを明示的に呼び出す必要なしに、コンパイラによって機械語に直接変換されます(それがその言語システムの基盤となるメカニズムである場合)。これは、たとえば、Cでの状態/以前の状態です。これらの演算子が言語で定義されていない場合は、のplus(2,2)
代わりにコーディングする必要があり2 + 2
ます。
言語で定義された演算子には、組み込みの優先順位の利点があります。通常はとよりも優先度が高い*
ため、このような優先順位や異なる優先順位がない場合に得られる52や84ではなく、25を記述して取得できます。/
+
-
3 * 3 + 4 * 4
演算子がコンパイラによって認識されても、ライブラリに委任されると、線は少し灰色になります。FORTRANの複素数はその一例です。多くの場合、コンパイラーは複雑な操作を直接マシンコードにコンパイルすることはありませんが、ライブラリーを呼び出すためのマシンコードを生成します。
+
ほとんどの人は、などの算術演算子についてのみ考えます-
。[ ]
ただし、たとえば、角かっこ()を配列インデックスの演算子と見なすこともできます。
一部の言語では、演算子をオーバーロードできるため、演算子の呼び出しを、演算子が通常行うことの代わりに使用できます。
ほとんどの言語では、組み込みの演算子と同じメカニズムをサポートする独自の演算子を定義できません。ここではScalaは例外です。+++
必要に応じて演算子を定義し、指定したメソッドに接続することができます。一部の人々は、演算子のオーバーロードによってコードが理解しにくくなると考えているため、これが良いアイデアかどうかについてはまだ審査員が判断していません。
CとJavaの両方で、クラスの「+」演算子をオーバーライドできないため、質問は他の言語でも意味があります。
C ++やPythonなど、演算子をオーバーライドできる言語があります。そのような比較に興味があるなら、試してみませんか?テストでも、'+'演算子は.add()メソッドよりも遅い/速いことが示されています。これは、コンパイラまたは環境を変更すると変更される可能性があります。
自分に似合うものを使うべきだと思います。
Javaには、演算子StringBuffer
の代わりに使用するアドバイスがありましたが、最新のJava実装では、演算子の最適化が改善されているため、このアドバイスは新しいコードにはあまり適していません。+
String
+
私はあなたが何を求めているかについて別の推測をします。bar()
たとえば、次の2つの場合に、とbaz()
が実行される順序についてJavaが何を保証するかを尋ねる場合があります。
foo.bar() + foo.baz()
fee(foo.bar(), foo.baz())
どちらの場合も、bar()
前に必ず呼び出されbaz()
ます(JLS 15.7.1,4)