Advanced Java Services | non-static member classes (inner classes) |
Nichtstatische Memberklassen sind wohl die am Häufigsten auftretenden Fälle. Wenn man gemeinhin von inneren Klassen spricht, so meint man in der Regel nichtstatische Memberklassen. Nichtstatische Memberklassen bewegen sich auf der gleichen Ebene wie andere nichtstatische Members, und das heißt, sie sind objektbezogen. Eine solche innere Klasse braucht für ihre Existenz notwendigerweise ein Objekt der einschließenden Klasse. Wie bei den statischen Memberklassen sind wieder alle Schutzzustände erlaubt
// package xxx ; public class EnclosingClass { public class PublicMemberClass { } protected class ProtectedMemberClass { } static class DefaultMemberClass { } private class PrivateMemberClass { } }
Da nichtstatische Memberklassen objektbezogen sind machen statische Daten für so eine Klasse keinen Sinn. Konsequenterweise sind sie deswegen auch nicht zugelassen. Beim Zugriff auf die sie einschließende Klasse gibt es keinerlei Einschränkungen, da aus einem nichtstatischen Kontext heraus sowohl statische als auch nichtstatische Daten und Methoden verwendet werden dürfen. Das folgende Beipiel demonstriert die wesentlichen Möglichkeiten von inneren Klassen.
public class InnerClassDemoNew { private int a; public static int b; public InnerClassDemoNew() { System.out.println("Konstruktor InnerClassDemoNew"); InnerClass2 smc = new InnerClass2(); // 4 } public static void staticMethod() { System.out.println("äußere Methode"); } public class InnerClass1 { private double x; // 1 public void innerNonstaticMethod() { } //public static int c ; // 2 //public static void innerStaticMethod() //{ //} //inner classes cannot have static declarations // anonymer konstruktor { //Verwendung äußerer Daten und Methoden // 3 b=17; staticMethod() ; a = 17 ; } } private class InnerClass2 extends InnerClass1 { InnerClass1 smc = new InnerClass1(); // 4 } } // end OuterClass1 class Drittklasse { InnerClassDemoNew icd = new InnerClassDemoNew() ; // Anlegen eines Objektes vom Typ der inneren Klasse // 5 InnerClassDemoNew.InnerClass1 ic1 = icd.new InnerClass1() ; //InnerClassDemoNew.InnerClass1 ic2 = new icd.InnerClass1() ; //package icd does not exist //InnerClassDemoNew.InnerClass1 ic3 = new InnerClassDemoNew.InnerClass1() ; //not an enclosing class: }
Die auskommentierten Anweisungen sind fehlerhaft. Die Fehlermeldungen des Compilers folgen jeweils in der nächsten Zeile. Die folgende Liste korrespondiert mit der Numerierung im obigen Beispiel.
Eine nichtstatische Memberklasse kann
Die einschließende Klasse kann
Eine dritte Klasse kann
Da die nichtstatischen Memberklassen für ihre Existenz ein Objekt der einschließenden Klasse brauchen
zählt man sie im Gegensatz zu den statischen Memberklassen nicht zu den top-level Klassen.
(siehe non-static member classes und
Übersichtstabelle der nested Klassen).
Package | Klasse | nichtstatische Memberklasse(n) |
---|---|---|
javax.swing.text |
AbstractDocument |
public class AbstractDocument.AbstractElement |
public class AbstractDocument.BranchElement | ||
public class AbstractDocument.DefaultDocumentEvent | ||
public class AbstractDocument.LeafElement | ||
java.awt |
Component |
protected class Component.AccessibleAWTComponent |
protected class Component.BltBufferStrategy | ||
protected class Component.FlipBufferStrategy | ||
java.awt | Container | protected class Container.AccessibleAWTContainer |
javax.swing |
JInternalFrame | protected class JInternalFrame.AccessibleJInternalFrame |
Der Compiler speichert jede Klasse als eigene Datei. Für das einleitende Beispiel erzeugt der Compiler die folgenden Dateien: