文字列は、明らかにconcatinatedでき、プリミティブな数値型はとにかくできます。また、経路や文字列などを連結することもできます。これは内部的にどのようにJavaで動作するのですか?隠されたC++のような演算子定義がありますか?Javaでは非プリミティブ型の '+'演算子のオーバーロードはどのように機能しますか?
答えて
Javaに演算子のオーバーロードがありません。これらはすべてコンパイラの内部にあります。
Javaコンパイラは、プログラムを変換するときに、各式とサブ式のコンパイル時の型を認識します。一方の側にString
という式を持つ+
があると、文字列の連結が適用されます。 2つの異なるタイプがある場合は、タイプのプロモーションルールなどが適用されます。このプロセスは、オペレータのオーバーロードをサポートする言語でのオーバーロード解決に似ていますが、言語を使用するプログラマからは完全に隠されています。
+演算子は、加算演算子または文字列連結演算子として機能します。この選択は、オペランドに依存する(すなわち、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
直接リンク:http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.18.1 – zapl
- 1. 演算子のオーバーロードは代入演算子でどのように機能しますか?
- 2. 演算子[]のオーバーロードはどのように機能しますか?
- 3. 非クラス型のオーバーロード演算子[]
- 4. ビットワイズ演算子はどのように機能しますか?
- 5. <<演算子をどのようにオーバーロードしますか?
- 6. プリミティブでeqalityをチェックしたとき、equals演算子はどのように機能しますか?
- 7. プリミティブ型とIN演算子
- 8. Pythonでは 'in'演算子はどのように機能しますか?
- 9. この場合、演算子のオーバーロードはどのように機能しますか?私は、この演算子のオーバーロードは、このコードでは、ここでどのように機能するかを取得
- 10. []演算子をどのようにオーバーロードできますか?
- 11. CoffeeScriptの実在の演算子はどのように機能しますか?
- 12. 演算子のオーバーロード演算
- 13. プリミティブ型の+演算子を無効にできますか?
- 14. クラス内の演算子はどのように機能しますか?
- 15. Luaのテーブル長演算子はどのように機能しますか?
- 16. FORループのコンマ演算子はどのように機能しますか?
- 17. RxJs 5のshare()演算子はどのように機能しますか?
- 18. ^(オブジェクト演算子へのハンドル)はどのように機能しますか?
- 19. 入れ子型のオーバーロード演算子
- 20. プリミティブ型のマルチスレッドと演算子++
- 21. 挿入演算子のオーバーロードにはどのような問題がありますか? (<<演算子)
- 22. SQL/sqliteワイルドカーはどのように機能しますか? LIKE演算子
- 23. 代入演算子(| =)はどのように機能しますか? (C#)
- 24. バイナリNOT(〜)演算子はどのように機能しますか?
- 25. Javascript =>演算子はどのように機能しますか?
- 26. 列挙型のチルダ "〜"演算子のオーバーロード
- 27. 整数型の演算子^のオーバーロード
- 28. 列挙型の演算子のオーバーロード
- 29. 演算子<< enum型の演算子<<は、オーバーロードされた演算子を使用しているかどうかを示します。
- 30. プリミティブな数値型の演算子をスカラーでオーバーロードすることはできますか?
ここで回答が見つかります:http://stackoverflow.com/questions/47605/string-concatenation-concat-vs-operator文字列を他のオブジェクトと連結すると、文字列以外の各オブジェクトに 'String.valueOf()'メソッドが適用され、文字列に変換されます –
** **多態性**が必要ですか? –