สวัสดี 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 และอื่นๆ อีกมากมาย การอ้างอิง ประเภทรวมทุกอย่างอื่น ๆ เราใช้คลาสเพื่อสร้าง "

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

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

3
งาน
Java Syntax,  ระดับบทเรียน
ล็อค
Where does a Person come from?
In Java, people come from the same place that other classes come from: from the programmer's head. It is important for the creator of a class to think through what is important for the class and what is not. If he or she does, then the class will make sense and be useful. Let's begin. Let's create a Person class that allows our Person to have a name, age, weight, and... money. And then we'll create an object.
3
งาน
Java Syntax,  ระดับบทเรียน
ล็อค
Family relations
A programmer can create a man and a woman with a couple of deft movements of his or her fingers. Easy-peasy: we'll write the appropriate classes and create objects. Let's work on a married couple: we'll create Man and Woman objects, and then save a reference to the Woman in man.wife, and a reference to the Man in woman.husband. You see? You don't even need a marriage license.
3
งาน
Java Syntax,  ระดับบทเรียน
ล็อค
Pay raise
It's good to be a programmer: your salary will grow rapidly. And if this doesn't happen, you can influence the situation with a little help from your hacker friends. Imagine that you have access to the automated payroll system. You need to write an interceptor method that will add $1000 to each salary payment.
1
งาน
Java Syntax,  ระดับบทเรียน
ล็อค
Part of a calculator
Let's make the computer count for us! Ultimately, that's what they were created for. In this task, we ask the computer to calculate the sum and product of two numbers. Everything is super simple: we declare int variables, assign them a value, add and multiply them, and then display the result.