关于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对象。基本上,分配是通过“参考值”进行的。