- ベストアンサー
+演算子で文字列を連結できるのは何故?
JAVAを勉強中に疑問に思ったので質問します。 JAVAでは演算子のオーバーロードができないと思いますが、 +演算子で文字列の連結できるのはどのような仕組みなんでしょう? Stringだけ特別なんでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
すべてのクラスはObjectクラスから継承されています。 ObjectクラスにはtoString()メソッドがあります。 リテラル文字列("abc")はString型のfinal変数?だったと思いますが、("abc" + obj)のような文字列との連結を記述すると、("abc" + obj.toString())のようにすべてをString型に変換してしまいます。 あとは、"abc"とobj.toString()を連結するために、テンポラリのStringBufferが生成されて、new StringBuffer().append("abc").append(obj.toString()).toString();みたい感じだったと思います。 #細かいところはちょっと自信ないですけど・・。
その他の回答 (3)
- unibon
- ベストアンサー率47% (160/340)
特別なんだと思います。 Eclipse などのデバッガーでステップ実行させてみると、実際にどういうコードに変換されているのかが目に見えて分かりますよ。
お礼
生成されるコードを見るのが一番確実かも知れませんね。 ありがとうございます。
- UKY
- ベストアンサー率50% (604/1207)
Java にも演算子のオーバーロードはありますよ。 int 値同士を足し算すれば結果の値も int になり、double 値同士を足し算すれば結果の値も double になります。これは一種のオーバーロードといえます。 Java では演算子のオーバーロードができないのではなくて、演算子のユーザー定義ができないのです。 > Stringだけ特別なんでしょうか? Java 言語仕様を読んでみてください。被演算子の一方または両方が String の場合は + 演算子は文字列の連結を行うと定められています。
お礼
参考になりました。 ありがとうございます。 Java言語仕様も読んでみます。
- OsieteG00
- ベストアンサー率35% (777/2173)
オーバーロードというか、ポリモーフィズムの一環としてあらかじめコンパイラの仕様として定義されているだけかと。 オーバーロードはユーザによる関数の上書きです。
お礼
ご回答ありがとうございます。 C++等での文字列の連結は+演算子のオーバーロードで実現されてると思うので、 演算子のオーバーロードが出来ないJAVAではどうやっているんだろうと思ったのですが、 多分Stringオブジェクトだけコンパイラで特別に処理されているんでしょうね。
お礼
なるほど! 分かりやすい説明ありがとうございます。 スッキリしました。 オブジェクトをprintlnで表示すると出てくる変な文字と数字はObjectクラスのtoStringメソッドが返す文字列だったんですね。