|
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: 02.06.2008 | © Prof. Dr. Uwe Schmidt |