[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[jfriends] Re: ポインターと参照
前橋です。
みやざき さん:
>配列の値を操作したほうは、きちんと処理されているということに
>なります。メソッドは「浅いコピー」をするので、配列の値を変更
>したときに、その配列を直接渡すことができるのかな、と思います
>が……。
># 書いてて、何書いてるかよーわからんぞ;
えっと、
Javaは、C等と同様、メソッドの引数は全て値渡しである。よっ
て、メソッド呼び出し時にコピーされるわけだが、その時のコピー
は「浅いコピー」である。(要するに実体はコピーしていない)
ということでしょうかね。
配列はArrayクラスのオブジェクトであり(本当か?)、Javaではオブ
ジェクトは全てポインタなので、引数でオブジェクトを渡すという
ことはポインタを渡すことであるから、呼出され側で自由に中をい
じることができます。
が、Stringクラスのオブジェクトは、書き込み不能ということになっ
ているので、Stringクラスのオブジェクトを渡してその中身を書き
換えてもらうことはできない、ただし、これはたまたまStringが書
き込み禁止だというだけのことであって、久野さんが書いておられ
たように、StringBufferクラスを使えば可能です。
配列は、書き込み不能のオブジェクトではないです。そして、Java
ではオブジェクトは全てポインタなので、オブジェクトの配列はポ
インタの配列になります。つまり、この例では、Stringへのポイン
タを要素に含む配列のポインタを渡しているわけですね。
String自体は書き換え不能ですが、この例では、前のStringを棄て
てしまって、新しいStringオブジェクトへのポインタを配列に突っ
込んでいます。
str2
↓
□ → "replacing"
を
str2
↓
□ → "rep"
"replacing"
にしちゃっているわけで、この場合、"replacing"は、誰からも指
されなくなって余っちゃうわけですが、そういうロンリーなオブジェ
クトは、そのうちにGCがやってきて成仏させてくれます。
# でも、Stringのリテラルは、定数プールに確保されるから、本当
# は回収されないんだろうけど、ややこしくなるからまあいいや。
------------------------------------------------------------
前橋 和弥 maebashi@xxxxxxxxxx
中部ソフトエンジニアリング(株)
〒450 名古屋市中村区名駅4-10-25(名駅IMAIビル 5F)
Tel:(052)583-4511(代) 内線 252 Fax:(052)583-4566
------------------------------------------------------------