2014-01-22 4 views
0

Я пытаюсь снова забрать Java, используя книгу Data Structures & Алгоритмы на Java, в стр. 191, книга реализует список ссылок. Сначала код создает класс ссылок, класс списка ссылок и клиентский класс linkapp.Область видимости локальной переменной Java

public class Link { 
    public int data; 
    public link next; 

    public Link (int newdata){ 
     data=newdata; 
    } 
} 
public class Linklist { 
    public Link first; 

    public void insertFirst(int data){ 
     Link newlink=new Link (data); 
     newlink.next=first; 
     first=newlink; 
    } 

    public boolean isEmpty(){ return (first==null); } 

    public void displaylist(){ 
     if (!isEmpty()){ 
      Link current=first; 
      while(current!=null){ 
       System.out.print(current.data); 
       current=current.next;} 
     } 
    } 
} 
public class LinklistApp { 
    public static void main(String[] args) { 
     Linkedlist linkList = new Linkedlist(); 
     linkList.insertFirst(3); 
     linkList.insertFirst(4); 
     linkList.insertFirst(5); 
     linkList.displaylist(); 
    } 
} 

Но я не понимаю, почему объект ссылки создается локально в методе insertFirst внутри класса linklist может быть доступен DisplayList метода. Локальные переменные исчезнут, когда метод завершится, потому что они всего лишь промежуточный результат. Итак, как метод displaylist все еще имел доступ к этим объектам ссылок?

ответ

3

Значение переменной newlink в insertFirst копируется в переменную экземпляр здесь:

first=newlink; 

Тогда в displayLink, значение first копируется обратно в локальную переменную:

link current=first; 

Важно различать переменные и их значения, а также между ссылками и объектами. Значения всех этих переменных link являются только ссылками.

(Кстати, этот пример является прямо из книги? Если да, то я заинтересован в использовании нетрадиционных имен, как link вместо Link для класса, и newlink вместо newLink в качестве переменной.)

+0

Не могли бы вы подробнее уточнить? Как я смешал переменную, ее значение или объект и его ссылку? – GorillaInR

+0

@GorillaInR: Ну, вы говорите, что локальные переменные «исчезают», но вы удивлены тем, что объект * ссылки *, созданный в 'insertFirst', будет доступен позже. Весьма просто, ссылка на этот объект была сохранена в переменной экземпляра. Просто потому, что локальная переменная выходит за пределы области видимости, не означает, что что-либо происходит с * объектом *, к которому относится его значение. –

+0

более конкретно означает, что поскольку сначала это переменная экземпляра, а последний вставленный объект ссылки сохраняется первым, а второй последний вставленный объект ссылки сохраняется в следующем поле/ссылке первого, а третий последний вставленный объект ссылки сохраняется в первая ссылка следующей ссылки и т. д.? Таким образом, эти объекты ссылок доступны, потому что они хранятся в первых слоях следующих полей, а не потому, что newlink все еще существует? – GorillaInR

0

Объекты, созданные с использованием ключевого слова new, выделяются в куче, а затем адрес для этого объекта помещается в стек локального вызова.

Когда локальная Stack Frame выскользнула из стека вызовов, указатель объекта (локальная переменная) выходит за пределы области видимости. Это временно сироты объекта на Куче. Здесь собрана коллекция мусора

Сборщик мусора (GC) будет сканировать кучу, ищущую объект, адреса которого не упоминаются нигде в стеке вызовов, а затем удаляют их.

В случае объекта link, который создается локально в методе insertFirst, этот адрес по-прежнему ссылается на объект в стеке вызовов, поэтому GC никогда не собирает этот объект, и поэтому объект сохраняется. Когда вы выполняете строку first=newlink, вы сохраняете адрес этого объекта в месте, которое не выходит за пределы области действия, пока не будет собран родительский объект.

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