Info B VL 10: Innere Klassen
Objektorientiere Programmierung in Java 2003
Ute Schmid (Vorlesung) Elmar Ludwig ( ¨ Ubung)
FB Mathematik/Informatik, Universit¨at Osnabr¨uck
Innere Klassen
Bisher: “top-level” Klassen (direkte Mitglieder eines Pakets)
Seit Java 1.1: Innere Klassen: definiert innerhalb einer anderen Klasse (Komponente einer Klasse, ähnlich Felder und Methoden)
Vier Arten von inneren Klassen:
Member Classes (“echte” innere Klasse)
Static Member Classes (Nested Top-Level Classes) Local Classes
Anonymous Classes
Member Klassen / Beispiel
Ein Auto besteht aus vielen Teilen – Motor, Gangschaltung, Auspuff, etc.
Manche Teile bilden sinnvollerweise eine eigene
Klasse, aber können dennoch nicht unabhängig vom Auto existieren.
Beispiel: Klimaanlage
Interaktion zwischen Klimaanlage und Auto ist notwendig.
Leistung der Klimaanlage ist abhängig von
Geschwindigkeit des Autos. Je langsamer das Auto
fährt, desto mehr Energie muss die Klimaanlage
zum Kühlen aufbringen.
‘AutoAirCondition’
class AirConditioner { ...
public float getTemperatureMin() { };
public float getTemperatureMax() { };
}
class Automobile {
private Engine engine;
private GearBox gearBox;
...
private class AutoAirConditioner extends AirConditioner { private float default = ...;
private float factor = ...;
...
public float getTargetTemperature () {
float temperature = default - factor * engine.getSpeed();
...
} }
public AirConditioner getAirConditioner () {
‘AirConditioner’ – Erläuterung (1)
Der AutoAirConditioner ist abhängig von Parametern eines bestimmten Autos
Beachte: Ein Objekt der inneren Klasse kann nur zusammen mit einem Objekt der umschließenden Klasse existieren
Erst neues Automobil erzeugen, dann die AutoAirCondition!
Es ist nicht möglich, ein Objekt vom Typ
AutoAirCondition zu erzeugen, ohne dass ein
Auto, zu dem diese Klimaanlage gehört existiert.
‘AirConditioner’ – Erläuterung (2)
Innere Klasse ist privat:
Andere Klassen/Objekte können nur auf das
öffentliche Inferface ( AirConditioner ) zugreifen.
Die umschließende Klasse hat eine Methode, um ein “Handle” (Referenz) auf die öffentlichen Teile des Objekts der inneren Klasse zu liefern
( getAirConditioner ).
Beachte: return new
AutoAirConditioner() ist explizit: return this.new AutoAirConditioner()
Alternatives Beispiel: Organe können nicht ohne Körper existieren.
Weitere Beispiele: Enumerator (bzw. Iterator )
Eigenschaften von Member Klassen (1)
Member-Klassen sind die typischen, “echten” inneren Klassen.
Member-Klassen sind wie Instanz-Felder und
-Methoden mit einer Instanz der Klasse, in der sie definiert sind, assoziiert.
Also: Zugriff auf alle Komponenten der umschliessenden Klasse.
Member-Klassen können beliebig tief geschachtelt werden. D. h., eine innere Klasse kann weitere innere Klassen enthalten.
Eine Member-Klasse kann mit allen
Sichtbarkeits-Modifikatoren deklariert werden.
Name muss verschieden vom Namen der
Eigenschaften von Member Klassen (2)
Member-Klassen dürfen keine statischen
Komponenten enthalten. Ausnahme: static und final deklarierte Konstanten.
Interfaces können nicht als Member-Klassen definiert
werden, da Interfaces keine Instanz-Variablen besitzen
dürfen (also kein this -Verweis möglich).
Eigenschaften von Member Klassen (3)
Wichtigstes Merkmal: Zugriff auf Instanz-Felder und -Methoden der umschliessenden Klasse.
current < numOfEls
Wie funktioniert explizite Referenz?
this.current < this.numOfEls
Problem: this.numOfEls ist nicht zulässig ( this bezieht sich auf Enumerator-Objekt)
Erweiterte Syntax:
this.current < MyListMC.this.numOfEls
Diese Zugriffsform ist dann notwendig, wenn man sich
auf eine Komponente einer äusseren Klasse beziehen
will, die denselben Namen hat wie eine Komponente
der inneren Klasse.
Eigenschaften von Member Klassen (4)
Analoge Erweiterung der super -Syntax (Zugriff auf
eine überdeckte oder überschriebene Komponente der Oberklasse der umschliessenden Klasse):
Klassenname
.super. feld
Klassenname
.super. methode
Ausführung des Member-Klassen Konstruktors
bewirkt, dass die neue Instanz mit dem this Objekt der umschliessenden Klasse assoziiert wird.
Gleichbedeutende Schreibweisen:
public Enumeration enumerate()
return new Enumerator();
public Enumeration enumerate()
return this.new Enumerator();