Kelas dalam "biasa" memiliki penunjuk tersembunyi (implisit) ke instance kelas Luar. Ini memungkinkan kompilator untuk menghasilkan kode untuk mengejar penunjuk untuk Anda tanpa Anda harus mengetiknya. Misalnya, jika ada variabel "a" di kelas luar maka kode di kelas dalam Anda bisa melakukan "a = 0", tetapi kompilator akan menghasilkan kode untuk "outerPointer.a = 0" dengan mempertahankan pointer tersembunyi di bawah selimut.
Ini berarti ketika Anda membuat instance dari kelas dalam, Anda harus memiliki instance kelas luar untuk ditautkan. Jika Anda melakukan pembuatan ini di dalam metode kelas luar maka kompilator tahu untuk menggunakan "ini" sebagai penunjuk implisit. Jika Anda ingin menautkan ke beberapa contoh luar lainnya, maka Anda menggunakan sintaks "baru" khusus (lihat cuplikan kode di bawah).
Jika Anda membuat kelas dalam Anda "statis" maka tidak ada pointer tersembunyi dan kelas dalam Anda tidak dapat mereferensikan anggota kelas luar. Kelas dalam statis identik dengan kelas reguler, tetapi namanya dicakup di dalam induk.
Berikut adalah cuplikan kode yang menunjukkan sintaks untuk membuat kelas dalam statis dan non-statis:
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
}
}