ชั้นใน "ปกติ" มีตัวชี้ (โดยนัย) ซ่อนอยู่ในอินสแตนซ์คลาสชั้นนอก วิธีนี้ช่วยให้คอมไพเลอร์สร้างโค้ดเพื่อไล่ตัวชี้ให้คุณโดยที่คุณไม่ต้องพิมพ์ ตัวอย่างเช่นหากมีตัวแปร "a" ในคลาสภายนอกโค้ดในคลาสภายในของคุณสามารถทำได้เพียงแค่ "a = 0" แต่คอมไพเลอร์จะสร้างโค้ดสำหรับ "outerPointer.a = 0" โดยดูแลตัวชี้ที่ซ่อนอยู่ภายใต้ ครอบคลุม
ซึ่งหมายความว่าเมื่อคุณสร้างอินสแตนซ์ของคลาสชั้นในคุณจะต้องมีอินสแตนซ์ของคลาสชั้นนอกเพื่อเชื่อมโยง หากคุณสร้างสิ่งนี้ภายในเมธอดของคลาสภายนอกคอมไพลเลอร์จะรู้ที่จะใช้ "this" เป็นตัวชี้โดยนัย หากคุณต้องการเชื่อมโยงไปยังอินสแตนซ์ภายนอกอื่น ๆ ให้ใช้ไวยากรณ์ "ใหม่" พิเศษ (ดูข้อมูลโค้ดด้านล่าง)
ถ้าคุณทำให้คลาสภายในของคุณเป็น "คงที่" จะไม่มีตัวชี้ที่ซ่อนอยู่และคลาสภายในของคุณจะไม่สามารถอ้างอิงสมาชิกของคลาสชั้นนอก คลาสภายในแบบคงที่จะเหมือนกับคลาสทั่วไป แต่ชื่อของมันถูกกำหนดขอบเขตไว้ในพาเรนต์
นี่คือตัวอย่างโค้ดที่สาธิตไวยากรณ์สำหรับการสร้างคลาสภายในแบบคงที่และไม่คงที่:
public class MyClass {
int a,b,c; // Some members for MyClass
static class InnerOne {
int s,e,p;
void clearA() {
//a = 0; Can't do this ... no outer pointer
}
}
class InnerTwo {
//MyClass parentPointer; Hidden pointer to outer instance
void clearA() {
a = 0;
//outerPointer.a = 0 The compiler generates this code
}
}
void myClassMember() {
// The compiler knows that "this" is the outer reference to give
// to the new "two" instance.
InnerTwo two = new InnerTwo(); //same as this.new InnerTwo()
}
public static void main(String args[]) {
MyClass outer = new MyClass();
InnerTwo x = outer.new InnerTwo(); // Have to set the hidden pointer
InnerOne y = new InnerOne(); // a "static" inner has no hidden pointer
InnerOne z = new MyClass.InnerOne(); // In other classes you have to spell out the scope
}
}