反映时的Java变量替换,而不是

问题描述

代码所示,当变量 x 被替换为 list 时,当 ListNode 的新实例被替换为 x.next 时,它会同时反映在 x 和 list 上(参见注释 1)。我认为这是因为 x 指的是列表。 但是,当新实例被替换为 x 时,它仅反映在 x 上,而不是列表上(请参阅注释 2)。 你能解释一下为什么会这样吗?

    public class Sample {
    public static void main(final String[] args) {
        final ListNode list = new ListNode(0,null);
        ListNode x = list;
            //1.ListNode new instance is substituted for both x and list as x refers to list
            x.next = new ListNode(1,null);
            //2.ListNode new instance is substituted only for x,not list
            x = new ListNode(1,null);
    }
}

class ListNode {
    int data;
    ListNode next;

    ListNode(final int data,final ListNode next) {
        this.data = data;
        this.next = next;
    }
}

解决方法

https://github.com/indrabasak/Books/blob/master/Head%20First%20Java%2C%202nd%20Edition.pdf

阅读本书的第 3 章“原语和参考资料”。你的生活会变得更轻松。

,

与 C++ 等其他语言不同,大多数 Java 变量(原语除外)都是对 Object 的引用。所以,之后:

ListNode x = list;

xlist 都引用同一个对象 (x == list)。您所做的任何修改(例如更改 x.next 字段)都将应用于这两个变量。

但是,您始终可以更改 x 所引用的对象(但不能更改 list,因为它是 final)并且您可以这样做:

x = new ListNode(1,null);

在那之后x != list

您可以使用原始类型(如 int)进行测试以查看发生了哪些变化。