3

オブジェクト参照がどのように機能するかについて混乱しており、誰かが助けてくれるかどうか疑問に思っていました. 以下は、一般的なケースでリンクされたリストに基づいて Queue を deQueue することになっているサンプルコードです:

Object head = listHead.datum;
listHead = listHead.next;
return head;

私の理解では、プリミティブ変数がある場合、実際の値がそれに割り当てられて格納されますが、変数がオブジェクトの場合、オブジェクトへの参照がそこに格納されます。上記のコードでは、listHead.datum への参照が head に格納されていますが、listHead に格納されている参照が listHead.next に変更されています。head と呼ばれるオブジェクトを返すときが来たら、割り当てられた参照に従うと思います。つまり、listHead (現在は別の場所を参照しています) に移動してから、datum に移動します。

上記のコードはキューの先頭を返す必要がありますが、私のロジックに従って、キューの 2 番目を返します。どこが間違っていますか?

4

2 に答える 2

4

我々は持っています:

Object head = listHead.datum;
listHead = listHead.next;
return head;

ここには多くの参考資料があります。

  • listHead参考です
  • head参考です
  • listHead.datum参考です
  • listHead.next参考です

参照されている実際のオブジェクトインスタンスは2つあります。

  • 参照するものは何でもdatum(そのインスタンスを呼び出しましょうD
  • 参照するものは何でもnext(そのインスタンスを呼び出しましょうN

これが物事がどのように下がるかです。

  • listHead.datumへの参照がありますD
  • listHead.nextへの参照がありますN
  • headへの参照が与えられますD
  • listHeadには(変更されていないことにN 注意してください)への参照が与えられますhead
  • headあなたはまだ参照しているものを返しますD
于 2012-12-10T16:49:32.660 に答える
4

参照は変更headしても動的に更新されませんlistHead。実際、動的解決を持つオブジェクト参照はありません。参照は、直接代入によって明示的に変更する必要があります。これは、あなたが思っていたことを達成する唯一の方法です。

Object head = listHead.datum;
listHead = listHead.next;
// Only direct assignment can change the object that head points to
head = listHead.datum;
return head;
于 2012-12-10T16:44:10.463 に答える