两次使用相同的变量名,但是程序不会抛出错误?

时间:2019-02-17 03:59:40

标签: java linked-list doubly-linked-list

在下面的代码中的链接列表

为什么链接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 :(得分:2)

您是正确的,这里没有错误。在方法中包含局部变量然后多次调用该方法是非常非常普遍的。是的,您可能会说第二次调用该方法时它不是同一变量,因为每次执行该方法时都会创建该变量。

为什么不能在同一范围内声明两个具有相同名称的变量,原因是您不知道哪个是哪个。此问题不在您的代码中。每次调用您的方法时,都会创建一个名为newLink的变量并为其分配一个值。因此,在以下两行中使用此变量的名称时,它当然是新创建的变量。不是上次调用该方法时创建的,也不是上次调用该时间之前的时间。不能混淆。这就是允许它的原因。

范围是关于程序中的位置,如果可以的话,可以使用某个名称。在这种情况下,在其声明和最接近的右花括号之间,向下三行。关于允许您多次调用该代码段并每次创建一个具有相同名称的新变量的范围不是 。换句话说,在一个程序中,您只能在编写程序时一次键入具有特定名称的变量声明,但是您可以使用该声明来实际创建程序运行时,变量可以根据需要任意多次。

是的,您的描述,您的比喻是正确的。