• ベストアンサー

+演算子で文字列を連結できるのは何故?

JAVAを勉強中に疑問に思ったので質問します。 JAVAでは演算子のオーバーロードができないと思いますが、 +演算子で文字列の連結できるのはどのような仕組みなんでしょう? Stringだけ特別なんでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • mura333
  • ベストアンサー率42% (3/7)
回答No.2

すべてのクラスはObjectクラスから継承されています。 ObjectクラスにはtoString()メソッドがあります。 リテラル文字列("abc")はString型のfinal変数?だったと思いますが、("abc" + obj)のような文字列との連結を記述すると、("abc" + obj.toString())のようにすべてをString型に変換してしまいます。 あとは、"abc"とobj.toString()を連結するために、テンポラリのStringBufferが生成されて、new StringBuffer().append("abc").append(obj.toString()).toString();みたい感じだったと思います。 #細かいところはちょっと自信ないですけど・・。

gp_limited
質問者

お礼

なるほど! 分かりやすい説明ありがとうございます。 スッキリしました。 オブジェクトをprintlnで表示すると出てくる変な文字と数字はObjectクラスのtoStringメソッドが返す文字列だったんですね。

その他の回答 (3)

  • unibon
  • ベストアンサー率47% (160/340)
回答No.4

特別なんだと思います。 Eclipse などのデバッガーでステップ実行させてみると、実際にどういうコードに変換されているのかが目に見えて分かりますよ。

gp_limited
質問者

お礼

生成されるコードを見るのが一番確実かも知れませんね。 ありがとうございます。

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.3

Java にも演算子のオーバーロードはありますよ。 int 値同士を足し算すれば結果の値も int になり、double 値同士を足し算すれば結果の値も double になります。これは一種のオーバーロードといえます。 Java では演算子のオーバーロードができないのではなくて、演算子のユーザー定義ができないのです。 > Stringだけ特別なんでしょうか? Java 言語仕様を読んでみてください。被演算子の一方または両方が String の場合は + 演算子は文字列の連結を行うと定められています。

gp_limited
質問者

お礼

参考になりました。 ありがとうございます。 Java言語仕様も読んでみます。

  • OsieteG00
  • ベストアンサー率35% (777/2173)
回答No.1

オーバーロードというか、ポリモーフィズムの一環としてあらかじめコンパイラの仕様として定義されているだけかと。 オーバーロードはユーザによる関数の上書きです。

参考URL:
http://www.nextindex.net/java/polymorphism.html
gp_limited
質問者

お礼

ご回答ありがとうございます。 C++等での文字列の連結は+演算子のオーバーロードで実現されてると思うので、 演算子のオーバーロードが出来ないJAVAではどうやっているんだろうと思ったのですが、 多分Stringオブジェクトだけコンパイラで特別に処理されているんでしょうね。

関連するQ&A

専門家に質問してみよう