相同的变量名使用了两次但程序没有抛出错误?

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

在下面的代码中 linked 列表

为什么 Link newLink = new Link() 第二次调用 thelist.insertfirst() 时不报错,因为 newlink 已经定义了?

我的理解 - 变量 newlink 的范围是方法 insertfirst()

Link newLink = new Link(id, dd);

当创建 link newlink 时,变量 newlink 保存创建的 link 对象的内存地址。

newLink.next = first;

first 是一个 link 变量,它包含 link 对象的内存地址。

然后,newlink.next()指向object contained at the memory address of the variable first

first = newLink;

然后,变量first指向newlink。这意味着 first 现在包含对象的内存地址 newlink(newlink 本身包含实际对象的地址)。

方法完成后,变量 'newlink' 丢失,但我们不在乎,因为我们已经 copied 的内存地址(在 next 字段中) link 个对象。

这个比喻对吗?

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 的变量并为其赋值。所以当你在下面两行中使用这个变量的名称时,它当然是新创建的。它不是上次调用方法时创建的,也不是上次调用之前的时间。不可能混淆。这就是允许它的原因。

Scope是关于程序中的什么地方,文本如果你愿意,你可以使用某个名称。在这种情况下,在它的声明和最近的封闭右花括号之间向下三行。范围 而不是 允许您调用该段代码并每次创建同名新变量的次数。换句话说,在一个范围内,您在编写程序时只能键入某个名称的变量声明一次,但您可以使用 当程序为 运行.

时,该声明可根据需要多次实际创建变量

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