"Normal" bir iç sınıfın bir Outer sınıf örneğine gizli (örtük) bir işaretçisi vardır. Bu, derleyicinin siz yazmanıza gerek kalmadan işaretçiyi sizin için kovalaması için kodu oluşturmasına olanak tanır. Örneğin, dış sınıfta bir "a" değişkeni varsa, o zaman iç sınıfınızdaki kod sadece "a = 0" yapabilir, ancak derleyici, "OuterPointer.a = 0" için kod oluşturacaktır. Örtüler.
Bu, bir iç sınıfın bir örneğini oluşturduğunuzda, onu bağlamak için bir dış sınıf örneğine sahip olmanız gerektiği anlamına gelir. Bu yaratımı dış sınıfın bir yöntemi içinde yaparsanız, derleyici "this" i örtük işaretçi olarak kullanmayı bilir. Başka bir dış örneğe bağlanmak istiyorsanız, özel bir "yeni" sözdizimi kullanırsınız (aşağıdaki kod parçacığına bakın).
İç sınıfınızı "statik" yaparsanız, gizli işaretçi yoktur ve iç sınıfınız dış sınıfın üyelerine başvuramaz. Statik bir iç sınıf, normal bir sınıfla aynıdır, ancak adı kapsamı üst sınıfın içindedir.
Statik ve statik olmayan iç sınıflar oluşturmak için sözdizimini gösteren bir kod parçacığı:
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
}
}