java - 相同的变量名使用了两次,但程序没有抛出错误?
问题描述
在下面的链接列表代码中
为什么 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
///////////////////////////////////////// //////////////
解决方案
你是对的,这里没有错误。在方法中有一个局部变量然后多次调用该方法是非常非常常见的。是的,您可能会说第二次调用该方法时它不是同一个变量,因为每次执行该方法时都会创建该变量。
您不能在同一范围内声明两个具有相同名称的变量的原因是您不知道哪个是哪个。此问题不在您的代码中。每次调用您的方法时,都会创建一个名为的变量newLink
并为其分配一个值。所以当你在下面两行中使用这个变量的名字时,它当然是新创建的。它不是最后一次调用该方法时创建的,也不是最后一次之前的时间。没有混淆是可能的。这就是允许它的原因。
范围是关于在程序中的什么地方,文本如果你愿意,可以使用某个名称。在这种情况下,在它的声明和最近的右花括号之间再往下三行。范围与您每次被允许调用那段代码并创建具有相同名称的新变量的次数无关。换句话说,在一个范围内,您可能只在编写程序时键入具有特定名称的变量的声明一次,但您可以在程序运行时使用该声明来实际创建变量任意多次。
是的,你的描述,你的类比是正确的。
推荐阅读
- php - 从 html 到 mySQL:提交按钮不起作用
- google-chrome - 如何在没有版本信息的情况下启动 Headless Chrome?
- reactjs - TypeError:null 不是对象(评估'_NativeStripeSdk.default.initialise'),同时在反应本机应用程序中集成条带
- spring - 防止页面重定向导致数据丢失,并且需要重新加载页面并使用表单中保留的旧数据以及在表单中输入新输入的选项
- javascript - Jquery 购物清单插件
- reactjs - 无法在 componentdidmount() 内的另一个屏幕中访问参数
- svg - 合并两个 SVG 路径:Open Bezier 和 Line
- spring - 在 Spring 中使用 ConfigurationProperties 初始化地图列表
- python - 在 Qt5/PyQt5 中,如何恢复 QTextEdit 的确切可见区域和光标位置?
- nginx - 部署在 kubernetes 上的 nginx 文件浏览器所需的典型资源请求