在下面的代码中链表
为什么没有链接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
////////////////////////////////////////////////////////////////
你说错了,这里没有错误。在方法中有一个局部变量然后多次调用该方法是非常非常常见的。是的,你可能会说第二次调用方法时它不是同一个变量,因为每次执行方法时都会创建变量。
你不能在同一范围内声明两个具有相同名称的变量的原因是你不知道哪个是哪个。您的代码中没有此问题。每次调用方法时,都会创建一个名为newLink
的变量并为其赋值。因此,当在以下两行中使用此变量的名称时,它当然是新创建的变量。它不是上次调用方法时创建的那个,也不是上一次之前的时间。没有混乱是可能的。这就是允许它的原因。
范围是关于程序的位置,如果你将文本,你可以使用某个名称。在这种情况下,它的声明与最近的右括号之间的三条线进一步向下。范围不是关于允许每次调用该段代码并创建具有相同名称的新变量的次数。换句话说,在一个范围内,您只能在编写程序时键入具有特定名称的变量的声明,但是您可以使用该声明在程序运行时实际创建变量的次数。
是的,你的描述,你的比喻是正确的。