Innerhalb von Klassen können weitere Klassen deklariert werden. Sie werden
als eingebettete Klassen (engl. nested classes) bezeichnet.
Eingebettete Klassen können statische und nicht-statische Klassen sein.
Engebettete Klassen, die mit dem Modifier public class OuterClass { ... public static class StaticNestedClass { ... } public class InnerClass { ... } ... } Das folgende Listing definiert die Klasse Listing 1.39. /* NestedClassExample.java */ public class NestedClassExample { static int a = 3; public static class StaticNestedClass { static int a2 = a; int b = 4; public static void method1() { System.out.println("Hello"); } public void method2() { System.out.println("World!"); } } public static void main(String[] args) { int a3 = NestedClassExample.StaticNestedClass.a2; System.out.println(a3); NestedClassExample.StaticNestedClass.method1(); NestedClassExample.StaticNestedClass snc = new NestedClassExample.StaticNestedClass(); int b2 = snc.b; System.out.println(b2); snc.method2(); } } Der Java-Quelltext kann nun mit Hilfe von > javac NestedClassExample.java --> NestedClassExample.class NestedClassExample$StaticNestedClass.class Die Deklaration der eingebetteten Klasse erzwingt die Erzeugung einer zusätzlichen Klassendatei. Der Name dieser zweiten Klassendatei besteht aus drei Teilen. Er beginnt mit dem Namen der umschließenden Klasse, dem im Anschluss das Zeichen "$" folgt. Nach diesem Trennzeichen ist der Name der eingebetteten Klasse notiert. Durch das Beispiel zeigt sich, dass statische eingebettete Klassen in separate Klassendateien ausgelagert werden. Wird das Beispiel nun ausgeführt, kann eine Bildschirmausgabe erzeugt werden: > java NestedClassExample 3 Hello 4 World! Innerhalb der Zugriff auf statische Felder: KlassenName1.KlassenName2.FeldName Aufruf von statischen Methoden: KlassenName1.KlassenName2.MethodenName Erzeugung eines Objekts: KlassenName1.KlassenName2 obj = new KlassenName1.KlassenName2(); (Äußere Klasse: KlassenName1, statische eingebettete Klasse: KlassenName2) Eine eingebettete Klasse, die nicht mit dem Modifier Eine nicht-statische Member-Klasse ist ein Klasse, deren Deklaration
direkt von einer äußeren Klasse umschlossen wird.
Das folgende kurze Beispiel definiert die Klasse Listing 1.40. /* NestedClassExample2.java */ public class NestedClassExample2 { public class InnerClass { int b = 4; public void method2() { System.out.println("World!"); } } public void method1() { InnerClass ic = new InnerClass(); System.out.println(ic.b); } public static void main(String[] args) { NestedClassExample2 nce2 = new NestedClassExample2(); nce2.method1(); NestedClassExample2.InnerClass ic2 = nce2. new InnerClass(); System.out.println(ic2.b); ic2.method2(); } } Die Compilierung von Primary. new KlassenName(ArgumentListe_opt) (Qualifizierte Objekterzeugung (vereinfacht), "qualified class instance creation expression") Eine Klasse kann auch innerhalb eines Methodenkörpers deklariert werden.
Derartige Klassen werden als lokale Klassen bezeichnet.
Die Verwendung der Modifier Listing 1.41. /* NestedClassExample3.java */ public class NestedClassExample3 { public void method1() { final int b = 4; class LocalClass { int b2 = b; public void method2() { System.out.println("World!"); } } LocalClass lc = new LocalClass(); System.out.println(lc.b2); lc.method2(); } public static void main(String[] args) { NestedClassExample3 nce3 = new NestedClassExample3(); nce3.method1(); } } Die Abarbeitung des Programms führt zur Ausgabe von "4" und "World!".
Das Feld Die Deklaration einer anonymen Klasse erfolgt durch eine Class-Instance-Creation-Expression. Die Instanzierung und Deklaration der anonymen Klasse erfolgt dadurch in einem Schritt. Erweiterung der Klasse KlassenName: new KlassenName() { ... } Implementierung des Interfaces InterfaceName: new InterfaceName() { ... } Die zu deklarierende anonyme Klasse (innerhalb des geschweiften Klammerpaares)
kann eine vorhandene Klasse erweitern oder ein Interface implementieren. Handelt
es sich nach dem Schlüsselwort Listing 1.42. /* AnonymousSuperClass.java */ public abstract class AnonymousSuperClass { int a = 3; public abstract int method2(); } Der Java-Quelltext Listing 1.43. /* NestedClassExample4.java */ public class NestedClassExample4 { public void method1(AnonymousSuperClass asc) { int d = asc.method2(); System.out.println(d); } public static void main(String[] args) { NestedClassExample4 nce4 = new NestedClassExample4(); nce4.method1(new AnonymousSuperClass() { int b = 4; public int method2() { int c = a * b; return c; } } ); } } Der einzige Parameter der Methode |
|