更改对象java

时间:2016-10-13 21:28:03

标签: java

CCI书中的代码:

public class ListNode {

  int val;
  ListNode next = null;

  ListNode(int x) {
    this.val = x;
  }

而且:

  public void appendToTail(int d) {
    ListNode end = new ListNode(d);
    ListNode n = this;
    while (n.next != null) {
      n = n.next;
    }
    n.next = end;
  }

原文:5 - > 10 - > 15

据我所知,在这种情况下,“n”和“this”在调试和单步执行后引用相同的对象:

“n”变为15 - > 20

“this”变为5 - > 10 - > 15 - > 20

这怎么可能?当我改变“n”时,“this”也会改变吗?

所以我在“n”上做的一切,BESIDES追加20,并没有反映出“这个”。

更新:

任何有同样问题的人都应该阅读this

2 个答案:

答案 0 :(得分:1)

在你的while循环中你说:

n = n.next

当执行该行代码时,将n的值从“this”更改为n.next。这指向列表中的当前链接对象,然后指向完全不同的对象。当您浏览链表时,当您通过链表中的每个链接时,n的值会不断更新。

当你到达链表的末尾时没有下一个,即n的值为null。因此,您退出while循环并添加一个新链接到链接列表的末尾。

答案 1 :(得分:0)

来自Java Language Specification

  

[...]关键字this表示一个值,该值是对为其调用实例方法或默认方法的对象的引用[...]

您只在列表的一个特定节点上调用appendToTail(int),因此this始终引用同一个对象。如果要在调试期间“进入”每个节点,可以按如下方式更改实现:

public void appendToTail(int d) {
    if (next != null) {
        next.appendToTail(d);
    } else {
        next = new ListNode(d);
    }
}
相关问题