2017-09-01 78 views
-1

我是Java的新手,我在下面找到了這個鏈接列表實現。在主要方法中,我們創建一個名爲theLinkedList的LinkList實例,並使用它我們調用insertFirstLink方法4次。 InsertFirstLink方法的作用是創建一個名爲newLink的Link實例。當我們調用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; 
    } 

} 
+3

變量(不是對象,他們沒有名字)名稱需要在*範圍內是唯一*。 – Kayaman

+0

列表節點沒有名稱。 'newLink'是對新創建對象的**本地**引用。我建議你查看變量*類型*和範圍*。 –

+0

我認爲這個實例是一個對象。但沒有名稱,編譯器如何識別它。你能否給我更多的細節。 –

回答

0

對象沒有「名稱」。此行:

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); } 
    ... 
} 
+0

你能告訴我我需要學習什麼才能理解這一點。 –

+0

例如Bruce Eckel - Java中的思考。 – lexicore

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

這種方法不一樣產生相同的變量名稱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); 
} 

因爲變量在相同的方法中聲明。

您可以閱讀this更好地理解變量的作用域

編輯:要循環到這個列表中,您可以使用一個簡單而:

// 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); 
     } 

    } 
+0

如果變量在執行後被銷燬,我們怎麼能夠得到鏈表中每個節點的細節?我很困惑。 –

+0

因爲在方法的最後一行('firstLink = newLink;'),'newLink'變量的值被賦值給'firstLink',它在'LinkList'類中聲明爲'public Link firstLink;'且具有類範圍。 – amicoderozer

+0

好吧,我添加了4個節點到列表中。現在,第一個鏈接變量有最後添加的書籍細節(「哈利波特」)。現在我想要獲得第一個Link.next細節。但是,如果我們刪除舊的newLink變量,我們如何訪問舊的變量? –

0

insertFirstLink()增加了一個新的鏈接,鏈接列表的前面。您在main的每個呼叫中​​使用不同參數調用該功能四次。對於這些調用中的每一個,該函數都會調用鏈接構造函數Link(),並將參數傳遞給該函數。然後新創建的Link的下一個字段被設置爲指向LinkedList中的第一個鏈接。然後firstlink被設置爲指向剛創建的新鏈接。

0

我需要學習什麼來了解這部分?

你需要學習範圍變量在java中詳細

相關問題