Изменение ссылок на объекты 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 . следующий ; } n . next = end ; } :

n = n.next

Оригинал: 5 -> 10 -> 15

Насколько я понимаю, в этом случае «n» и «this» относятся к одному и тому же объекту, после отладки и перехода через:

«n» становится 15 -> 20

«это» становится 5 -> 10 -> 15 -> 20

Как это может быть? Когда я меняю «n», «это» также должно измениться?

Итак, все, что я сделал на «n», BESIDES, добавляющее 20, не задумывалось о «этом».

ОБНОВИТЬ:

Любой, у кого есть тот же вопрос, должен это прочитать .

java,

2

Ответов: 2


1 принят

Внутри цикла while вы говорите:

appendToTail(int)

Когда эта строка кода выполняется, вы изменяете значение n от «this» до n.next. Это указывает на текущий объект ссылки в списке, а затем указывает на совершенно другой объект. Когда вы проходите через связанный список, значение n продолжает обновляться по мере прохождения каждой ссылки в связанном списке.

Когда вы дойдете до конца связанного списка, нет следующего, то есть значение n равно null. Таким образом, вы выходите из цикла while и добавляете новую ссылку в конец связанного списка.


0

Из спецификации языка Java :

[a | |] ключевое слово thisобозначает значение, которое является ссылкой на объект, для которого был вызван метод экземпляра или метод по умолчанию [a | |]

Вы вызываете только thisодин конкретный узел своего списка, поэтому thisвсегда ссылается на тот же объект. Если вы хотите «входить» в каждый узел во время отладки, вы можете изменить реализацию следующим образом:

public void appendToTail(int d) {
    if (next != null) {
        next.appendToTail(d);
    } else {
        next = new ListNode(d);
    }
}
Ява,
Похожие вопросы