สวัสดี Amigo! ฉันอยากจะบอกคุณเกี่ยวกับโครงสร้างภายในของตัวแปร ดังที่คุณทราบแล้วตัวแปรแต่ละตัวเชื่อมโยงกับพื้นที่หน่วยความจำที่เก็บค่าไว้ "

“ใช่ คราวที่แล้วคุณบอกฉันเรื่องนั้น”

“เยี่ยม เป็นเรื่องดีที่คุณจำได้ ฉันจะพูดต่อไป”

"ประเภทคอมโพสิตทั้งหมดประกอบด้วยประเภทที่เรียบง่ายกว่าและในทางกลับกัน พวกมันประกอบด้วยประเภทที่เรียบง่ายกว่า จนกระทั่งในที่สุด เราลงเอยด้วยประเภทดั้งเดิมซึ่งไม่สามารถทำให้ง่ายขึ้นได้อีก นั่นคือสิ่งที่พวกเขาเรียกว่า – ประเภทดั้งเดิมสำหรับ ตัวอย่างเช่นintเป็นประเภทดั้งเดิม แต่Stringเป็นประเภทคอมโพสิตที่เก็บข้อมูลเป็นตารางอักขระ (โดยที่อักขระแต่ละตัวเป็นประเภทดั้งเดิม char )"

"น่าสนใจมาก ไปต่อ"

"ประเภทคอมโพสิตเกิดขึ้นจากการจัดกลุ่มประเภทง่ายๆ เราเรียกประเภท ดังกล่าวว่า คลาส เมื่อเรากำหนดคลาสใหม่ในโปรแกรม เราจะประกาศประเภทข้อมูลคอมโพสิต ใหม่ ข้อมูลจะเป็นประเภทคอมโพสิตอื่นหรือประเภทดั้งเดิม"

รหัสจาวา คำอธิบาย
public class Person
{
   String name;
   int age;
}
มีการประกาศประเภทคอมโพสิตใหม่Person
ข้อมูลถูกเก็บไว้ในตัวแปรString(ประเภทคอมโพสิต) nameและintตัวแปร (ประเภทดั้งเดิม)age
public class Rectangle
{
   int x, y, width, height;
}
มีการประกาศประเภทคอมโพสิตใหม่Rectangle
ประกอบด้วยสี่intตัวแปร (ประเภทดั้งเดิม)
public class Cat
{
   Person owner;
   Rectangle territory;
   int age;
   String name;
}
มีการประกาศประเภทคอมโพสิตใหม่Cat– มีตัวแปรดังต่อไปนี้:
owner, ประเภทคอมโพสิตPerson
territory, ประเภทคอมโพสิตRectangle
age, ประเภทดั้งเดิมint
name, ประเภทคอมโพสิตString

"สำหรับตอนนี้ ทุกอย่างชัดเจน แม้ว่ามันอาจจะดูแปลกก็ตาม"

"ประเภทขนาดใหญ่ (คอมโพสิต) มีประเภทขนาดเล็ก (ดั้งเดิม) จำนวนมาก นั่นเป็นสาเหตุที่วัตถุประเภทเหล่านี้ใช้หน่วยความจำจำนวนมาก - มากกว่าตัวแปรของประเภทดั้งเดิม บางครั้งก็มากกว่านั้น การดำเนินการกำหนดด้วยตัวแปรดังกล่าวเคยใช้เวลานาน เวลาและต้องการการคัดลอกหน่วยความจำส่วนใหญ่ ด้วยเหตุนี้ตัวแปรประเภทคอมโพสิตจึงไม่เก็บวัตถุเองแต่เป็นเพียงการอ้างอิงถึงวัตถุนั้นเช่น ที่อยู่ 4 ไบต์ ซึ่งเพียงพอที่จะระบุข้อมูลในวัตถุดังกล่าว เครื่อง Java จัดการกับความซับซ้อนที่เกี่ยวข้องทั้งหมด"

"ฉันไม่เข้าใจอะไรเลย"

"ก่อนหน้านี้เราเคยกล่าวไว้ว่าตัวแปรก็เหมือนกล่อง หากคุณต้องการเก็บเลข 13 ไว้ในนั้น คุณสามารถเขียน 13 ลงบนกระดาษแล้วใส่ลงในกล่อง"

"แต่ลองนึกภาพว่าคุณต้องเก็บของบางอย่างที่ใหญ่กว่าในกล่อง (ตัวแปร) ตัวอย่างเช่น สุนัข รถยนต์ หรือเพื่อนบ้านของคุณ แทนที่จะพยายามผลักสิ่งที่ผลักเข้าไปในกล่อง คุณสามารถทำสิ่งที่ง่ายกว่าได้: ใช้รูปถ่าย ของสุนัขแทนสุนัขจริง ป้ายทะเบียนแทนรถจริง หรือหมายเลขโทรศัพท์ของเพื่อนบ้านแทนเพื่อนบ้านของคุณ"

