Zum Hauptinhalt springen

Innere Klassen (Inner Classes)

Java bietet die Möglichkeit, Klassen und Schnittstellen zu verschachteln. Das Ziel von inneren Klassen ist eine Definition von Hilfsklassen möglichst nahe an der Stelle, wo sie gebraucht werden. Beispiele für Hilfsklassen sind Ausnahmeklassen, Komparatoren und Ereignisbehandler. Alle bisherigen Klassen werden auch als äußerer Klassen bzw. Top-Level-Klassen bezeichnet.

Geschachtelte Klassen (Nested Classes)

Geschachtelte Klassen sind Top-Level-Klassen, die zur Strukturierung des Namensraumes in anderen Top-Level-Klassen definiert sind. Ein Namensraum ist die vollständige Pfadangabe zur Klasse (z.B. java.lang). Geschachtelte Klassen müssen statisch definiert werden und sind daher im eigentlichen Sinne keine richtigen inneren Klassen.

Computer.java (Auszug)
public abstract class Computer {
...
public static final class Notebook extends Computer implements Comparable<Notebook> {...}

public static final class Cpu {...}
...
}

Elementklassen (Member Classes)

Objekte von Elementklassen sind immer mit einem Objekt der umgebenden Klasse verbunden. Dies ermöglicht die Umsetzung von Kompositionen (siehe Darstellung von Assoziationen). Sie haben Zugriff auf alle Variablen und Methoden der sie umgebenden Klasse und dürfen keine statischen Elemente enthalten.

List.java (Auszug)
public class List {
...
public class Item {...}
...
}

Lokale Klassen

Lokale Klassen werden innerhalb einer Methode definiert und können auch nur dort verwendet werden. Sie dürfen nicht als public, protected, private oder static definiert werden, dürfen keine statischen Elemente enthalten und können nur die mit final markierten Variablen und Parameter der umgebenden Methode verwenden.

Translator.java
public interface Translator {

String translate(String s);

}

Anonyme Klassen

Anonyme Klassen besitzen im Gegensatz zu lokalen Klassen keinen Namen und werden innerhalb eines Ausdrucks definiert und instanziiert; Klassendeklaration und Objekterzeugung sind also in einem Sprachkonstrukt vereint. Wird als Datentyp eine Schnittstelle benötigt, implementiert die anonyme Klasse diese Schnittstelle, wird als Datentyp eine Klasse benötigt, so wird die anonyme Klasse daraus abgeleitet.

Translator.java
public interface Translator {

String translate(String s);

}