首页 > 解决方案 > 相同的变量名使用了两次,但程序没有抛出错误?

问题描述

在下面的链接列表代码中

为什么 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. 这意味着 first 现在包含对象的内存地址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

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

标签: javalinked-listdoubly-linked-list

解决方案


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

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

范围是关于在程序中的什么地方,文本如果你愿意,可以使用某个名称。在这种情况下,在它的声明和最近的右花括号之间再往下三行。范围与您每次被允许调用那段代码并创建具有相同名称的新变量的次数无关。换句话说,在一个范围内,您可能只在编写程序时键入具有特定名称的变量的声明一次,但您可以在程序运行时使用该声明来实际创建变量任意多次。

是的,你的描述,你的类比是正确的。


推荐阅读