"สวัสดี 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)เพิ่มไปยังตัวสร้าง
"เข้าใจแล้ว คลาสที่ประกาศภายในเมธอดจะใช้สำเนาของตัวแปรเสมอ"
"อย่างแน่นอน!"
"ถ้าอย่างนั้นก็สมเหตุสมผลแล้วว่าทำไมตัวแปรถึงต้องสิ้นสุด และทำไมจึงไม่สามารถเปลี่ยนแปลงได้ หากคุณกำลังทำงานกับสำเนามากกว่าต้นฉบับ ผู้ใช้จะไม่เข้าใจว่าทำไมเขาจึงไม่สามารถเปลี่ยนแปลงค่าของตัวแปรได้ ซึ่ง หมายความว่าเราต้องห้ามไม่ให้เขาเปลี่ยนพวกเขา”
"ใช่ การประกาศตัวแปรเป็นขั้นสุดท้ายดูเหมือนเป็นราคาที่ต้องจ่ายเล็กน้อยเพื่อแลกกับการที่คอมไพเลอร์สร้างคลาสให้คุณ ส่งต่อไปยังเมธอด และบันทึกตัวแปรของเมธอดทั้งหมดที่คุณต้องการใช้"
"ฉันเห็นด้วย ชั้นเรียนในท้องถิ่นที่ไม่ระบุชื่อยังคงยอดเยี่ยมมาก"
"ถ้าฉันประกาศคลาสโลคัลภายในเมธอด และฉันใช้ตัวแปรของเมธอดในนั้น คอมไพเลอร์จะเพิ่มคลาสเหล่านั้นในคลาสด้วยหรือไม่"
"ใช่ มันจะเพิ่มเข้าไปในคลาสและคอนสตรัคเตอร์ของมัน"
"นั่นคือสิ่งที่ฉันคิดว่า."
GO TO FULL VERSION