【问题标题】:Java variable substitution when it is reflected, and notJava 变量替换时反映,而不是
【发布时间】:2021-03-06 05:38:07
【问题描述】:

如代码所示,当变量 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;
    }
}

【问题讨论】:

  • 因为ListNode list 被声明为final?
  • 没有最终由IDE自动添加,因为在这种情况下无法更改列表。

标签: java object variables substitution object-oriented-analysis


【解决方案1】:

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

阅读本书的第 3 章“原语和引用”。你的生活会变得更轻松。

【讨论】:

  • 最佳答案
【解决方案2】:

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

ListNode x = list;

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

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

x = new ListNode(1, null);

之后x != list

您可以使用原始类型(如int)进行测试,看看有什么变化。

【讨论】:

  • 非常感谢您的回复!感谢您的解释,我想通了!
猜你喜欢
  • 2010-11-20
  • 2017-08-02
  • 1970-01-01
  • 2012-09-24
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 2014-10-22
相关资源
最近更新 更多