質問: 参照渡し javaでintやstringって参照渡しって可能なのでしょうか? プリミティブタイプ以外は参照渡しとあるサイトに書いてあったのですが stringは何故、値渡しなのでしょうか。 宜しくお願いします。
回答: (1) string a; a = "aaa"; (2) string a = new string(); a = "aaa"; (1)と(2)の動作の違いについて。 (1) string型の参照を格納する変数aを宣言。(つまりstringオブジェクトはまだ生成されていない。) aに"aaa"というstringオブジェクトの参照を代入する。 メモリでいうならば「参照用のa」「"aaa"という内容のstringオブジェクト」の分だけ確保されます。 (2) string型の参照を格納する変数aを宣言し、そのaに新しく生成(new)したstringオブジェクトの参照を代入する。 aに"aaa"というstringオブジェクトの参照を代入する。(これはaの参照先を"aaa"に書き換えただけで、上でnewしたstringオブジェクトに文字列"aaa"を代入したわけではありません。) メモリでいうならば「参照用のa」「newしたstringオブジェクト」「"aaa"という内容のstringオブジェクト」の分だけ確保されます。 stringであろうとオブジェクトは全て例外なく参照渡しです。javaでは配列はオブジェクトなので配列も参照渡しです。このことを利用したのが#1さんの >ちょっとずるいですが、 >要素数1の配列にすればできます。 です。 >stringというのは特別なクラスなのでしょうか? java内部の仕様に組み込まれた特別なクラスですが、プログラマはいちいちそのことを意識しなくてもいいと思います。 意識しなければならないのは、string同士を連結して代入する際、新しいオブジェクトが生成されるという点です。(#4参照) このことを知らないと今回のteststrのように文字列の「内容」を別のメソッドで書き換えたつもりが、実は書き換わっていない、というバグに繋がる可能性があります。 「頻繁に内容が変更される文字列」を扱うのでしたらstringbufferを使用することをお勧めします。=や+での操作はできなくなりますが、メモリやパフォーマンスの面でstringbufferの方が上回ります。stringは「固定長の文字列」を扱うのに便利なクラスであると心得てください。