"เราหยิบกระดาษแผ่นหนึ่งแล้วจดหมายเลขโทรศัพท์ของเพื่อนบ้านไว้ ซึ่งเหมือนกับการอ้างอิงถึงวัตถุ ถ้าเราคัดลอกกระดาษที่มีหมายเลขโทรศัพท์ของเพื่อนบ้านและใส่ไว้ในกล่องหลายๆ กล่อง ตอนนี้มีการอ้างอิงมากขึ้น ให้กับเพื่อนบ้านของคุณ แต่ก่อนอื่น คุณยังมีเพื่อนบ้านแค่คนเดียว นั่นก็สมเหตุสมผลแล้วใช่ไหม"

"คุณลักษณะที่สำคัญของการจัดเก็บข้อมูลในลักษณะนี้คือคุณสามารถมีการอ้างอิงจำนวนมากไปยังวัตถุเดียว "

"น่าสนใจจัง! ฉันเกือบจะเข้าใจแล้ว ช่วยบอกฉันอีกครั้งได้ไหม จะเกิดอะไรขึ้นถ้าฉันกำหนดตัวแปรประเภทคอมโพสิตให้กับตัวแปรอื่นที่เป็นประเภทคอมโพสิตเดียวกัน"

"จากนั้นตัวแปรสองตัวจะจัดเก็บที่อยู่เดียวกัน นั่นหมายความว่าหากคุณเปลี่ยนข้อมูลของวัตถุที่อ้างอิงโดยตัวแปรหนึ่ง คุณจะเปลี่ยนข้อมูลที่อ้างอิงโดยอีกตัวแปรหนึ่ง ตัวแปรทั้งสองอ้างอิงวัตถุเดียวกันแน่นอนว่าอาจมีหลายตัว ตัวแปรอื่น ๆ ที่เก็บการอ้างอิงถึงมันด้วย"

"ตัวแปรประเภทคอมโพสิต (การอ้างอิง/คลาส) จะทำอย่างไรหากไม่ได้อ้างอิงถึงออบเจกต์? เป็นไปได้ไหม"

"ใช่ Amigo คุณกำลังนำหน้าฉันด้วยคำถามของคุณ เป็นไปได้ ถ้าตัวแปรของประเภทการอ้างอิง (คอมโพสิต) ไม่ได้จัดเก็บการอ้างอิงไปยังอ็อบเจกต์ ก็จะเก็บสิ่งที่เรียกว่า 'null' reference' โดยทั่วไปหมายความว่าอ้างอิงอ็อบเจ็กต์ที่มีแอดเดรสเป็น 0 อย่างไรก็ตาม เครื่อง Java ไม่เคยสร้างอ็อบเจกต์ด้วยแอดเดรสนี้ ดังนั้น จึงรู้เสมอว่าถ้าตัวแปรอ้างอิงมี 0 แสดงว่ามันจะไม่ชี้ไปที่อ็อบเจกต์ใดๆ "

รหัสจาวา คำอธิบาย
String s;
String s = null;
งบเทียบเท่า
Person person;
person = new Person();
person = null;
เราสร้างตัวแปรบุคคลที่มีค่าเป็นโมฆะ
เรากำหนดที่อยู่ของวัตถุบุคคลที่สร้างขึ้นใหม่ให้กับมัน
เรากำหนดค่าว่างให้กับตัวแปร
Cat cat = new Cat();
cat.owner = new Person();
cat.owner.name = "God";
เราสร้างวัตถุ Cat และจัดเก็บที่อยู่ในตัวแปร cat; cat.owner เท่ากับ null
เราตั้งค่า cat.owner เท่ากับที่อยู่ของวัตถุบุคคลที่สร้างขึ้นใหม่
cat.owner.name ยังคงมีค่าเท่ากับ null
ตั้ง cat.owner.name เท่ากับ "God"

"ฉันเข้าใจคุณถูกต้องหรือไม่ ตัวแปรแบ่งออกเป็นสองประเภท: ประเภทดั้งเดิมและประเภทการอ้างอิง ประเภทดั้งเดิมจะเก็บค่าโดยตรง ในขณะที่ประเภทการอ้างอิงจะจัดเก็บการอ้างอิงไปยังวัตถุ ประเภทดั้งเดิมประกอบด้วย int, char, boolean และอื่นๆ อีกมากมาย การอ้างอิง ประเภทรวมทุกอย่างอื่น ๆ เราใช้คลาสเพื่อสร้าง "

“คุณพูดถูกจริงๆ ลูกชายของฉัน”

"คุณบอกว่าคุณเข้าใจทุกอย่างแล้ว ต่อไปนี้คืองานบางอย่างที่จะช่วยเสริมความรู้ของคุณ"