Java中的对象引用

时间:2013-05-07 01:24:25

标签: java object reference

java中的对象引用真的让我很困惑。当我开始学习链表时,我意识到我对这个主题知之甚少。我的问题是

Node node = list; 

假设list是我的链表中的第一个节点,我知道这个操作意味着节点引用了列表引用的同一个对象。我的意思是,如果我对节点进行更改,因此对它引用的对象进行更改,list也会受到这些更改的影响。但是,我不明白,node.next和list.next也引用同一个对象。我的意思是如果我写了像

这样的链表
Node node = list;
node = node.next;

这是否意味着我也在使用list.next更改列表?或者如果我写(node.next.name =“B”),我还要更改list.next元素的名称吗?我知道这些问题看起来很傻,但我对参考资料一无所知。我也经常研究这个主题。但到目前为止我在网上发现的内容并没有对我有多大帮助。如果有人以清晰易懂的方式向我解释,我将非常感激。

3 个答案:

答案 0 :(得分:3)

您知道引用意味着在内存中,它们与内存中的数据具有相同的“引用”。

因此它就像node一样简单,list是同一个对象。

如果您认为数据存储在内存(RAM)中。把记忆当作一个装满抽屉的壁橱,

如果node的数据在抽屉编号2中。“按参考”表示node = list表示list也指抽屉编号2。

现在无论您在数据中更改了什么,您都会更改2号抽屉的值。因此,您要更改nodelist

答案 1 :(得分:1)

Node node是一个包含引用的变量。 “引用”是“指针”的另一个术语 - 对象的内存地址。

node指定值时,您将在该位置存储对象的地址。相同的地址可以存储在其他地方,允许从代码中的不同位置访问对象。

如果您有链接列表Node对象,则可能包含“next”和“name”字段。在这种情况下,名称字段可能是对作为节点“值”的对象(例如,字符串)的引用(或者至少部分节点的“值”)。“下一个”字段几乎可以保证键入以保存节点引用(尽管列表末尾的值可能为null)。

因此,您的本地node变量可能“指向”包含next字段的Node对象,该字段“指向”另一个Node对象,该对象包含指向另一个的“next”字段节点对象,无限广告。

(要理解的一件重要事情是,仅仅因为你有一个带有“next”字段的Node对象指向某个地方并不意味着每个 Node对象的“next”字段都指向同一个某处。该字段的名称不是该对象的标识。)

当您执行node.next.name = "B";之类的可以分解为:

的内容时
Node temp = node.next;
temp.name = "B";

将使用node.next处理的节点中的“name”字段已更改。 node为您提供最近的节点的地址,然后node.next会为您提供最近节点旁边的节点的地址。

此序列(来自您的原始帖子):

Node node = list;
node = node.next;

是您可能在代码中看到的开始遍历列表的内容。第一行从名为node的“列表头”指针初始化list。然后第二行“前进”节点到列表中的第二个节点。因此,在此语句后node正在寻址列表的第二个节点。

答案 2 :(得分:0)

你问:

  

这是否意味着我也在使用list.next更改列表?

不,您只需重新分配对象变量(对象引用)node以指向列表中的其他节点。

  

如果我写(node.next.name =“B”),我是否还要更改list.next元素的名称?

node分配给list时,您编写的语句为true。在node = node.next;之后,该行为将修改不同的节点。

如果您记住列表中的任何NODE或NODES子集,可以将其视为一个列表。

希望有所帮助。