Создание объектов с тем же именем при реализации связанного списка

Я новичок в Java, и я нашел эту реализацию связанного списка ниже. В основном методе мы создаем экземпляр LinkList с именем theLinkedList и, используя его, вызываем метод insertFirstLink 4 раза. Что делает метод InsertFirstLink, так это создает экземпляр Link с именем newLink. Когда мы вызываем insertFirstLink 4 раза.

Создает ли этот метод 4 экземпляра Link с одинаковым именем (newLink)? Как это возможно? Мы не можем создавать объекты с одинаковыми именами, верно? Что мне не хватает? Что мне нужно изучить, чтобы понять эту часть?

Спасибо, ребята. Я понял свою проблему. После каждого выполнения новая переменная ссылки уничтожается, но каждая уничтоженная переменная имеет ссылку и похожа на строку. Мы всегда можем пройти по линии и найти нужный узел.

public class Link {

    public String bookName;
    public int millionsSold;
    public Link next;

    public Link(String bookName, int millionsSold) {
        this.bookName = bookName;
        this.millionsSold = millionsSold;
    }

    public static void main(String[] args) {
        LinkList theLinkedList = new LinkList();
        theLinkedList.insertFirstLink("Don Quixote",500);
        theLinkedList.insertFirstLink("A Tale of two cities",200);
        theLinkedList.insertFirstLink("The Lord Of The Rings",150);
        theLinkedList.insertFirstLink("Harry Potter",1000);
    }
}

class LinkList {

    public Link firstLink;

    LinkList() {
        firstLink = null;
    }

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

    public void insertFirstLink(String bookName, int millionsSold) {
        Link newLink = new Link(bookName, millionsSold);
        newLink.next = firstLink;
        firstLink = newLink;
    }

}

person Kusal Dananjaya    schedule 01.09.2017    source источник
comment
Имена переменных (не объектов, у них нет имен) должны быть уникальными в области.   -  person Kayaman    schedule 01.09.2017
comment
Узлы списка не имеют имен. newLink — это локальная ссылка на вновь созданный объект. Я предлагаю вам просмотреть типы переменных и области действия.   -  person PM 77-1    schedule 01.09.2017
comment
Я думал, что экземпляр является объектом. Но без имени, как его распознает компилятор. Можете ли вы дать мне более подробную информацию?   -  person Kusal Dananjaya    schedule 01.09.2017
comment
Спасибо за ответ. Я рассмотрю больше об этом   -  person Kusal Dananjaya    schedule 01.09.2017
comment
newLink на самом деле не является объектом как таковым. Это переменная, содержащая ссылку на объект. Эта переменная может указывать на объект X в определенный момент, а позже на объект Y. Она может даже вообще не указывать на объект, тогда говорят, что переменная содержит ссылку null.   -  person Milack27    schedule 01.09.2017
comment
Просто чтобы добавить для ясности, проверьте этот небольшой код - while(currentLink != null) { currentLink.printLink(); currentLink = currentLink.nextLink; } Теперь вы видите, что переменная (дескриптор тех данных, которые вы добавили в список) была уничтожена. Таким образом, вы не можете получить данные f. е. на 5-м месте в LinkedList, если вы не перебираете их.   -  person Guillotine    schedule 01.09.2017


Ответы (4)


public void insertFirstLink(String bookName, int millionsSold) {
     Link newLink = new Link(bookName, millionsSold);
     newLink.next = firstLink;
     firstLink = newLink;
}

Этот метод не создает одну и ту же переменную с одним и тем же именем 4 раза, потому что область действия переменной newLink действительна только в области действия метода. Таким образом, каждый раз, когда вы вызываете этот метод, создается новая переменная, а затем, после выполнения метода, она уничтожается. Вы не можете создать переменную с тем же именем в том же методе или классе.

Например, это будет недопустимым:

public void insertFirstLink(String bookName, int millionsSold) {
     Link newLink = new Link(bookName, millionsSold);
     newLink.next = firstLink;
     firstLink = newLink;
     Link newLink = new Link(bookName, millionsSold);
}

Потому что переменная объявлена ​​в одном и том же методе.

Вы можете прочитать это, чтобы лучше понять область видимости переменных.

РЕДАКТИРОВАТЬ: Чтобы войти в этот список, вы можете использовать простое время:

// boolean used to exit the loop
boolean found = false;
// save firstLink to another object, this way you will not modify the linked list while looping
Link link = theLinkedList.firstLink;

while(!found)
{
      // if line.next != null you have another element in the list, so save it into link and go forward on the loop
      if(link.next != null)
      {
          link = link.next;
      }
      else
      {
          // here you are one the first inserted element
          // set found to true to exit while loop
          found = true;
          //this will print "Don Quixote 500"       
          System.out.print(link.bookName + " " + link.millionsSold);
      }

  }
person amicoderozer    schedule 01.09.2017
comment
Если переменная уничтожается после выполнения, как мы можем получить информацию о каждом узле в связанном списке? Я смущен. - person Kusal Dananjaya; 01.09.2017
comment
Потому что в последней строке метода (firstLink = newLink;) значение переменной newLink присваивается firstLink, которая объявлена ​​как public Link firstLink; в классе LinkList и имеет область действия класса. - person amicoderozer; 01.09.2017
comment
Хорошо, я добавил 4 узла в список. Теперь первая переменная Link имеет последнюю добавленную информацию о книге (Гарри Поттер). Теперь я хочу получить детали firstLink.next. Но если мы удалим старые переменные newLink, как мы сможем получить доступ к старым? - person Kusal Dananjaya; 01.09.2017
comment
Я отредактировал свой ответ, чтобы объяснить, как вы можете получить более старый элемент. - person amicoderozer; 01.09.2017
comment
Спасибо. Теперь я понимаю. - person Kusal Dananjaya; 01.09.2017

Объекты не имеют «имен». Эта строка:

Link newLink = new Link(bookName, millionsSold);

просто объявляет переменную с именем newLink. Имя переменной должно быть уникальным в пределах видимости, поэтому это невозможно:

public void insertFirstLink(String bookName, int millionsSold) {

    Link newLink = new Link(bookName + " one", millionsSold);
    Link newLink = new Link(bookName + " two", millionsSold);
    ...
}

Однако это возможно:

public void insertFirstLink(String bookName, int millionsSold) {

    { Link newLink = new Link(bookName + " one", millionsSold); }
    { Link newLink = new Link(bookName + " two", millionsSold); }
    ...
}
person lexicore    schedule 01.09.2017
comment
Можете ли вы сказать мне, что мне нужно изучить, чтобы понять это? - person Kusal Dananjaya; 01.09.2017
comment
Например, Брюс Экель - Мышление на Java. - person lexicore; 01.09.2017

insertFirstLink() добавляет новую ссылку в начало связанного списка. Вы вызываете функцию четыре раза с разными параметрами при каждом вызове в main. Для каждого из этих вызовов функция вызывает конструктор Link, Link(), с параметрами, переданными в функцию. Затем поле next только что созданного Link устанавливается так, чтобы оно указывало на первую ссылку в LinkedList. Затем firstlink указывает на только что созданную новую ссылку.

person albertjorlando    schedule 01.09.2017

Что мне нужно изучить, чтобы понять эту часть?

Вам необходимо подробно изучить Область действия переменных в Java.

person Raju Sharma    schedule 01.09.2017