เกิดอะไรขึ้นจริง ๆ (เช่น สิ่งที่คอมไพเลอร์สร้างจากคลาส) - 1

"สวัสดี Amigo! นี่คือข้อมูลเพิ่มเติมสำหรับคุณ"

"ฉันบอกคุณแล้วว่าคอมไพเลอร์แปลงคลาสนิรนามทั้งหมดเป็นคลาสภายในธรรมดา"

"ใช่ ฉันจำได้ด้วยซ้ำว่าชื่อของพวกเขาเป็นตัวเลข: 1, 2, 3 และอื่นๆ"

"ถูกต้อง แต่มีความแตกต่างกันเล็กน้อยที่นี่"

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

"เราเริ่มต้นด้วยสิ่งนี้:"

ก่อนรวบรวม:
class Car
{
 public ArrayList createPoliceCars(int count)
 {
  ArrayList result = new ArrayList();

  for(int i = 0; i < count; i++)
  {
 final int number = i;
   result.add(new Car()
    {
     public String toString()
     {
      return ""+number;
     }
    });
  }
  return result;
 }
}

"และคอมไพเลอร์สร้างสิ่งนี้:

หลังจากรวบรวม:
class Car
{
 public ArrayList createPoliceCars(int count)
 {
  ArrayList result = new ArrayList();

  for(int i = 0; i < count; i++)
  {
   final int number = i;
   result.add(new Anonymous2 (number));
  }
   return result;
  }

 class Anonymous2
 {
  final int number;
  Anonymous2(int number)
 {
  this.number = number;
 }

  public String toString()
  {
   return ""+ number;
  }
 }
}

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

"มาถึงจุดที่สอง เมธอด toString() ใช้ตัวแปรที่ส่งผ่าน เพื่อให้บรรลุสิ่งนี้ จำเป็นต้อง:"

A)บันทึกไว้ในคลาสที่สร้างขึ้น

B)เพิ่มไปยังตัวสร้าง

"เข้าใจแล้ว คลาสที่ประกาศภายในเมธอดจะใช้สำเนาของตัวแปรเสมอ"

"อย่างแน่นอน!"

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

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

"ฉันเห็นด้วย ชั้นเรียนในท้องถิ่นที่ไม่ระบุชื่อยังคงยอดเยี่ยมมาก"

"ถ้าฉันประกาศคลาสโลคัลภายในเมธอด และฉันใช้ตัวแปรของเมธอดในนั้น คอมไพเลอร์จะเพิ่มคลาสเหล่านั้นในคลาสด้วยหรือไม่"

"ใช่ มันจะเพิ่มเข้าไปในคลาสและคอนสตรัคเตอร์ของมัน"

"นั่นคือสิ่งที่ฉันคิดว่า."