Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对Java中对象引用的工作方式感到困惑_Java_Object Reference - Fatal编程技术网

对Java中对象引用的工作方式感到困惑

对Java中对象引用的工作方式感到困惑,java,object-reference,Java,Object Reference,我对对象引用是如何工作的感到困惑,想知道是否有人可以帮忙。下面是一些示例代码,在一般情况下,该代码应基于链表将队列出列: Object head = listHead.datum; listHead = listHead.next; return head; 我的理解是,当您有一个基本变量时,存储的实际值被分配给它,但是如果变量是一个对象,那么对对象的引用存储在其中。因此,在上面的代码中,对listHead.datum的引用存储在head中,但随后存储在listHead中的引用被更改为list

我对对象引用是如何工作的感到困惑,想知道是否有人可以帮忙。下面是一些示例代码,在一般情况下,该代码应基于链表将队列出列:

Object head = listHead.datum;
listHead = listHead.next;
return head;
我的理解是,当您有一个基本变量时,存储的实际值被分配给它,但是如果变量是一个对象,那么对对象的引用存储在其中。因此,在上面的代码中,对listHead.datum的引用存储在head中,但随后存储在listHead中的引用被更改为listHead.next。当返回名为head的对象时,我会认为它将遵循其指定的引用,即转到listHead(现在指的是另一个位置),然后转到datum


上面的代码应该返回队列的头,但按照我的逻辑,它将返回队列中的第二个。我哪里出错了?

列表头
发生变化时,
引用不会动态更新。事实上,没有对象引用具有动态分辨率。必须通过直接赋值显式更改引用。这是实现您认为正在发生的事情的唯一方法:

Object head = listHead.datum;
listHead = listHead.next;
// Only direct assignment can change the object that head points to
head = listHead.datum;
return head;
我们有:

Object head = listHead.datum;
listHead = listHead.next;
return head;
这里有许多参考资料:

  • listHead
    是一个参考
  • head
    是一个参考
  • listHead.datum
    是一个参考
  • 列表头。下一步是参考
有两个实际对象实例被引用:

  • 无论什么
    datum
    引用(让我们将该实例称为
    D
  • 无论下一个
    引用什么(让我们调用该实例
    N
事情是这样的

  • listHead.datum
    引用了
    D
  • listHead.next
    引用了
    N
  • head
    参考了
    D
  • 列表头引用了
    N
    (注意
    head
    未更改)
  • 您返回的
    head
    仍然引用
    D

我可以问“listHead”是什么类型的变量吗?@cworner1它可能只是某种类型的链表节点。很抱歉没有澄清-是的,listHead是类型节点,包含对链表中第一个节点的引用。没关系,我只是在按引用和按值传递时遇到了问题。所以我也想了解这个问题和答案,以备将来参考。啊,我明白了!我认为它的工作方式是,存储在head中的引用就像一组指向listHead然后指向数据的方向。因此,当头部被返回时,它将遵循这些指示。因此,只需按照“指示”查找存储在磁头中的存储位置。所以,不管“方向”的一部分是如何改变的,头部仍然只是指那个记忆位置。它可能不是一个确切的记忆位置,所以不要太执着于这个想法。如果您熟悉C语言,我确实经常认为它们很像C指针。如果你不熟悉C,忘了我说过什么,因为它只会让你困惑