การสร้างวัตถุที่มีชื่อเดียวกันเมื่อใช้รายการเชื่อมโยง [ซ้ำกัน]

ฉันยังใหม่กับ Java และฉันพบการใช้งานรายการที่เชื่อมโยงนี้ด้านล่าง ในวิธีการหลัก เราสร้างอินสแตนซ์ LinkList ชื่อ theLinkedList และใช้ที่เราเรียกวิธี 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;
    }

}

person Kusal Dananjaya    schedule 01.09.2017    source แหล่งที่มา
comment
ชื่อตัวแปร (ไม่ใช่ออบเจ็กต์ ไม่มีชื่อ) จะต้องไม่ซ้ำกันใน ขอบเขต   -  person Kayaman    schedule 01.09.2017
comment
โหนดรายการไม่มีชื่อ newLink เป็นการอ้างอิง ท้องถิ่น ไปยังวัตถุที่สร้างขึ้นใหม่ ฉันขอแนะนำให้คุณตรวจสอบตัวแปร ประเภท และ ขอบเขต   -  person PM 77-1    schedule 01.09.2017
comment
ฉันคิดว่าอินสแตนซ์นั้นเป็นวัตถุ แต่ไม่มีชื่อว่าคอมไพเลอร์จดจำได้อย่างไร คุณช่วยบอกรายละเอียดเพิ่มเติมได้ไหม   -  person Kusal Dananjaya    schedule 01.09.2017
comment
ขอบคุณสำหรับการตอบกลับ. ฉันจะทบทวนเพิ่มเติมเกี่ยวกับเรื่องนั้น   -  person Kusal Dananjaya    schedule 01.09.2017
comment
newLink จริงๆ แล้วไม่ใช่วัตถุต่อตัว เป็นตัวแปรที่เก็บ การอ้างอิง ไปยังวัตถุ ตัวแปรนั้นสามารถชี้ไปที่วัตถุ X ในช่วงเวลาหนึ่ง และต่อมาไปที่วัตถุ Y ตัวแปรนั้นสามารถชี้ไปที่วัตถุไม่ได้เลยด้วยซ้ำ นั่นคือเวลาที่ตัวแปรถูกบอกว่าเก็บการอ้างอิง null   -  person Milack27    schedule 01.09.2017
comment
เพื่อเพิ่มความชัดเจน ลองดูโค้ดเล็กๆ นี้ - while(currentLink != null) { currentLink.printLink(); currentLink = currentLink.nextLink; } ตอนนี้คุณเห็นว่าตัวแปร (ตัวจัดการข้อมูลที่คุณเพิ่มลงในรายการ) ถูกทำลายไปแล้ว คุณจึงไม่สามารถรับข้อมูลได้ f จ. อันดับที่ 5 ใน LinkedList หากคุณไม่ทำซ้ำ   -  person Guillotine    schedule 01.09.2017


คำตอบ (4)


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

เมธอดนี้จะไม่สร้างตัวแปรเดียวกันที่มีชื่อเดียวกัน 4 ครั้ง เนื่องจากตัวแปร newLink scope ใช้ได้เฉพาะในขอบเขตเมธอดเท่านั้น ดังนั้นทุกครั้งที่คุณเรียกใช้เมธอดนี้ ตัวแปรใหม่จะถูกสร้างขึ้น และหลังจากที่เมธอดถูกดำเนินการ ตัวแปรก็จะถูกทำลาย คุณไม่สามารถสร้างตัวแปรที่มีชื่อเดียวกันในเมธอดหรือคลาสเดียวกันได้

ตัวอย่างเช่น สิ่งนี้จะไม่ถูกต้อง:

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

  }
person amicoderozer    schedule 01.09.2017
comment
หากตัวแปรถูกทำลายหลังการประมวลผล เราจะสามารถรับรายละเอียดของทุกโหนดในรายการที่เชื่อมโยงได้อย่างไร ฉันสับสน. - person Kusal Dananjaya; 01.09.2017
comment
เนื่องจากในบรรทัดสุดท้ายของเมธอด (firstLink = newLink;) ค่าของตัวแปร newLink ถูกกำหนดให้กับ firstLink ที่ถูกประกาศเป็น public Link firstLink; ในคลาส LinkList และมีขอบเขตคลาส - person amicoderozer; 01.09.2017
comment
ตกลง ฉันเพิ่ม 4 โหนดลงในรายการแล้ว ตอนนี้ตัวแปรลิงก์แรกได้เพิ่มรายละเอียดหนังสือครั้งล่าสุดแล้ว (แฮร์รี่ พอตเตอร์) ตอนนี้ฉันต้องการรับรายละเอียด firstLink.next แต่ถ้าเราลบตัวแปร newLink ที่เก่ากว่า เราจะสามารถเข้าถึงตัวแปรที่เก่ากว่าได้อย่างไร? - person Kusal Dananjaya; 01.09.2017
comment
ฉันแก้ไขคำตอบเพื่ออธิบายว่าคุณจะได้องค์ประกอบที่เก่ากว่าได้อย่างไร - person amicoderozer; 01.09.2017
comment
ขอบคุณ ตอนนี้ฉันเข้าใจแล้ว - person Kusal Dananjaya; 01.09.2017

วัตถุไม่มี "ชื่อ" บรรทัดนี้:

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); }
    ...
}
person lexicore    schedule 01.09.2017
comment
คุณช่วยบอกฉันได้ไหมว่าฉันต้องเรียนอะไรบ้างจึงจะเข้าใจสิ่งนี้ - person Kusal Dananjaya; 01.09.2017
comment
เช่น Bruce Eckel - Thinking in Java - person lexicore; 01.09.2017

insertFirstLink() เพิ่มลิงก์ใหม่ไว้ที่ด้านหน้าของรายการที่เชื่อมโยง คุณกำลังเรียกใช้ฟังก์ชันสี่ครั้งด้วยพารามิเตอร์ที่แตกต่างกันในการเรียกแต่ละครั้งใน main สำหรับการเรียกแต่ละครั้ง ฟังก์ชันจะเรียกใช้ตัวสร้างลิงก์ Link() โดยมีพารามิเตอร์ที่ส่งผ่านไปยังฟังก์ชัน จากนั้นฟิลด์ถัดไปของ Link ที่สร้างขึ้นใหม่จะถูกตั้งค่าให้ชี้ไปที่ลิงก์แรกใน LinkedList จากนั้น firstlink จะถูกตั้งค่าให้ชี้ไปที่ลิงก์ใหม่ที่เพิ่งสร้างขึ้น

person albertjorlando    schedule 01.09.2017

ต้องเรียนอะไรบ้างถึงจะเข้าใจส่วนนี้?

คุณต้องศึกษาขอบเขตของตัวแปรใน java โดยละเอียด

person Raju Sharma    schedule 01.09.2017