homedukeOOP mit Java: Geschachtelte Klassen Prof. Dr. Uwe Schmidt FH Wedel

Geschachtelte Klassen

weiter

weiter

Motivation

bisher:
eng zusammenhängende Klassen und Hilfsklassen müssen alle in einem globalen Namensraum untergebracht werden

weiter

weiter

Beispiel: Event handling

public
class ButtonApplet extends Applet {
 
  Button b;
 
  public
  void init () {
    b = new Button("druecke mich");
    b.addActionListener(new ButtonPressListener(this));
    ...
  }
}

Die Hilfsklasse für die Ereignisbehandlung

class ButtonPressListener
  implements ActionListener
{
  ButtonApplet a;
 
  public
  ButtonPressListener(ButtonApplet a) {
    this.a = a;
  }
 
  public
  void actionPerformed(ActionEvent e) {
    // ... a. ....
  }
}

ButtonPressListener ist eine reine Hilfsklasse, von der auch nur an einer Stelle ein Exemplar erzeugt wird.

weiter

weiter

Idee

Die Hilfsklasse innerhalb der Hauptklasse deklarieren

weiter

weiter

Beispiel: Event handling

public
class ButtonApplet2 extends Applet {
  Button b;
 
  public
  void init () {
    b = new Button("druecke mich");
 
    b.addActionListener(new ButtonPressListener(this));
  }
 
  //--------------------
  // die geschachtelte Hilfsklasse
 
  static
  class ButtonPressListener
    implements ActionListener
  {
    ButtonApplet2 a;
 
    public
    ButtonPressListener(ButtonApplet2 a) {
      this.a = a;
    }
    
    public
    void actionPerformed(ActionEvent e) {
      // ... a. ...
    }
  }
}

ButtonPressListener ist eine reine Hilfsklasse, von der auch nur an einer Stelle ein Exemplar erzeugt wird. Sie ist von außen über den Namen ButtonApplet2.ButtonPressListener bekannt.

Lästig:
die explizite Referenzübergabe beim Konstruktor.
Keine Zugriffe auf Komponenten der umfassenden Klasse über this

weiter

weiter

Idee: Geschachtelte member-Klassen

nicht statische geschachtelte Klassen.
Bei der Erzeugung eines Objekts einer geschachtelten Klasse wird implizit der this Zeiger des Objekts aus der umfassenden Klasse im Konstruktor mit übergeben.

weiter

weiter

Beispiel: Event handler

public
class ButtonApplet3 extends Applet {
  Data d;
 
  Button b;
 
  public
  void init () {
    b = new Button("druecke mich");
 
    b.addActionListener(new ButtonPressListener());
  }
 
  //--------------------
  // die geschachtelte Hilfsklasse
 
  class ButtonPressListener
    implements ActionListener
  {
    public
    void actionPerformed(ActionEvent e) {
      d = ...
    }
  }
}

weiter

Beispiel

Syntaxerweiterung für this, super und new notwendig.

public
class A {
  String name = "a";
 
  class B {
    String name = "b";
 
    class C {
      String name = "c";
 
      void print_names() {
        System.out.println
          (       name +   // "c"
             this.name +   // "c"
           C.this.name +   // "c"
           B.this.name +   // "b"
           A.this.name     // "a"
            );
      }
    } // C
  } // B
} // A
weiter
merke
Keine explizite Übergabe der Referenz an den Konstruktor des event handlers
merke
Keine explizites Datenfeld im event handler
merke
Trotzdem ist der Zugriff auf Größen möglich, die in der umfassenden Klasse deklariert sind.
merke
Member Klassen werden vom Compiler nach einem festen Schema in statische geschachtelte Klassen transformiert.
weiter

weiter

Idee: anonyme Hilfsklassen

Aus dieser Hilfsklasse wird nur an einer Stelle ein Exemplar erzeugt. Es ist also eigentlich kein Name notwendig.

--> Klassen in new Ausdrücken zugelassen.

weiter

weiter

Beispiel: Event handler

class ButtonApplet4 extends Applet {
  Data d;
 
  Button b;
 
  public
  void init () {
    b = new Button("druecke mich");
 
    b.addActionListener
      (new ActionListener()
       {
         public
         void actionPerformed(ActionEvent e) {
           // d = ...
         }
       } // end class
      );
  }
}
weiter
merke
Anonyme Klassen werden vom Compiler wie geschachtelte Klassen behandelt. Der Compiler erzeugt einen Namen für die zugehörigen .class Dateien
merke
Geschachtelte Klassen sind eine Erweiterung der Java Sprache, nicht der virtuellen Maschine.
merke
Geschachtelte Klassen haben nichts mit Mehrfachvererbung zu tun.
merke
Anonyme Klassen korrespondieren zu λ-Ausdrücken in funktionalen Sprachen.

Letzte Änderung: 14.02.2012
© Prof. Dr. Uwe Schmidt
Prof. Dr. Uwe Schmidt FH Wedel