理解Java中的类变量

时间:2017-06-04 01:24:01

标签: java data-structures

以下是来自热门YouTube video的简单链接列表。

public class Link {

   public String bookName;
   public int millionsSold;

   public Link next;

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

   @Override 
   public String toString() {
       return bookName;
   }

   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 and the Sorcerer's Stone", 107);

      theLinkedList.removeLink("A Tale of Two Cities");
      System.out.println("\nA Tale of Two Cities Removed\n");
   }
}

class LinkList {
   public Link firstLink;

   LinkList() {
      firstLink = null;
   }

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

   public Link removeLink(String bookName) {

      Link currentLink = firstLink;
      Link previousLink = firstLink;

      while (currentLink.bookName != bookName) {
         if (currentLink.next == null) 
            return null;
         else {
            previousLink = currentLink;
            currentLink = currentLink.next;
         }
       }

      if (currentLink == firstLink) 
        firstLink = firstLink.next;
      else {
        previousLink.next = currentLink.next;
      }
      return currentLink;
   }
}

我无法理解removeLink类的LinkedList方法。在该方法中执行语句previousLink.next = currentLink.next后,为什么更改也会反映在firstLink变量中?

编辑:

正如在评论和回答中所指出的,我理解对象变量是引用变量,并且多个变量可以引用相同的Object。因此,对任何一个引用变量的值的更改也会影响到同一引用的其他变量。

在上面的示例中,执行previousLink.next = currentLink.next行后,currentLink也会从firstLink中删除,因为previousLinkfirstLink都指向同一个对象。同样,执行currentLink = currentLink.next时,为什么它对firstLink没有任何影响?

2 个答案:

答案 0 :(得分:3)

原因是变量只不过是对内存中位置的命名引用。

我们假设firstLink指向内存中的某个Link对象

firstLink

然后,当你说

Link currentLink = firstLink;
Link previousLink = firstLink;

您将currentLinkpreviousLink指向内存中的同一个对象。现在,您对同一个对象有3个不同名称的引用。

three links

这意味着,在此赋值之后,除非任何变量指向内存中的另一个位置,否则对其中任何变量的更改将反映在其他两个位置。

答案 1 :(得分:0)

  

执行语句previousLink.next = currentLink.next后   那个方法,为什么这些变化也反映在firstLink变量中?

这已经得到了很好的回答,但是为了完整性:因为在previousLink本地指向的对象上设置一个值会改变堆上该对象的状态,并且指向它的任何其他局部变量都会看到那些变化。 用现实世界的术语来说:假设你认识琼斯先生是鲍勃,我认识他是罗伯特。如果你反对鲍勃所说的话并将他打在脸上,我会看到罗伯特有一只黑眼圈。

  

当currentLink = currentLink.next被执行时,为什么它没有   对firstLink有什么影响吗?

因为在这里我们只是简单地为一个局部变量赋值。我们已将currentLink设置为指向链中的下一个节点 - 这是纯粹的本地更改。只有在我们采取一些影响currentLink状态的行动时才会发挥作用(此时,我们正在改变堆上对象的状态)