สวัสดี Amigo! ฉันอยากจะบอกคุณเกี่ยวกับโครงสร้างภายในของตัวแปร ดังที่คุณทราบแล้วตัวแปรแต่ละตัวเชื่อมโยงกับพื้นที่หน่วยความจำที่เก็บค่าไว้ "
“ใช่ คราวที่แล้วคุณบอกฉันเรื่องนั้น”
“เยี่ยม เป็นเรื่องดีที่คุณจำได้ ฉันจะพูดต่อไป”
"ประเภทคอมโพสิตทั้งหมดประกอบด้วยประเภทที่เรียบง่ายกว่าและในทางกลับกัน พวกมันประกอบด้วยประเภทที่เรียบง่ายกว่า จนกระทั่งในที่สุด เราลงเอยด้วยประเภทดั้งเดิมซึ่งไม่สามารถทำให้ง่ายขึ้นได้อีก นั่นคือสิ่งที่พวกเขาเรียกว่า – ประเภทดั้งเดิมสำหรับ ตัวอย่างเช่นintเป็นประเภทดั้งเดิม แต่Stringเป็นประเภทคอมโพสิตที่เก็บข้อมูลเป็นตารางอักขระ (โดยที่อักขระแต่ละตัวเป็นประเภทดั้งเดิม char )"
"น่าสนใจมาก ไปต่อ"
"ประเภทคอมโพสิตเกิดขึ้นจากการจัดกลุ่มประเภทง่ายๆ เราเรียกประเภท ดังกล่าวว่า คลาส เมื่อเรากำหนดคลาสใหม่ในโปรแกรม เราจะประกาศประเภทข้อมูลคอมโพสิต ใหม่ ข้อมูลจะเป็นประเภทคอมโพสิตอื่นหรือประเภทดั้งเดิม"
รหัสจาวา | คำอธิบาย |
---|---|
|
มีการประกาศประเภทคอมโพสิตใหม่Person – ข้อมูลถูกเก็บไว้ในตัวแปร String (ประเภทคอมโพสิต) name และint ตัวแปร (ประเภทดั้งเดิม)age |
|
มีการประกาศประเภทคอมโพสิตใหม่Rectangle – ประกอบด้วยสี่ int ตัวแปร (ประเภทดั้งเดิม) |
|
มีการประกาศประเภทคอมโพสิตใหม่Cat – มีตัวแปรดังต่อไปนี้: — owner , ประเภทคอมโพสิตPerson — territory , ประเภทคอมโพสิตRectangle — age , ประเภทดั้งเดิมint — name , ประเภทคอมโพสิตString |
"สำหรับตอนนี้ ทุกอย่างชัดเจน แม้ว่ามันอาจจะดูแปลกก็ตาม"
"ประเภทขนาดใหญ่ (คอมโพสิต) มีประเภทขนาดเล็ก (ดั้งเดิม) จำนวนมาก นั่นเป็นสาเหตุที่วัตถุประเภทเหล่านี้ใช้หน่วยความจำจำนวนมาก - มากกว่าตัวแปรของประเภทดั้งเดิม บางครั้งก็มากกว่านั้น การดำเนินการกำหนดด้วยตัวแปรดังกล่าวเคยใช้เวลานาน เวลาและต้องการการคัดลอกหน่วยความจำส่วนใหญ่ ด้วยเหตุนี้ตัวแปรประเภทคอมโพสิตจึงไม่เก็บวัตถุเองแต่เป็นเพียงการอ้างอิงถึงวัตถุนั้นเช่น ที่อยู่ 4 ไบต์ ซึ่งเพียงพอที่จะระบุข้อมูลในวัตถุดังกล่าว เครื่อง Java จัดการกับความซับซ้อนที่เกี่ยวข้องทั้งหมด"
"ฉันไม่เข้าใจอะไรเลย"
"ก่อนหน้านี้เราเคยกล่าวไว้ว่าตัวแปรก็เหมือนกล่อง หากคุณต้องการเก็บเลข 13 ไว้ในนั้น คุณสามารถเขียน 13 ลงบนกระดาษแล้วใส่ลงในกล่อง"
"แต่ลองนึกภาพว่าคุณต้องเก็บของบางอย่างที่ใหญ่กว่าในกล่อง (ตัวแปร) ตัวอย่างเช่น สุนัข รถยนต์ หรือเพื่อนบ้านของคุณ แทนที่จะพยายามผลักสิ่งที่ผลักเข้าไปในกล่อง คุณสามารถทำสิ่งที่ง่ายกว่าได้: ใช้รูปถ่าย ของสุนัขแทนสุนัขจริง ป้ายทะเบียนแทนรถจริง หรือหมายเลขโทรศัพท์ของเพื่อนบ้านแทนเพื่อนบ้านของคุณ"
"เราหยิบกระดาษแผ่นหนึ่งแล้วจดหมายเลขโทรศัพท์ของเพื่อนบ้านไว้ ซึ่งเหมือนกับการอ้างอิงถึงวัตถุ ถ้าเราคัดลอกกระดาษที่มีหมายเลขโทรศัพท์ของเพื่อนบ้านและใส่ไว้ในกล่องหลายๆ กล่อง ตอนนี้มีการอ้างอิงมากขึ้น ให้กับเพื่อนบ้านของคุณ แต่ก่อนอื่น คุณยังมีเพื่อนบ้านแค่คนเดียว นั่นก็สมเหตุสมผลแล้วใช่ไหม"
"คุณลักษณะที่สำคัญของการจัดเก็บข้อมูลในลักษณะนี้คือคุณสามารถมีการอ้างอิงจำนวนมากไปยังวัตถุเดียว "
"น่าสนใจจัง! ฉันเกือบจะเข้าใจแล้ว ช่วยบอกฉันอีกครั้งได้ไหม จะเกิดอะไรขึ้นถ้าฉันกำหนดตัวแปรประเภทคอมโพสิตให้กับตัวแปรอื่นที่เป็นประเภทคอมโพสิตเดียวกัน"
"จากนั้นตัวแปรสองตัวจะจัดเก็บที่อยู่เดียวกัน นั่นหมายความว่าหากคุณเปลี่ยนข้อมูลของวัตถุที่อ้างอิงโดยตัวแปรหนึ่ง คุณจะเปลี่ยนข้อมูลที่อ้างอิงโดยอีกตัวแปรหนึ่ง ตัวแปรทั้งสองอ้างอิงวัตถุเดียวกันแน่นอนว่าอาจมีหลายตัว ตัวแปรอื่น ๆ ที่เก็บการอ้างอิงถึงมันด้วย"
"ตัวแปรประเภทคอมโพสิต (การอ้างอิง/คลาส) จะทำอย่างไรหากไม่ได้อ้างอิงถึงออบเจกต์? เป็นไปได้ไหม"
"ใช่ Amigo คุณกำลังนำหน้าฉันด้วยคำถามของคุณ เป็นไปได้ ถ้าตัวแปรของประเภทการอ้างอิง (คอมโพสิต) ไม่ได้จัดเก็บการอ้างอิงไปยังอ็อบเจกต์ ก็จะเก็บสิ่งที่เรียกว่า 'null' reference' โดยทั่วไปหมายความว่าอ้างอิงอ็อบเจ็กต์ที่มีแอดเดรสเป็น 0 อย่างไรก็ตาม เครื่อง Java ไม่เคยสร้างอ็อบเจกต์ด้วยแอดเดรสนี้ ดังนั้น จึงรู้เสมอว่าถ้าตัวแปรอ้างอิงมี 0 แสดงว่ามันจะไม่ชี้ไปที่อ็อบเจกต์ใดๆ "
รหัสจาวา | คำอธิบาย |
---|---|
|
งบเทียบเท่า |
|
เราสร้างตัวแปรบุคคลที่มีค่าเป็นโมฆะ เรากำหนดที่อยู่ของวัตถุบุคคลที่สร้างขึ้นใหม่ให้กับมัน เรากำหนดค่าว่างให้กับตัวแปร |
|
เราสร้างวัตถุ Cat และจัดเก็บที่อยู่ในตัวแปร cat; cat.owner เท่ากับ null เราตั้งค่า cat.owner เท่ากับที่อยู่ของวัตถุบุคคลที่สร้างขึ้นใหม่ cat.owner.name ยังคงมีค่าเท่ากับ null ตั้ง cat.owner.name เท่ากับ "God" |
"ฉันเข้าใจคุณถูกต้องหรือไม่ ตัวแปรแบ่งออกเป็นสองประเภท: ประเภทดั้งเดิมและประเภทการอ้างอิง ประเภทดั้งเดิมจะเก็บค่าโดยตรง ในขณะที่ประเภทการอ้างอิงจะจัดเก็บการอ้างอิงไปยังวัตถุ ประเภทดั้งเดิมประกอบด้วย int, char, boolean และอื่นๆ อีกมากมาย การอ้างอิง ประเภทรวมทุกอย่างอื่น ๆ เราใช้คลาสเพื่อสร้าง "
“คุณพูดถูกจริงๆ ลูกชายของฉัน”
"คุณบอกว่าคุณเข้าใจทุกอย่างแล้ว ต่อไปนี้คืองานบางอย่างที่จะช่วยเสริมความรู้ของคุณ"
GO TO FULL VERSION