คลาสที่ซ้อนกันแบบคงที่ - 1

"ดังนั้น หัวข้อที่สองคือคลาสที่ซ้อนกันแบบคงที่ โปรดจำไว้ว่าคลาสที่ซ้อนกันแบบไม่คงที่เรียกว่าคลาสภายใน

"มาสรุปความหมายของคำว่า static ในบริบทของการประกาศคลาสซ้อนกัน คุณคิดอย่างไร"

"หากตัวแปรถูกประกาศเป็นสแตติก ก็จะมีสำเนาของตัวแปรเพียงชุดเดียว ดังนั้น หากคลาสที่ซ้อนกันเป็นแบบสแตติก หมายความว่าคุณสามารถสร้างออบเจกต์ของคลาสนั้นได้เพียงชิ้นเดียว"

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

"อ่า เมธอดปกติจะเก็บการอ้างอิงวัตถุโดยปริยาย แต่เมธอดสแตติกไม่เก็บ มันเหมือนกันกับคลาสสแตติก ฉันใช่ไหม เอลลี่"

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

class Zoo
{
 private static int count = 7;
 private int mouseCount = 1;

 public static int getAnimalCount()
 {
  return count;
 }

 public int getMouseCount()
 {
  return mouseCount;
 }

 public static class Mouse
 {
  public Mouse()
  {
  }
   public int getTotalCount()
  {
   return count + mouseCount; // Compilation error.
  }
 }
}

"ลองทบทวนตัวอย่างนี้อย่างละเอียด"

"ตัวแปรใดที่เมธอด getAnimalCount แบบคงที่สามารถเข้าถึงได้"

"เฉพาะแบบสแตติกเท่านั้น เพราะเป็นเมธอดแบบสแตติก"

"เมธอด getMouseCount เข้าถึงตัวแปรใดได้บ้าง"

"ทั้งแบบคงที่และไม่คงที่ มันมีการอ้างอิงที่ซ่อนอยู่ (สิ่งนี้) ไปยังวัตถุ Zoo"

"ถูกต้อง ดังนั้นคลาส Mouse ที่ซ้อนกันแบบสแตติก เช่น เมธอดแบบสแตติก สามารถเข้าถึงตัวแปรสแตติกของคลาส Zoo ได้ แต่ไม่สามารถเข้าถึงตัวแปรที่ไม่สแตติกได้"

"เราสามารถสร้างอ็อบเจกต์ Mouse ได้อย่างปลอดภัย แม้ว่าจะไม่ได้สร้างออบเจกต์ Zoo ขึ้นมาเลยก็ตาม นี่คือวิธีที่คุณสามารถทำได้:"

class Home
{
 public static void main(String[] args)
 {
  Zoo.Mouse mouse = new Zoo.Mouse();
 }
}

"คลาส Mouse เป็นคลาสธรรมดามาก ความจริงที่ว่ามันถูกประกาศในคลาส Zoo ทำให้มีคุณสมบัติพิเศษสองอย่าง"

1) เมื่อสร้างวัตถุของคลาสที่ซ้อนกัน (เช่นคลาส Mouse) นอกคลาสภายนอก คุณต้องใช้ตัวดำเนินการจุดเพื่อระบุชื่อของคลาสภายนอก

"เช่น: Zoo.Mouse"

2) คลาส Zoo.Mouse และวัตถุสามารถเข้าถึงตัวแปรและเมธอดสแตติกส่วนตัวของคลาส Zoo (เนื่องจากคลาส Mouse ถูกประกาศภายในคลาส Zoo ด้วย)

"ก็วันนี้แหละ"

“ก็แค่ชื่อเสริมแค่นั้นเอง?”

"ใช่."

"นั่นง่ายกว่าที่คิดในตอนแรก"