繁体   English   中英

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

[英]Same variable name used twice but program doesn't throw error?

在以下代码的链表中

为什么Link newLink = new Link()在第二次thelist.insertfirst()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 firstobject 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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM