問題と解説は、こちらにあります。
http://www.geocities.jp/hyden0000/h.html
わからない個所は、解説の図解で、オブジェクトが互いに参照している
ところです。解説には、9、10行目の互いに参照しあっていると記述がありますが、
sm1.objは、sm2のポインタを代入しているのであって、
sm2.objと互いに参照しないように思います。
最終的に12行目を実行後に、sm1とsm2がobjを参照しなくなるため、
GCが実行されることはわかるのですが・・。いまいち、図解が
しっくりきません。すみませんが、どなたかアドバイスお願いします。
Javaにはポインターという概念がないんです。
だからポインターという概念で考えたら駄目です。
参照といってるように、参照という概念で考えないと理解できません。
図は正しいです。
-------------
ポインターっぽく考えると
Sample sm1 =new Sample(); //仮にsm01のアドレスが001
Sample sm2 =new Sample(); //仮にsm02のアドレスが002
sm1.obj=sm2; //sm1.objはアドレス002を参照
sm2.obj=sm1; //sm2.objはアドレス001を参照
------
sm1 =null ; //sm1のメモリー領域を開放しようとする
ここで、sm2.objがアドレス001を参照してるので、sm1の領域を開放しようとしても
出来ない。
Javaにはポインターという概念がないんです。
だからポインターという概念で考えたら駄目です。
参照といってるように、参照という概念で考えないと理解できません。
図は正しいです。
-------------
ポインターっぽく考えると
Sample sm1 =new Sample(); //仮にsm01のアドレスが001
Sample sm2 =new Sample(); //仮にsm02のアドレスが002
sm1.obj=sm2; //sm1.objはアドレス002を参照
sm2.obj=sm1; //sm2.objはアドレス001を参照
------
sm1 =null ; //sm1のメモリー領域を開放しようとする
ここで、sm2.objがアドレス001を参照してるので、sm1の領域を開放しようとしても
出来ない。
ありがとうございます。なぜが、図解のobjをsm1やsm2のオブジェクトだと
理解できていなかったみたいです。
sm1.obj=sm2;では、sm1のオブジェクトがsm2のオブジェクトを参照しているため、
あの図解が成り立つのですね。
どのようにしっくり来ないのか説明していただかないと
回答のしようがない。
だから、図はのしているでしょ。
smp1とsmp2はObjを参照する変数ですから、
smp1.obj = smp2;
を実行したときに、smp1.objはsmp2の実態であるObjを参照するからです。
回答者 | 回答 | 受取 | ベストアンサー | 回答時間 | |
---|---|---|---|---|---|
1 | ![]() |
9回 | 8回 | 1回 | 2010-07-07 13:15:36 |
ありがとうございます。なぜが、図解のobjをsm1やsm2のオブジェクトだと
理解できていなかったみたいです。
sm1.obj=sm2;では、sm1のオブジェクトがsm2のオブジェクトを参照しているため、
あの図解が成り立つのですね。