2016-06-18 2 views
0

文字列は、明らかにconcatinatedでき、プリミティブな数値型はとにかくできます。また、経路や文字列などを連結することもできます。これは内部的にどのようにJavaで動作するのですか?隠されたC++のような演算子定義がありますか?Javaでは非プリミティブ型の '+'演算子のオーバーロードはどのように機能しますか?

+0

ここで回答が見つかります:http://stackoverflow.com/questions/47605/string-concatenation-concat-vs-operator文字列を他のオブジェクトと連結すると、文字列以外の各オブジェクトに 'String.valueOf()'メソッドが適用され、文字列に変換されます –

+0

** **多態性**が必要ですか? –

答えて

2

Javaに演算子のオーバーロードがありません。これらはすべてコンパイラの内部にあります。

Javaコンパイラは、プログラムを変換するときに、各式とサブ式のコンパイル時の型を認識します。一方の側にStringという式を持つ+があると、文字列の連結が適用されます。 2つの異なるタイプがある場合は、タイプのプロモーションルールなどが適用されます。このプロセスは、オペレータのオーバーロードをサポートする言語でのオーバーロード解決に似ていますが、言語を使用するプログラマからは完全に隠されています。

0

+演算子は、加算演算子または文字列連結演算子として機能します。この選択は、オペランドに依存する(すなわち、int、short、long、float、doubleなどのプリミティブな数値型の場合)。Javaコンパイラは加算演算を実行する。ただし、オペランドのいずれかが文字列の場合、連結を実行します。 15.18.1文字列連結演算子+ オペランド式がString型の場合、文字列変換(§5.1.11) が実行時に文字列を生成するために他のオペランドに対して実行されます。 文字列連結の結果は、2つのオペランド文字列の連結 であるStringオブジェクトへの参照です。左オペランド の文字は、新しく作成された文字列の右オペランドの文字に先行します。 Stringオブジェクトは、式が定数 式(15.28)でない限り、新しく作成されます(12.5項)。 中間のStringオブジェクトの作成と破棄を避けるために、実装は1つのステップで変換と連結を実行することを選択してもよい( )。反復文字列連結のパフォーマンスを向上させるために、Javaコンパイラは、StringBuffer クラスまたは同様の手法を使用して、式の評価によって作成された の中間Stringオブジェクトの数を減らすことができます。 プリミティブ型の場合、実装ではプリミティブ型から文字列に直接変換することにより、ラッパーの作成を最適化することもできます( オブジェクト)。 [] Page 564

+0

直接リンク:http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.18.1 – zapl

関連する問題