关于Java引用的困惑
假设我有一个简单的关于Java引用的困惑,java,reference,Java,Reference,假设我有一个简单的节点类: public class Node { public Integer data = null; public Node next = null; public Node(int data) { this.data = data; } } 现在,我使用以下节点创建一个链表: Node n1 = new Node(1); Node n2 = new Node(2); Node n3 = new
节点
类:
public class Node {
public Integer data = null;
public Node next = null;
public Node(int data) {
this.data = data;
}
}
现在,我使用以下节点创建一个链表:
Node n1 = new Node(1);
Node n2 = new Node(2);
Node n3 = new Node(3);
Node n4 = new Node(4);
n1.next = n2;
n2.next = n3;
n3.next = n4;
这基本上是:1->2->3->4->null
到目前为止还不错。现在,如果我是对的,n1、n2、n3和n4持有存储节点
的相应实例的地址。所以我继续,做这个:
n2 = n3;
i、 e.将存储在n3中的地址也放入n2中
所以我希望有这样的输出列表:1->3->4->null
但是我得到的输出仍然是:
1->2->3->4->null
我误解了什么?列表如何保持完整?按照链表的工作方式,您只需要对第一个节点的完整引用即可遍历列表 行
n2=n3
所做的全部工作是将n2中的引用从节点2更改为节点3,节点本身保持不变
n1.next()
仍将等于第二个节点
n1.next().next()
将等于第三个节点
n1.next().next().next
将等于第四个节点。按照链表的工作方式,您只需要完整地引用第一个节点即可遍历该列表
行n2=n3
所做的全部工作是将n2中的引用从节点2更改为节点3,节点本身保持不变
n1.next()
仍将等于第二个节点
n1.next().next()
将等于第三个节点
n1.next().next().next
将等于第4个节点。您基本上是在更改n2所指的内容,而不是n2.next。n2和n2.next是指向两个不同对象的引用。您必须将n1.next设置为n3,以实现预期的行为。但是n2.next仍然指向n3。你基本上改变了n2指的是什么,而不是n2.next。n2和n2.next是指向两个不同对象的引用。您必须将n1.next设置为n3,以实现预期的行为。但是n2.next仍然指向n3。除非您更改next
,否则您可以随意摆弄n2和n3的引用,这不会更改节点本身指向的内容。哦,我明白了。因此,当我说n1.next=n2
时,n1.next将一直指向内存中的原始n2对象。基本上,赋值是通过“引用值”进行的。除非您正在更改下一个,否则您可以随意摆弄n2和n3的引用,而这不会更改节点本身指向的对象。哦,我明白了。因此,当我说n1.next=n2
时,n1.next将一直指向内存中的原始n2对象。基本上,分配是通过“参考值”进行的。