Một lớp bên trong "thông thường" có một con trỏ ẩn (ngầm định) đến một cá thể lớp Bên ngoài. Điều này cho phép trình biên dịch tạo mã để đuổi theo con trỏ cho bạn mà bạn không cần phải nhập nó. Ví dụ: nếu có một biến "a" trong lớp ngoài thì mã trong lớp bên trong của bạn chỉ có thể thực hiện "a = 0", nhưng trình biên dịch sẽ tạo mã cho "externalPointer.a = 0" duy trì con trỏ ẩn bên dưới những cái ảnh bìa.
Điều này có nghĩa là khi bạn tạo một thể hiện của lớp bên trong, bạn phải có một thể hiện của lớp bên ngoài để liên kết nó với. Nếu bạn thực hiện việc tạo này bên trong một phương thức của lớp bên ngoài thì trình biên dịch sẽ biết sử dụng "this" làm con trỏ ngầm. Nếu bạn muốn liên kết với một số phiên bản bên ngoài khác thì bạn sử dụng cú pháp "mới" đặc biệt (xem đoạn mã bên dưới).
Nếu bạn đặt lớp bên trong của mình là "tĩnh" thì không có con trỏ ẩn và lớp bên trong của bạn không thể tham chiếu đến các thành viên của lớp ngoài. Một lớp bên trong tĩnh giống với một lớp thông thường, nhưng tên của nó được đặt bên trong lớp cha.
Đây là một đoạn mã trình bày cú pháp để tạo các lớp bên trong tĩnh và không tĩnh:
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
}
}