Одно и то же имя переменной используется дважды, но программа не выдает ошибку? - PullRequest
0 голосов
/ 17 февраля 2019

В приведенном ниже коде для связанного списка

Почему Link newLink = new Link() не выдает ошибку во второй раз, когда thelist.insertfirst() вызывается, поскольку newlink уже определено?

МОЕ ПОНИМАНИЕ - Область действия переменной newlink - это метод insertfirst().

Link newLink = new Link(id, dd);

Когда создается ссылка newlink, переменная newlink содержит адрес памяти созданного объекта ссылки.

newLink.next = first;

first - переменная ссылки, которая содержит адрес памяти объекта ссылки.

Затем newlink.next() направляется к object contained at the memory address of the variable first.

first = newLink;

Затем переменная first направляется к newlink.Это означает, что теперь сначала содержится адрес памяти объекта newlink (сама newlink содержит адрес для реального объекта).

Когда метод завершается, переменная 'newlink' теряется, но нам все равно, поскольку у нас уже есть copied адрес памяти (в поле next) объектов ссылки.

Правильна ли эта аналогия?

class Link
   {
   public int iData;              // data item
   public double dData;           // data item
   public Link next;              // next link in list

   public Link(int id, double dd) // constructor
     {
      iData = id;                 // initialize data
      dData = dd;                 // ('next' is automatically
     }                           //  set to null)

//////////////////////////////////////////////////////////////////////

class LinkList
   {
   private Link first;            // ref to first link on list



   public LinkList()              // constructor
      {
      first = null;               // no links on list yet
      }

                              // insert at start of list
   public void insertFirst(int id, double dd)
      {                           // make new link
      Link newLink = new Link(id, dd);//######################################## DOESN'T THROW ERROR 
      newLink.next = first;       // newLink --> old first
      first = newLink;            // first --> newLink
      }

   }  // end class LinkList

//////////////////////////////////////////////////////////////////////

class LinkListApp
   {
   public static void main(String[] args)
      {
      LinkList theList = new LinkList();  // make new list

      theList.insertFirst(22, 2.99);      // insert four items
      theList.insertFirst(44, 4.99);
      theList.insertFirst(66, 6.99);
      theList.insertFirst(88, 8.99);

      }  // end main()
   }  // end class LinkListApp

///////////////////////////////////////////////////////////////////

1 Ответ

0 голосов
/ 17 февраля 2019

Вы правы, что здесь нет ошибок.Очень, очень часто встречается локальная переменная в методе, а затем вызывается этот метод несколько раз.И да, вы можете сказать, что это не одна и та же переменная при втором вызове метода, поскольку переменная создается каждый раз, когда метод выполняется.

Причина, по которой вы не можете объявить две переменные с одинаковым именемв том же смысле, что вы не знаете, что есть что.Эта проблема не в вашем коде.Каждый раз, когда вызывается ваш метод, создается переменная с именем newLink и ей присваивается значение.Поэтому, когда в следующих двух строках вы используете имя этой переменной, это, конечно, вновь созданная.Это не тот, который был создан при последнем вызове метода, ни время до последнего раза.Никакая путаница не возможна.Это причина, по которой это разрешено.

Область действия - это то, где в программе, текст, если хотите, вы можете использовать определенное имя.В этом случае между его объявлением и ближайшей вьющейся правой фигурной скобкой еще три строки вниз.Область действия не о том, сколько раз вам разрешено вызывать этот фрагмент кода и каждый раз создавать новую переменную с тем же именем.Другими словами, в рамках одной области вы можете только ввести объявление переменной с определенным именем один раз при написании программы, но вы можете использовать это объявление для фактического создания переменных каксколько угодно раз, когда программа работает.

И да, ваше описание, ваша аналогия верна.

...