2015-03-07 2 views
0

В коде ниже, гдеОбъем локальной переменной «узел» в методе вставки из LinkedList

Node node = new Node(data); 
node.next = head; 
head = node; 

, сфера применения «локальной» переменной «узел» находится в пределах блока, определенного внутри метода вставки, правая ? Итак, у меня сложилось впечатление, что, когда мы выходим из метода «вставить», мы теряем доступ к переменной «узел», и это дает мне (неправильное) впечатление, что «голова» больше не указывает на правильную ячейку памяти.

Почему это не так?

Другими словами, «голова» относится к тому адресу памяти, который был выделен во время выполнения локального кода «node = new Node (data)» справа? Не было ли это распределение применено к памяти стека? Разве это не так, когда каждый раз, когда вызов функции завершен, освобождается память стека, назначенная этому вызову?

Вот весь код:

public class LinkedList { 
    public Node head; 

    public void insert (int data){ 
     if (head == null){ 
      head = new Node(data); 
     } else { 
      Node node = new Node(data); 
      node.next = head; 
      head = node; 
     } 
    } 
} 


class Node { 
    public int data; 
    Node next; 
    Node (int data){ 
     this.data = data; 
    } 
} 
+0

Вам нужно различать переменные, значения, ссылки и объекты. –

+0

@SotiriosDelimanolis, возможно, если я новичок, как отличить те, я бы не задавал этот вопрос, верно? –

+0

Это были ключевые слова, которые я ожидал от вас, но, здесь, позвольте мне написать ответ. –

ответ

0

Есть несколько концепций, мы заботимся о здесь: переменные, объекты и эталонные значения.

Переменная - это контейнер для значения. Объектом является структура данных (с некоторым поведением), которая адресуется в памяти. Контрольное значение - это значение для ссылочных типов. Это указатель на объект.

Это объясняется в JVMs here

Есть три вида ссылочных типов: типы классов, типов массивов, и типов интерфейсов. Их значения - это ссылки на динамически созданные экземпляры классов, массивы или экземпляры классов или массивы, которые реализуют интерфейсы соответственно.

и в ПСБ here

эталонных значений (часто ссылки) являются указателями на этих объектов, а также специальный опорный нуль, который относится к никакому объекту.

То, что вы здесь

Node node = new Node(data); 

имя переменной node типа Node, который после его инициализации хранит значение, которое относится к объекту типа Node.

Когда вы затем сделать

head = node; 

копировании опорного значения, хранящегося в node и хранить эту копию в переменной с именем head.

После того, как выполнение оставляет блок else, переменная node больше не входит в сферу действия, поэтому вы не можете использовать. Однако переменная head сохраняет значение, присвоенное ей.


Обратите внимание, что scope является

области программы, в течение которого лицо, объявленное декларации может быть названо с использованием простого имени, при условии, что видно (§6.4.1).

Это не имеет никакого отношения к тому, как долго значение действительно или как долго объект останется в памяти.

+0

Так голова относится к тому адресу памяти, который был выделен во время выполнения локального кода node = new Node (data); правильно? Не было ли это распределение применено к памяти стека? Разве это не так, когда каждый раз, когда вызов функции завершен, освобождается память стека, назначенная этому вызову? –

+1

@Cgraphics Все объекты (минус несколько особых случаев в некоторых JVM) выделяются в куче. Значение, возвращаемое выражением создания нового экземпляра 'new Node (data)', является ссылочным значением, которое относится к памяти в куче. –

Смежные вопросы