2017-09-01 2 views
-1

Je suis nouveau sur Java et j'ai trouvé cette implémentation de liste chaînée ci-dessous. Dans la méthode principale, nous créons une instance LinkList nommée theLinkedList et en utilisant cette méthode, nous appelons la méthode insertFirstLink 4 fois. La méthode InsertFirstLink crée une instance de lien appelée newLink. Lorsque nous appelons insertFirstLink 4 fois.Création d'objets avec le même nom lors de l'implémentation d'une liste chaînée

Cette méthode crée-t-elle 4 instances de liaison avec le même nom (newLink)? Comment est-ce possible? Nous ne pouvons pas créer des objets avec le même nom, n'est-ce pas? Qu'est-ce qui me manque? Que dois-je étudier pour comprendre cette partie?

Merci les gars. J'ai compris mon problème. Après chaque exécution, la nouvelle variable de lien est détruite, mais chaque variable détruite a une référence et c'est comme une ligne. Nous pouvons toujours passer en revue la ligne et trouver le nœud que nous voulons.

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

Variables' (pas des objets, ils ne sont pas les noms) Les noms doivent être uniques dans la portée de * *. – Kayaman

+0

Les nœuds de liste n'ont pas de noms. 'newLink' est une référence ** locale ** à un objet nouvellement créé. Je suggère que vous examiniez les variables * types * et * étendues *. –

+0

Je pensais que cette instance est un objet. Mais sans nom comment le compilateur le reconnaît. Pouvez-vous me donner plus de détails? –

Répondre

0

Les objets n'ont pas de "noms". Cette ligne:

Link newLink = new Link(bookName, millionsSold); 

déclare simplement une variable nommée newLink. Nom de la variable doit être unique dans le cadre de la visibilité si cela est impossible:

public void insertFirstLink(String bookName, int millionsSold) { 

    Link newLink = new Link(bookName + " one", millionsSold); 
    Link newLink = new Link(bookName + " two", millionsSold); 
    ... 
} 

Cependant cela est possible:

public void insertFirstLink(String bookName, int millionsSold) { 

    { Link newLink = new Link(bookName + " one", millionsSold); } 
    { Link newLink = new Link(bookName + " two", millionsSold); } 
    ... 
} 
+0

Pouvez-vous me dire ce que j'ai besoin d'étudier pour comprendre cela. –

+0

Par exemple Bruce Eckel - Penser en Java. – lexicore

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

Cette méthode ne crée pas la même variable avec le même nom 4 fois car, la variable newLink portée n'est valide que dans la portée de la méthode. Donc, chaque fois que vous appelez cette méthode, une nouvelle variable est créée et ensuite, après l'exécution de la méthode, détruite. Vous ne pouvez pas créer de variable avec le même nom dans la même méthode ou classe.

Par exemple, ce serait invalide:

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

Comme la variable sont déclarées dans la même méthode.

Vous pouvez lire this pour mieux comprendre la portée des variables

EDIT: Pour boucle dans cette liste, vous pouvez utiliser un simple alors:

// 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

Si la variable est détruite après l'exécution, comment pouvons-nous obtenir les détails de chaque nœud de la liste chaînée? Je suis confus. –

+0

Parce que dans la dernière ligne de la méthode ('firstLink = newLink;') la valeur de la variable 'newLink' est assignée' firstLink' qui est déclarée 'public Link firstLink;' dans la classe 'LinkList' et qui a une portée de classe. – amicoderozer

+0

Ok, j'ai ajouté 4 nœuds à la liste. La dernière variable Link a maintenant ajouté les détails du livre ("Harry Potter"). Maintenant, je veux obtenir des détails firstLink.next. Mais si nous supprimions les anciennes variables newLink, comment pouvons-nous accéder aux plus anciennes? –

0

insertFirstLink() ajoute un nouveau lien vers l'avant de la liste chaînée . Vous appelez la fonction quatre fois avec des paramètres différents pour chaque appel au main. Pour chacun de ces appels, la fonction appelle le constructeur Link, Link(), avec les paramètres transmis à la fonction. Ensuite, le champ suivant de Link nouvellement créé est défini pour pointer sur le premier lien dans LinkedList. Puis firstlink est défini pour pointer sur le nouveau lien qui vient d'être créé.

0

Que dois-je étudier pour comprendre cette partie?

Vous devez étudier la portée des variables en Java en détail