Advanced   Java   Services non-static member classes (inner classes) Back Next Up Home


Nichtstatische Memberklassen

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.


Einige Regeln

Eine nichtstatische Memberklasse kann

  1. nichtstatische Daten und Methoden enthalten.

  2. weder statische Daten noch statische Methoden besitzen.

  3. statischen wie nichtstatische Daten und Methoden der einschließenden Klasse verwenden.

Die einschließende Klasse kann

  1. überall Objekte der nichtstatischen Memberklasse anlegen.

Eine dritte Klasse kann

  1. Objekte der nichtstatischen Memberklasse nur mit Hilfe eines Objekts der
    einschließenden Klasse anlegen. Die Syntax dazu lautet

    EinschließendeKlasse.InnereKlasse ei = objektDerEinschließendenKlasse. new InnereKlasse();

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).


Einige Beispiele aus der Klassenbibliothek
PackageKlassenichtstatische 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 Containerprotected class Container.AccessibleAWTContainer
javax.swing
JInternalFrameprotected class JInternalFrame.AccessibleJInternalFrame


Namen der BytecodeDateien

Der Compiler speichert jede Klasse als eigene Datei. Für das einleitende Beispiel erzeugt der Compiler die folgenden Dateien:

Valid XHTML 1.0 Strict top Back Next Up Home