编译器如何理解自引用结构?应该是无限递归吗?

问题描述 投票:0回答:1
  class LinkedlistNode {
   int data;
   LinkedlistNode next=null ;

  }`

从我接触链表概念的第一天起,我就一直不相信我们如何在节点内定义节点。当我们已经定义了某个东西时,我们如何才能定义它?

我试图询问聊天gpt,他告诉我编译器早些时候知道有一个名为node的类,但它的定义尚未完成,所以它会等到类被JVM加载,但我不相信。然后在Quora上我看到一个答案说指针或引用已经有固定的大小了。

java data-structures linked-list queue stack
1个回答
0
投票

编译器可以以不同的方式做事(比如一次或多遍),但我们可以想象这个过程:

当编译器解析代码时,它会构建一个符号(名称)表,该表一开始是空的。例如,我们可以想象该表是这样的:

名字 类型 价值
... .... ...

解析

class LinkedlistNode
时,符号
LinkedlistNode
会添加到该表中:

名字 类型 价值
链表节点 班级 (空)

然后处理

int data
:类获取其第一个具有已知(原始)类型的成员:

名字 类型 价值
链表节点 班级 { 整数数据 }

当遇到

LinkedlistNode next
时,名称
LinkedListNode
就会被识别,因此这并不神秘:该类获得了第二个成员:

名字 类型 价值
链表节点 班级 { int data, LinkedListNode next }

我们刚刚引入了一个反向引用,如果你愿意的话,也可以是一个循环。 LinkedListNode

value
部分尚未最终确定并不是问题。这里唯一重要的是
LinkedListNode
是我们再次遇到它时符号表中的一个条目——这里就是这种情况。

© www.soinside.com 2019 - 2024. All rights reserved.