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

标签 java object-reference

我对对象引用的工作方式感到困惑,想知道是否有人可以提供帮助。下面是一些示例代码,它应该根据一般情况下的链表对队列进行出队:

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;
return head;

这里有很多引用资料:

  • listHead 是一个引用
  • head 是一个引用
  • listHead.datum是一个引用
  • listHead.next是一个引用

有两个实际的对象实例被引用:

  • 任何datum 引用(我们称该实例为D)
  • 无论next 引用(我们称该实例为N)

事情是这样的。

  • listHead.datum 引用了 D
  • listHead.next 引用了 N
  • head 被赋予了对 D
  • 的引用
  • listHead 被赋予了对 N 的引用(注意 head 没有改变)
  • 你返回 head 仍然引用 D

关于java - 对对象引用在 Java 中的工作方式感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13805141/

相关文章:

java - 使用SBT构建scala以制作具有依赖项的JAR和文件夹

java - 如何在没有对象引用的情况下调用方法

java - 方法创建新实例

java - 从 PIT 执行中排除测试

java - 我如何在 zk 中使用这个参数?

在 ServletContext 资源 [/WEB-INF/spring-servlet.xml] : 中定义的名称为 'dataSource' 的 Java 无效 bean 定义

c# - 是否有执行 WPF/C# 对象取消引用以进行垃圾回收的好方法?

java - 为什么我只能用这种方式初始化?

c# - List<Task> - 使用 C# Entity Framework 的 UPSERT 数据库记录

java - 在 Java9 中,终结器已被弃用,取而代之的是引入了清理器。两者有什么区别?