質問: "test"; という処理を行っているのですが、このときの状況は、 str1はhello.のままで、 str3のみがtestになっている、と理解したのですがそれで合っているのでしょうか?
回答: java は、オブジェクトの置き場所を仮想マシン(java のシステム、位の理解で良いです)が 管理しています。オブジェクトの内容を書き込める分厚いノートがある、と想像して下さい。 java で扱うオブジェクトは、全て「参照」です。そのノートのページ番号が「参照」である と理解して下さい。 > string str1 = "hello."; これは、新しい1ページを見つけて、string のオブジェクトであることと、その内容が "hello." である事を書き込んで、そのページ番号を str1 という変数に覚えておきます。 > string str3 = str1; これは、str1 に書いてあるページ番号を str3 に書き移していることになります。 "hello." と書いてあるノートのページは、未だひとつしかありません。 > ==はオブジェクトの比較で、equlasは文字列の比較だと書いているのですが、よく違いが分かりません。 == は、(ここまでの喩えの)ページ番号の比較で、equals は、ページに書き込まれている内容の 比較になります。 > string str4 = str1 + str2; これは、str1 のページの内容と str2 のページの内容をくっつけたものを、新しいページを 探して、そこに書き込み、そこのページ番号を str4 に覚えておきます。 > (c)str4 == "hello.good, bye."; で、この式は、さっきのページ番号と、(新しくページを探して)"hello.good,bye" と書き込んだ ページの番号を比べていることになります。なので、ページ番号が違う、ということで false に なります。 > str3 = "test"; > という処理を行っているのですが、このときの状況は、 > > str1はhello.のままで、 > str3のみがtestになっている、と理解したのですがそれで合っているのでしょうか? 合ってます。 > str3 = "test"; は、新しいページを探して、"test" という内容を書き込んで、そのページ番号を str3 に 覚えておくことになります。"hello." が書いてあるページ番号が消されてしまいますが、 そのページに対して何かを書いたり・消したりしているわけではないので、str1 に入っている ページ番号のページには "hello." がそのまま残っています。 > str3のみがtestになっている と言うよりは、str3 が "test" という内容の string オブジェクトを「指している」と いう言い方が正確な表現になります。