สิ่งที่ฉันอยากรู้คือเหตุใด java จึงห้ามใช้ static fields / method ในคลาสภายใน
เนื่องจากคลาสภายในเหล่านั้นเป็นคลาสภายใน "อินสแตนซ์" นั่นคือเป็นเหมือนแอตทริบิวต์อินสแตนซ์ของวัตถุที่ปิดล้อม
เนื่องจากเป็นคลาส "อินสแตนซ์" จึงไม่สมเหตุสมผลที่จะอนุญาตให้ใช้static
คุณลักษณะเนื่องจากstatic
มีไว้เพื่อทำงานโดยไม่มีอินสแตนซ์ตั้งแต่แรก
เหมือนกับว่าคุณพยายามสร้างแอตทริบิวต์แบบคงที่ / อินสแตนซ์ในเวลาเดียวกัน
ใช้ตัวอย่างต่อไปนี้:
class Employee {
public String name;
}
หากคุณสร้างพนักงานสองอินสแตนซ์:
Employee a = new Employee();
a.name = "Oscar";
Employee b = new Employee();
b.name = "jcyang";
เป็นที่ชัดเจนว่าทำไมแต่ละคนจึงมีมูลค่าของทรัพย์สินname
ใช่ไหม?
สิ่งเดียวกันนี้เกิดขึ้นกับชั้นใน อินสแตนซ์คลาสภายในแต่ละอินสแตนซ์ไม่ขึ้นกับอินสแตนซ์คลาสภายในอื่น ๆ
ดังนั้นหากคุณพยายามสร้างcounter
แอตทริบิวต์คลาสไม่มีวิธีใดที่จะแชร์ค่านั้นกับอินสแตนซ์สองอินสแตนซ์ที่แตกต่างกัน
class Employee {
public String name;
class InnerData {
static count;
}
}
เมื่อคุณสร้างอินสแตนซ์a
และb
ในตัวอย่างด้านบนค่าที่ถูกต้องสำหรับตัวแปรคงcount
คืออะไร ไม่สามารถระบุได้เนื่องจากการมีอยู่ของInnerData
คลาสขึ้นอยู่กับวัตถุที่ปิดล้อมแต่ละชิ้น
นั่นเป็นเหตุผลว่าทำไมเมื่อชั้นเรียนถูกประกาศว่าstatic
มันไม่จำเป็นต้องมีชีวิตอีกต่อไปเพื่อดำรงชีวิตด้วยตัวเอง เมื่อไม่มีการพึ่งพาแล้วคุณสามารถประกาศแอตทริบิวต์คงที่ได้อย่างอิสระ
ฉันคิดว่าสิ่งนี้ฟังดูย้ำ แต่ถ้าคุณคิดถึงความแตกต่างระหว่างอินสแตนซ์กับคุณสมบัติคลาสมันจะสมเหตุสมผล