• 締切済み

Javaのプログラミングにおいて、暗黙的にオブジェクトが生成される場合はどんな場合ですか?

Javaアソシエイツの資格取得ため、勉強しています。詳しい解説を求めています。 ■問題 次のプログラムを実行すると、出力結果はどのようになりますか。1つ選択してください。 http://d.hatena.ne.jp/motoi20/20081210 ■解説 正解は選択肢Aです。func(s)では、変数sが参照しているStringオブジェクトを「func(Stirng s)」の引数sに渡しています。func()メソッドの処理で「s+"Hello"」という処理をしたとき、内部では暗黙的に新しいStringオブジェクトが生成されます(変数sに文字列を追加しているわけではありません。)func()メソッドの呼び出しが「s=func(s)」となっていた場合、main()メソッド内の変数sが新しくできたオブジェクトを参照するため、結果の出力は「JavaHello」になりますが、「func(s)」の呼び出しでは戻り値を再代入していないため、変数sは文字列「Java」を保持したオブジェクトを参照します。Stringクラスは読み取り専用オブジェクトであることに注意しましょう。 ■疑問 通常、オブジェクトを作成するのは、「new」を使って行うわけですよね?暗黙的にオブジェクトが生成されるのは、どういう場合でしょうか?読み取り専用オブジェクトだから何に気をつければいいのでしょうか?

みんなの回答

noname#78739
noname#78739
回答No.2

たぶんこの問題で気にするところは、、 ・func()にstaticが付いている → オブジェクトを生成しなくてメソッドを呼び出せる(※mainメソッドがstaticだから) ・戻り値が、sに再代入されていない → println(s)で表示されない なので、あんまり難しく考えるより(理解できばいいけど)staticメソッドの文法が分かればいいんでは?

motoigoo
質問者

お礼

おっしゃるように、この問題ではそこまで考えなくても、「そういうもんなんだぁ」と思えばいいかもしれませんね。staticの解説ありがとうございました。理解が深まりました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

文字列に関してはコンパイラが直接サポートしているため, 「表面に見える式」と「コンパイラが認識する式」では異なることがあります. 例えば, 単純に「s + "Hello"」と書いたとすると, コンパイラは「(new StringBuffer(s)).append("Hello").toString()」という式であると認識します. そして, この StringBuffer#toString() の中で new が実行されます. その結果として, 表面的には「暗黙的にオブジェクトが生成される」ように見えます. が, 実際には「StringBuffer#toString() で new が実行される」ことによって Stringクラスのオブジェクトが生成されます. この辺のからくりはコンパイルしてできたクラスファイルを逆アセンブルすると見えてきます.

motoigoo
質問者

お礼

非常に詳しい解説ありがとうございます。StringBuffer()が動いているんですね。逆アセンブルもやってみたいと思います。