[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
------------------------------------------------------------