Java 在实现链表时创建同名对象

Java 在实现链表时创建同名对象,java,algorithm,data-structures,linked-list,Java,Algorithm,Data Structures,Linked List,我是Java新手,我在下面找到了这个链表实现。在main方法中,我们创建一个名为linkedlist的LinkList实例,并使用它调用insertFirstLink方法4次。InsertFirstLink方法所做的是创建一个名为newLink的链接实例。当我们调用insertFirstLink 4次时 此方法是否创建4个同名链接实例(newLink)? 这怎么可能? 我们不能创建同名的对象,对吗? 我遗漏了什么?我需要学习什么才能理解这一部分 谢谢大家。我理解我的问题。在每次执行之后,新的链接

我是Java新手,我在下面找到了这个链表实现。在main方法中,我们创建一个名为linkedlist的LinkList实例,并使用它调用insertFirstLink方法4次。InsertFirstLink方法所做的是创建一个名为newLink的链接实例。当我们调用insertFirstLink 4次时

此方法是否创建4个同名链接实例(newLink)? 这怎么可能? 我们不能创建同名的对象,对吗? 我遗漏了什么?我需要学习什么才能理解这一部分

谢谢大家。我理解我的问题。在每次执行之后,新的链接变量都会被销毁,但是每个被销毁的变量都有一个引用及其类似的行。我们始终可以通过线路找到所需的节点。

public class Link {

    public String bookName;
    public int millionsSold;
    public Link next;

    public Link(String bookName, int millionsSold) {
        this.bookName = bookName;
        this.millionsSold = millionsSold;
    }

    public static void main(String[] args) {
        LinkList theLinkedList = new LinkList();
        theLinkedList.insertFirstLink("Don Quixote",500);
        theLinkedList.insertFirstLink("A Tale of two cities",200);
        theLinkedList.insertFirstLink("The Lord Of The Rings",150);
        theLinkedList.insertFirstLink("Harry Potter",1000);
    }
}

class LinkList {

    public Link firstLink;

    LinkList() {
        firstLink = null;
    }

    public boolean isEmpty() {
        return(firstLink == null);
    }

    public void insertFirstLink(String bookName, int millionsSold) {
        Link newLink = new Link(bookName, millionsSold);
        newLink.next = firstLink;
        firstLink = newLink;
    }

}
对象没有“名称”。这一行:

Link newLink = new Link(bookName, millionsSold);
只需声明一个名为
newLink
的变量。变量名在可见性范围内必须是唯一的,因此这是不可能的:

public void insertFirstLink(String bookName, int millionsSold) {

    Link newLink = new Link(bookName + " one", millionsSold);
    Link newLink = new Link(bookName + " two", millionsSold);
    ...
}
public void insertFirstLink(String bookName, int millionsSold) {

    { Link newLink = new Link(bookName + " one", millionsSold); }
    { Link newLink = new Link(bookName + " two", millionsSold); }
    ...
}
但是,这是可能的:

public void insertFirstLink(String bookName, int millionsSold) {

    Link newLink = new Link(bookName + " one", millionsSold);
    Link newLink = new Link(bookName + " two", millionsSold);
    ...
}
public void insertFirstLink(String bookName, int millionsSold) {

    { Link newLink = new Link(bookName + " one", millionsSold); }
    { Link newLink = new Link(bookName + " two", millionsSold); }
    ...
}
此方法不会创建具有相同名称的同一变量4次,因为变量
newLink
范围仅在方法范围内有效。因此,每次调用此方法时,都会创建一个新变量,然后在执行该方法后,销毁该变量。不能在同一方法或类中创建具有相同名称的变量

例如,这将是无效的:

public void insertFirstLink(String bookName, int millionsSold) {
     Link newLink = new Link(bookName, millionsSold);
     newLink.next = firstLink;
     firstLink = newLink;
     Link newLink = new Link(bookName, millionsSold);
}
因为变量是在同一个方法中声明的

您可以阅读以更好地理解变量范围

编辑:要循环到此列表中,您可以使用简单的while:

// boolean used to exit the loop
boolean found = false;
// save firstLink to another object, this way you will not modify the linked list while looping
Link link = theLinkedList.firstLink;

while(!found)
{
      // if line.next != null you have another element in the list, so save it into link and go forward on the loop
      if(link.next != null)
      {
          link = link.next;
      }
      else
      {
          // here you are one the first inserted element
          // set found to true to exit while loop
          found = true;
          //this will print "Don Quixote 500"       
          System.out.print(link.bookName + " " + link.millionsSold);
      }

  }
insertFirstLink()
将新链接添加到链接列表的前面。在
main
中的每次调用中,您将使用不同的参数调用函数四次。对于这些调用中的每一个,函数都会调用链接构造函数
Link()
,并将参数传递给函数。然后,新创建的
链接的下一个字段设置为指向LinkedList中的第一个链接。然后将
firstlink
设置为指向刚创建的新链接

我需要学习什么才能理解这一部分


您需要详细研究java中变量的作用域。

变量(不是对象,它们没有名称)名称的作用域必须是唯一的。列表节点没有名称
newLink
是对新创建对象的本地引用。我建议您检查变量类型和作用域。我认为实例是一个对象。但是没有名字,编译器如何识别它。你能告诉我更多的细节吗?谢谢你的回复。我将进一步回顾
newLink
实际上并不是一个对象本身。它是一个保存对象引用的变量。该变量可以在某一时刻指向对象X,然后指向对象Y。它甚至可以根本不指向任何对象,那就是说变量包含空引用的时候。你能告诉我我需要学习什么才能理解这一点吗。例如Bruce Eckel-Java思维。如果变量在执行后被销毁,我们如何才能获得链表中每个节点的详细信息?我很困惑。因为在方法的最后一行(
firstLink=newLink;
)中,
newLink
变量的值被分配给
firstLink
,该变量被声明为
公共链接firstLink在类
LinkList
中,并且具有类作用域。好的,我在列表中添加了4个节点。现在,第一个Link变量最后添加了书籍细节(“哈利波特”)。现在我想获取firstLink.next详细信息。但是如果我们删除了旧的newLink变量,那么我们如何访问旧的变量呢?我编辑了我的答案,解释了如何获取旧的元素谢谢。现在我明白了。