[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 1572] Re: ポインタの定義



小薮です。

On Wed, 07 Mar 2001 19:51:58 +0900
in [jfriends-ml 1571] Re: ポインタの定義
nobsun@xxxxxxxxxxxxxxxxxx wrote:

> > Javaの引数ってのは、モロに右辺値を渡してますよね(call by value)?
> 
> えっと、オブジェクトをディープコピーしたりしませんよね。
> 
> > 「参照orポインタ」のことを「左辺値」と呼ぶのなら、オブジェクトを
> > 渡す場合に限り確かに参照渡しですが、呼び出され側でその参照は
> > 別の変数に格納され、
> 
> 渡ってきた左辺値を表示する新しい名前(変数)ができるだけですよね。
> 
> > あまつさえ書き換えもできてしまうのだから、
> 
> (私には)「実引数と仮引数の結合が、左辺値でおこなわれる」ように見える
> のですが。。。

やましたさんは理解してらっしゃいそうな気がする
のですが、誤解されやすいところなのでML宛てという
ことでちょっと書いておきます。


オブジェクト変数aがオブジェクトAを指している状態で
とあるメソッドを呼び出し、その際aをbという仮引数に渡すと、
当然ながらbもAを指します。

ここでbを通じてAの内部状態を変更すると、これまた当然の
ことながらaを通じて参照した場合も内部状態変更後の
Aにアクセスすることになりますので、確かに
「参照渡しっぽい」挙動を示すことになります。

しかしこれを単純に参照渡しと言い切ってしまうと
語弊があります。

Aを指している仮引数bに呼び出されたメソッド内で
代入を行ってBを指させることにしましょう。
その結果aもBを指すことになるならば、これは確かに
「参照渡し」と呼んでいいと思いますが、
実際には呼び出されたメソッド内で何をしようと、
aがAを指していることそのものは変更できません。

オブジェクト変数の「値」というのは、「どのオブジェクト
を参照しているのか」であって、「参照先オブジェクトの
状態」のことではないというのがミソです。

JavaHouse-Brewersでは「参照の値渡し」なんて表現が
されてた覚えがあります。


-----------------------------------
koyabu@xxxxxxxxxxxxxxxxx