Изменение ссылки без явного изменения ссылки

В прошлом году я изучал Java и довольно хорошо разбирался в структурах данных, но всегда думал о чем-то, чего никогда не понимал. Ниже приведен пример:

public class SList{
    private SListNode head;
    private int size;

    public void insertEnd(Object obj) {
        if (head == null) {
            head = new SListNode(obj);
        } else {
            SListNode node = head;
            while (node.next != null) {
                node = node.next;
            }
            node.next = new SListNode(obj);
        }
        size++;
  }

Предполагая, что SListNode и конструктор SList уже были реализованы, почему ссылка "head" изменяется и в ее конец добавляется узел, в то время как не было объявления вроде head = node; в самом конце метода? Я знаю, что это, вероятно, очень просто, но я долго искал, и объяснений никогда не было.

1 ответ

Решение
SListNode node = head;

В этой строке node начинает указывать на тот же объект, что и head является. Поэтому, когда вы делаете что-то с node Вы меняете сам объект по ссылке. Так что просто имейте в виду, что в Java все указатели, чтобы понять, где вы делаете ошибку.

В общем, я думаю, что вы хотите получить что-то вроде этого (просто начальный пример с основной идеей):

  public void insertEnd(Object obj) {
        if (head == null) {
            head = new SListNode(obj);
        } else {
            SListNode node = head.next;
            if (node != null {
              while (true) {
                  node = node.next;
                  if (node == null) 
                     break;
              }
            }
            node = new SListNode(obj);
        }
        size++;
  }
Другие вопросы по тегам