OOP mit Java: Geschachtelte Klassen |
bisher: |
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. |
Die Hilfsklasse innerhalb der Hauptklasse deklarieren |
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: |
nicht statische geschachtelte Klassen. |
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 = ...
}
}
}
|
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
|
Keine explizite Übergabe der
|
|
Keine explizites Datenfeld im event handler
|
|
Trotzdem ist der Zugriff auf Größen möglich, die in der umfassenden Klasse
deklariert sind.
|
|
Member Klassen werden vom Compiler nach einem festen Schema in statische
geschachtelte Klassen transformiert.
|
Aus dieser Hilfsklasse wird nur an einer Stelle ein Exemplar erzeugt. Es ist also eigentlich kein Name notwendig. --> Klassen in new Ausdrücken zugelassen. |
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
);
}
}
|
Anonyme Klassen werden vom Compiler wie geschachtelte Klassen behandelt.
Der Compiler erzeugt einen Namen für die zugehörigen .class Dateien
|
|
Geschachtelte Klassen sind eine Erweiterung der Java Sprache,
nicht der virtuellen Maschine.
|
|
Geschachtelte Klassen haben nichts mit Mehrfachvererbung zu tun.
|
|
Anonyme Klassen korrespondieren zu λ-Ausdrücken in
funktionalen Sprachen.
|
Letzte Änderung: 14.02.2012 | © Prof. Dr. Uwe Schmidt |