Membuat objek dengan nama yang sama saat mengimplementasikan daftar tertaut [duplikat]

Saya baru mengenal Java dan saya menemukan implementasi daftar tertaut di bawah. Dalam metode utama kita membuat instance LinkList bernama theLinkedList dan menggunakan itu kita memanggil metode insertFirstLink sebanyak 4 kali. Apa yang dilakukan metode InsertFirstLink adalah membuat instance Link bernama newLink. Saat kita memanggil insertFirstLink 4 kali.

Apakah metode ini membuat 4 instance Link dengan nama yang sama (newLink)? Bagaimana mungkin? Kita tidak bisa membuat objek dengan nama yang sama kan? Apa yang saya lewatkan? Apa yang perlu saya pelajari untuk memahami bagian ini?

Terima kasih teman-teman. Saya memahami masalah saya. Setelah setiap eksekusi, variabel tautan baru dimusnahkan, tetapi setiap variabel yang dimusnahkan memiliki referensi dan bentuknya seperti garis. Kita selalu dapat menelusuri garis tersebut dan menemukan simpul yang kita inginkan.

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

}

person Kusal Dananjaya    schedule 01.09.2017    source sumber
comment
Nama variabel (bukan objek, tidak memiliki nama) harus unik dalam cakupan.   -  person Kayaman    schedule 01.09.2017
comment
Node daftar tidak memiliki nama. newLink adalah referensi lokal ke objek yang baru dibuat. Saya menyarankan Anda meninjau jenis dan cakupan variabel.   -  person PM 77-1    schedule 01.09.2017
comment
Saya pikir contoh itu adalah sebuah objek. Tapi tanpa nama bagaimana kompiler mengenalinya. Bisakah Anda memberi saya rincian lebih lanjut.   -  person Kusal Dananjaya    schedule 01.09.2017
comment
Terima kasih balasannya. Saya akan mengulasnya lebih lanjut   -  person Kusal Dananjaya    schedule 01.09.2017
comment
newLink sebenarnya bukanlah sebuah objek itu sendiri. Ini adalah variabel yang menyimpan referensi ke suatu objek. Variabel tersebut bisa menunjuk ke objek X pada saat tertentu, dan kemudian ke objek Y. Bahkan bisa menunjuk ke objek apa pun sama sekali, saat itulah variabel dikatakan memiliki referensi null.   -  person Milack27    schedule 01.09.2017
comment
Untuk menambah kejelasan, lihat kode kecil ini - while(currentLink != null) { currentLink.printLink(); currentLink = currentLink.nextLink; } Sekarang Anda melihat bahwa variabel (pegangan data yang Anda tambahkan ke daftar) telah dimusnahkan. Jadi Anda tidak bisa benar-benar mendapatkan datanya f. e. di tempat ke-5 di LinkedList jika Anda tidak mengulanginya.   -  person Guillotine    schedule 01.09.2017


Jawaban (4)


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

Metode ini tidak membuat variabel yang sama dengan nama yang sama sebanyak 4 kali karena, cakupan variabel newLink hanya valid dalam cakupan metode. Jadi setiap kali Anda memanggil metode ini, variabel baru dibuat dan kemudian setelah metode dijalankan, dimusnahkan. Anda tidak dapat membuat variabel dengan nama yang sama dalam metode atau kelas yang sama.

Misalnya ini tidak valid:

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

Karena variabelnya dideklarasikan dengan metode yang sama.

Anda dapat membaca ini untuk lebih memahami cakupan variabel

EDIT: Untuk mengulang ke daftar ini Anda dapat menggunakan while sederhana:

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

  }
person amicoderozer    schedule 01.09.2017
comment
Jika variabel dimusnahkan setelah eksekusi, bagaimana kita bisa mendapatkan detail setiap node dalam daftar tertaut? Saya bingung. - person Kusal Dananjaya; 01.09.2017
comment
Karena pada baris terakhir metode (firstLink = newLink;) nilai variabel newLink ditetapkan ke firstLink yang dideklarasikan sebagai public Link firstLink; di kelas LinkList dan memiliki cakupan kelas. - person amicoderozer; 01.09.2017
comment
Oke, saya menambahkan 4 node ke daftar. Sekarang variabel Tautan pertama terakhir menambahkan detail buku (Harry Potter). Sekarang saya ingin mendapatkan detail firstLink.next. Namun jika kita menghapus variabel newLink yang lama, bagaimana kita dapat mengakses variabel lama? - person Kusal Dananjaya; 01.09.2017
comment
Saya mengedit jawaban saya untuk menjelaskan bagaimana Anda bisa mendapatkan elemen yang lebih lama - person amicoderozer; 01.09.2017
comment
Terima kasih. Sekarang saya mengerti. - person Kusal Dananjaya; 01.09.2017

Objek tidak memiliki "nama". Garis ini:

Link newLink = new Link(bookName, millionsSold);

cukup mendeklarasikan variabel bernama newLink. Nama variabel harus unik dalam lingkup visibilitas sehingga hal ini tidak mungkin dilakukan:

public void insertFirstLink(String bookName, int millionsSold) {

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

Namun hal ini mungkin terjadi:

public void insertFirstLink(String bookName, int millionsSold) {

    { Link newLink = new Link(bookName + " one", millionsSold); }
    { Link newLink = new Link(bookName + " two", millionsSold); }
    ...
}
person lexicore    schedule 01.09.2017
comment
Bisakah Anda memberi tahu saya apa yang perlu saya pelajari untuk memahami hal ini. - person Kusal Dananjaya; 01.09.2017
comment
Misalnya Bruce Eckel - Berpikir di Jawa. - person lexicore; 01.09.2017

insertFirstLink() menambahkan tautan baru ke depan daftar tertaut. Anda memanggil fungsi tersebut empat kali dengan parameter berbeda pada setiap panggilan di main. Untuk setiap panggilan tersebut, fungsi akan memanggil konstruktor Tautan, Link(), dengan parameter yang diteruskan ke fungsi tersebut. Kemudian bidang berikutnya Link yang baru dibuat disetel ke tautan pertama di LinkedList. Kemudian firstlink disetel untuk menunjuk ke tautan baru yang baru saja dibuat.

person albertjorlando    schedule 01.09.2017

Apa yang perlu saya pelajari untuk memahami bagian ini?

Anda perlu mempelajari Ruang Lingkup Variabel di java secara detail

person Raju Sharma    schedule 01.09.2017