Java变量没有改变,即使在引用后它指向已经改变

时间:2016-08-14 11:52:39

标签: java variables scope

我正在尝试在result.next中赋值,但是当i = 1迭代完成时,某些值不会被改变。

最初结果为空。

当i为0时,第一次迭代,result.next指向ListNode(10)

当i = 1完成执行时,我期待result.next到ListNode(2)的值,因为它有temp的引用。

public void Mymethod() {
        ListNode result = null;
        ListNode temp = new ListNode(10);
        int j = 0;
        for (int k = 0; k < 10; k++) {
            for (int i = 0; i < 2; i++) {
                if (j == 0) {
                    j++;
                    result = new ListNode(1);
                    result.next = temp;
                    continue;
                }
                temp = new ListNode(2);
            }
        }
    }
class ListNode {
    public int val;
    public ListNode next;

    ListNode(int x) {
        val = x;
        next = null;
    }
}

1 个答案:

答案 0 :(得分:4)

  

...因为它引用了temp。

不,从temp行开始, <{em> result.next = temp中的引用的副本。但result.nexttemp之间没有持续的关联。稍后当您执行temp = new ListNode(2)时,会将temp的值更改为新引用,这对result.next无效。

在内循环的第一次迭代中的result.next = temp行之后,这里(大致)我们在内存中的内容:

[temp: Ref11243]−−−−−−−−−−−−−−−−−−−−−−−−−−+
                                          |
                                          |
                                          |
                                          |    +−−−−−−−−−−−−+
                                          + −−>| ListNode   |
                      +−−−−−−−−−−−−−−−−+  |    +−−−−−−−−−−−−+
[result: Ref89895]−−−>|    ListNode    |  |    | val: 10    |
                      +−−−−−−−−−−−−−−−−+  |    | next: null |
                      | val: 1         |  |    +−−−−−−−−−−−−+
                      | next: Ref11243 |−−+
                      +−−−−−−−−−−−−−−−−+

请注意,resulttemp都包含相同的值,即对您在顶部创建的ListNode的引用(我在上面显示为{{{ 1}},但我们从未看到或需要看到实际值。)

但是当你这样做时:

Ref11243

你改为:

                                              +−−−−−−−−−−−−+
[temp: Ref68545]−−−−−−−−−−−−−−−−−−−−−−−−−−−−−>| ListNode   |
                                              +−−−−−−−−−−−−+
                                              | val:  2    |
                                              | next: null |
                                              +−−−−−−−−−−−−+
                      +−−−−−−−−−−−−−−−−+
[result: Ref89895]−−−>|    ListNode    |   
                      +−−−−−−−−−−−−−−−−+   
                      | val: 1         |      +−−−−−−−−−−−−+
                      | next: Ref11243 |−−−−−>| ListNode   |
                      +−−−−−−−−−−−−−−−−+      +−−−−−−−−−−−−+
                                              | val: 10    |
                                              | next: null |
                                              +−−−−−−−−−−−−+

请注意temp = new ListNode(2); 值的变化情况,现在它指向另一个temp,新的ListNode创建了。{/ p>

在评论中你曾问过:

  

我如何在这里提供一些链接?这样每当new ListNode(2)被更改temp时,就会开始指向新的对象。

你不能,Java没有任何引用变量的概念,只是引用对象(包括数组)。