Innere Klassen Gerd Bohlender Institut für Angewandte und Numerische Mathematik Vorlesung: Einstieg in die Informatik mit Java 13.06.07 G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 1 / 11
Übersicht 1 Einführung 2 Element-Klassen 3 Lokale Klassen 4 Anonyme Klassen 5 static geschachtelte Klassen und Schnittstellen G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 2 / 11
Einführung Innere Klassen sind geschachtelte Klassen, d.h. eine Klasse wird in einer anderen deklariert. Das bringt die folgenden Vorteile mit sich: zusammengehörige Klassen werden zusammengefasst, G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 3 / 11
Einführung Innere Klassen sind geschachtelte Klassen, d.h. eine Klasse wird in einer anderen deklariert. Das bringt die folgenden Vorteile mit sich: zusammengehörige Klassen werden zusammengefasst, die Sichtbarkeit wird kontrolliert, G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 3 / 11
Einführung Innere Klassen sind geschachtelte Klassen, d.h. eine Klasse wird in einer anderen deklariert. Das bringt die folgenden Vorteile mit sich: zusammengehörige Klassen werden zusammengefasst, die Sichtbarkeit wird kontrolliert, Namenskonflikte mit anderen Objekten im gleichem Paket werden vermieden. G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 3 / 11
Einführung Innere Klassen sind geschachtelte Klassen, d.h. eine Klasse wird in einer anderen deklariert. Das bringt die folgenden Vorteile mit sich: zusammengehörige Klassen werden zusammengefasst, die Sichtbarkeit wird kontrolliert, Namenskonflikte mit anderen Objekten im gleichem Paket werden vermieden. Geschachtelte Klassen können unabhängig vom Modifizierer gegenseitig auf ihre Komponenten und Methoden zugreifen. G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 3 / 11
Einführung Innere Klassen sind geschachtelte Klassen, d.h. eine Klasse wird in einer anderen deklariert. Das bringt die folgenden Vorteile mit sich: zusammengehörige Klassen werden zusammengefasst, die Sichtbarkeit wird kontrolliert, Namenskonflikte mit anderen Objekten im gleichem Paket werden vermieden. Geschachtelte Klassen können unabhängig vom Modifizierer gegenseitig auf ihre Komponenten und Methoden zugreifen. G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 3 / 11
Element-Klassen Die innere Klasse wird bei den Elementen der äußeren Klasse deklariert. Die Klassennamen müssen sich unterscheiden. Die innere Klasse benötigt eine Instanz der äußeren Klasse. G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 4 / 11
Element-Klassen Die innere Klasse wird bei den Elementen der äußeren Klasse deklariert. Die Klassennamen müssen sich unterscheiden. Die innere Klasse benötigt eine Instanz der äußeren Klasse. Der Modifizierer der inneren Klasse ist frei wählbar, d.h. er hängt nicht vom Modifizierer der äußeren Klasse ab. G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 4 / 11
Element-Klassen Die innere Klasse wird bei den Elementen der äußeren Klasse deklariert. Syntax Die Klassennamen müssen sich unterscheiden. Die innere Klasse benötigt eine Instanz der äußeren Klasse. Der Modifizierer der inneren Klasse ist frei wählbar, d.h. er hängt nicht vom Modifizierer der äußeren Klasse ab. class Aussen { // Daten und Methoden class Innen { // Daten und Methoden } } G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 4 / 11
Element-Klassen Die innere Klasse wird bei den Elementen der äußeren Klasse deklariert. Syntax Die Klassennamen müssen sich unterscheiden. Die innere Klasse benötigt eine Instanz der äußeren Klasse. Der Modifizierer der inneren Klasse ist frei wählbar, d.h. er hängt nicht vom Modifizierer der äußeren Klasse ab. class Aussen { // Daten und Methoden class Innen { // Daten und Methoden } } G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 4 / 11
Element-Klassen Bei der Kompilierung legt der Kompiler für die innere Klasse eine separate class-datei an, im obigen Beispiel: Achtung Aussen$Innen.class Elementklassen dürfen keine statischen Komponenten, Methoden oder Klassen enthalten, solange die Elementklasse nicht selber static ist! G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 5 / 11
Element-Klassen Bei der Kompilierung legt der Kompiler für die innere Klasse eine separate class-datei an, im obigen Beispiel: Achtung Aussen$Innen.class Elementklassen dürfen keine statischen Komponenten, Methoden oder Klassen enthalten, solange die Elementklasse nicht selber static ist! G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 5 / 11
Lokale Klassen Lokale Klassen werden in einem Block in einer Methode der äußeren Klasse deklariert. Die Klassennamen müssen sich unterscheiden. G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 6 / 11
Lokale Klassen Lokale Klassen werden in einem Block in einer Methode der äußeren Klasse deklariert. Die Klassennamen müssen sich unterscheiden. Es sind keine Modifizierer sowie statische Komponenten erlaubt. G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 6 / 11
Lokale Klassen Lokale Klassen werden in einem Block in einer Methode der äußeren Klasse deklariert. Die Klassennamen müssen sich unterscheiden. Es sind keine Modifizierer sowie statische Komponenten erlaubt. Zugriffe auf lokale Konstanten der äußeren Klasse sind erlaubt, dabei müssen die Konstanten allerdings vor der inneren Klasse definiert sein, Zugriffe auf lokale Variablen der äußeren Klasse sind hingegen verboten (Bei der Kompilierung wird eine separate class Datei erzeugt, die eine Kopie der lokalen Variablen enthält.). G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 6 / 11
Lokale Klassen Lokale Klassen werden in einem Block in einer Methode der äußeren Klasse deklariert. Achtung Die Klassennamen müssen sich unterscheiden. Es sind keine Modifizierer sowie statische Komponenten erlaubt. Zugriffe auf lokale Konstanten der äußeren Klasse sind erlaubt, dabei müssen die Konstanten allerdings vor der inneren Klasse definiert sein, Zugriffe auf lokale Variablen der äußeren Klasse sind hingegen verboten (Bei der Kompilierung wird eine separate class Datei erzeugt, die eine Kopie der lokalen Variablen enthält.). Ist die Methode statisch, so darf in der inneren Klasse nur auf statische Elemente der äußeren Klasse zugegriffen werden, andernfalls auf alle! G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 6 / 11
Lokale Klassen Lokale Klassen werden in einem Block in einer Methode der äußeren Klasse deklariert. Achtung Die Klassennamen müssen sich unterscheiden. Es sind keine Modifizierer sowie statische Komponenten erlaubt. Zugriffe auf lokale Konstanten der äußeren Klasse sind erlaubt, dabei müssen die Konstanten allerdings vor der inneren Klasse definiert sein, Zugriffe auf lokale Variablen der äußeren Klasse sind hingegen verboten (Bei der Kompilierung wird eine separate class Datei erzeugt, die eine Kopie der lokalen Variablen enthält.). Ist die Methode statisch, so darf in der inneren Klasse nur auf statische Elemente der äußeren Klasse zugegriffen werden, andernfalls auf alle! G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 6 / 11
Beispiel class Aussen { private int var1; public void methode () { int var2; final int konst1 = 333; class Innen { // innere Klasse Innen () { // Konstruktor System.out.println(var1); // ok System.out.println(var2); // Fehler! System.out.println(konst1); // ok } } } new Innen(); // Konstruktor-Aufruf } public static void main(string[] s) { Aussen Referenz = new Aussen (); Referenz.methode (); } G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 7 / 11
Anonyme Klassen Manchmal werden Klassen (Subklassen, Implementierungen einer Schnittstelle) nur für eine einzige Instanz benötigt. Beispiel... class MeineKlasse extends Vorlage { void info() {... } // Methode ueberschreiben } MeineKlasse m = new MeineKlasse (); // einmalig Instanz bilden... G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 8 / 11
Anonyme Klassen Manchmal werden Klassen (Subklassen, Implementierungen einer Schnittstelle) nur für eine einzige Instanz benötigt. Beispiel... class MeineKlasse extends Vorlage { void info() {... } // Methode ueberschreiben } MeineKlasse m = new MeineKlasse (); // einmalig Instanz bilden... G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 8 / 11
Anonyme Klassen Dies kann einfacher mit einer anonymen Klasse formuliert werden. Anonyme Klassen sind lokal und verzichten auf einen Bezeichner, also einen Namen für die Klasse. Beispiel... Vorlage m = new Vorlage() {void info() {... }};... Es wird eine abgeleitete Klasse der Klasse Vorlage gebildet und die Methode info() ersetzt. Weiterhin wird eine Instanz der anonymen Klasse erzeugt, die den Typ der Superklasse besitzt. G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 9 / 11
Anonyme Klassen Dies kann einfacher mit einer anonymen Klasse formuliert werden. Anonyme Klassen sind lokal und verzichten auf einen Bezeichner, also einen Namen für die Klasse. Beispiel... Vorlage m = new Vorlage() {void info() {... }};... Es wird eine abgeleitete Klasse der Klasse Vorlage gebildet und die Methode info() ersetzt. Weiterhin wird eine Instanz der anonymen Klasse erzeugt, die den Typ der Superklasse besitzt. G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 9 / 11
Anonyme Klassen Anonyme Klassen können nur mit Schnittstellen bzw. Basisklassen gebildet werden. Definitionen eigener neuer Methoden sind nicht sinnvoll, da diese nicht angesprochen werden können. G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 10 / 11
Anonyme Klassen Anonyme Klassen können nur mit Schnittstellen bzw. Basisklassen gebildet werden. Definitionen eigener neuer Methoden sind nicht sinnvoll, da diese nicht angesprochen werden können. Es kann kein (expliziter) Konstruktor gebildet werden. Damit ist der Zugriff auf den super-konstruktor ebenfalls nicht möglich. G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 10 / 11
Anonyme Klassen Anonyme Klassen können nur mit Schnittstellen bzw. Basisklassen gebildet werden. Definitionen eigener neuer Methoden sind nicht sinnvoll, da diese nicht angesprochen werden können. Es kann kein (expliziter) Konstruktor gebildet werden. Damit ist der Zugriff auf den super-konstruktor ebenfalls nicht möglich. Es ist insgesamt nur eine Instanz möglich. G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 10 / 11
Anonyme Klassen Anonyme Klassen können nur mit Schnittstellen bzw. Basisklassen gebildet werden. Definitionen eigener neuer Methoden sind nicht sinnvoll, da diese nicht angesprochen werden können. Es kann kein (expliziter) Konstruktor gebildet werden. Damit ist der Zugriff auf den super-konstruktor ebenfalls nicht möglich. Es ist insgesamt nur eine Instanz möglich. Der Kompiler erzeugt für diese Instanz eine eigene class-datei (an den Namen der äußeren Klasse wird eine fortlaufende Nummer angehängt, also z.b. Aussen$1.class). G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 10 / 11
Anonyme Klassen Achtung Anonyme Klassen können nur mit Schnittstellen bzw. Basisklassen gebildet werden. Definitionen eigener neuer Methoden sind nicht sinnvoll, da diese nicht angesprochen werden können. Es kann kein (expliziter) Konstruktor gebildet werden. Damit ist der Zugriff auf den super-konstruktor ebenfalls nicht möglich. Es ist insgesamt nur eine Instanz möglich. Der Kompiler erzeugt für diese Instanz eine eigene class-datei (an den Namen der äußeren Klasse wird eine fortlaufende Nummer angehängt, also z.b. Aussen$1.class). Es sind keine statische Komponenten erlaubt! G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 10 / 11
Anonyme Klassen Achtung Anonyme Klassen können nur mit Schnittstellen bzw. Basisklassen gebildet werden. Definitionen eigener neuer Methoden sind nicht sinnvoll, da diese nicht angesprochen werden können. Es kann kein (expliziter) Konstruktor gebildet werden. Damit ist der Zugriff auf den super-konstruktor ebenfalls nicht möglich. Es ist insgesamt nur eine Instanz möglich. Der Kompiler erzeugt für diese Instanz eine eigene class-datei (an den Namen der äußeren Klasse wird eine fortlaufende Nummer angehängt, also z.b. Aussen$1.class). Es sind keine statische Komponenten erlaubt! G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 10 / 11
static geschachtelte Klassen und Schnittstellen Statisch geschachtelte Klassen bzw. Schnittstellen verhalten sich wie Elementklassen, sind jedoch zusätzlich mit dem Schlüsselwort static versehen. Sie besitzen keinen Bezug zu einer Instanz und sind daher sogenannte Top-Level Klassen bzw. Top-Level Schnittstellen. G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 11 / 11
static geschachtelte Klassen und Schnittstellen Statisch geschachtelte Klassen bzw. Schnittstellen verhalten sich wie Elementklassen, sind jedoch zusätzlich mit dem Schlüsselwort static versehen. Sie besitzen keinen Bezug zu einer Instanz und sind daher sogenannte Top-Level Klassen bzw. Top-Level Schnittstellen. Von außen über die Klassennamen Aussen.Innen ansprechbar. G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 11 / 11
static geschachtelte Klassen und Schnittstellen Statisch geschachtelte Klassen bzw. Schnittstellen verhalten sich wie Elementklassen, sind jedoch zusätzlich mit dem Schlüsselwort static versehen. Sie besitzen keinen Bezug zu einer Instanz und sind daher sogenannte Top-Level Klassen bzw. Top-Level Schnittstellen. Von außen über die Klassennamen Aussen.Innen ansprechbar. Außer beim Namen besitzt diese Klassengattung keine echte Schachtelung. G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 11 / 11
static geschachtelte Klassen und Schnittstellen Statisch geschachtelte Klassen bzw. Schnittstellen verhalten sich wie Elementklassen, sind jedoch zusätzlich mit dem Schlüsselwort static versehen. Sie besitzen keinen Bezug zu einer Instanz und sind daher sogenannte Top-Level Klassen bzw. Top-Level Schnittstellen. Von außen über die Klassennamen Aussen.Innen ansprechbar. Außer beim Namen besitzt diese Klassengattung keine echte Schachtelung. Eine statisch geschachtelte Schnittstelle darf eine Klasse enthalten, welche (implizit) statisch ist und daher eine Top-Level Klasse ist. G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 11 / 11
static geschachtelte Klassen und Schnittstellen Statisch geschachtelte Klassen bzw. Schnittstellen verhalten sich wie Elementklassen, sind jedoch zusätzlich mit dem Schlüsselwort static versehen. Sie besitzen keinen Bezug zu einer Instanz und sind daher sogenannte Top-Level Klassen bzw. Top-Level Schnittstellen. Von außen über die Klassennamen Aussen.Innen ansprechbar. Außer beim Namen besitzt diese Klassengattung keine echte Schachtelung. Eine statisch geschachtelte Schnittstelle darf eine Klasse enthalten, welche (implizit) statisch ist und daher eine Top-Level Klasse ist. G. Bohlender (IANM UNI Karlsruhe) Innere Klassen 13.06.07 11 / 11