Rheinwerk Computing < openbook >


 
Inhaltsverzeichnis
Materialien zum Buch
Vorwort
1 Java ist auch eine Sprache
2 Imperative Sprachkonzepte
3 Klassen und Objekte
4 Arrays und ihre Anwendungen
5 Der Umgang mit Zeichen und Zeichenketten
6 Eigene Klassen schreiben
7 Objektorientierte Beziehungsfragen
8 Schnittstellen, Aufzählungen, versiegelte Klassen, Records
9 Ausnahmen müssen sein
10 Geschachtelte Typen
11 Besondere Typen der Java SE
12 Generics<T>
13 Lambda-Ausdrücke und funktionale Programmierung
14 Architektur, Design und angewandte Objektorientierung
15 Java Platform Module System
16 Die Klassenbibliothek
17 Einführung in die nebenläufige Programmierung
18 Einführung in Datenstrukturen und Algorithmen
19 Einführung in grafische Oberflächen
20 Einführung in Dateien und Datenströme
21 Einführung ins Datenbankmanagement mit JDBC
22 Bits und Bytes, Mathematisches und Geld
23 Testen mit JUnit
24 Die Werkzeuge des JDK
A Java SE-Module und Paketübersicht
Stichwortverzeichnis


Buch bestellen
Ihre Meinung?



Spacer
<< zurück
Java ist auch eine Insel von Christian Ullenboom

Einführung, Ausbildung, Praxis
Buch: Java ist auch eine Insel


Java ist auch eine Insel

Pfeil 10 Geschachtelte Typen
Pfeil 10.1 Geschachtelte Klassen, Schnittstellen und Aufzählungen
Pfeil 10.2 Statische geschachtelte Typen
Pfeil 10.3 Nichtstatische geschachtelte Typen
Pfeil 10.3.1 Exemplare innerer Klassen erzeugen
Pfeil 10.3.2 Die this-Referenz
Pfeil 10.3.3 Vom Compiler generierte Klassendateien *
Pfeil 10.3.4 Erlaubte Modifizierer bei äußeren und inneren Klassen
Pfeil 10.4 Lokale Klassen
Pfeil 10.4.1 Beispiel mit eigener Klassendeklaration
Pfeil 10.4.2 Lokale Klasse für einen Timer nutzen
Pfeil 10.5 Anonyme innere Klassen
Pfeil 10.5.1 Nutzung einer anonymen inneren Klasse für den Timer
Pfeil 10.5.2 Umsetzung innerer anonymer Klassen *
Pfeil 10.5.3 Konstruktoren innerer anonymer Klassen
Pfeil 10.6 Zugriff auf lokale Variablen aus lokalen und anonymen Klassen *
Pfeil 10.7 this in Unterklassen *
Pfeil 10.7.1 Geschachtelte Klassen greifen auf private Eigenschaften zu
Pfeil 10.8 Nester
Pfeil 10.9 Zum Weiterlesen
 

Zum Seitenanfang

10.3    Nichtstatische geschachtelte Typen Zur vorigen ÜberschriftZur nächsten Überschrift

Ein nichtstatischer geschachtelter Typ ist ein innerer Typ vergleichbar, mit einer Objekteigenschaft. Deklarieren wir eine innere Klasse Room in House:

Listing 10.3     src/main/java/com/tutego/insel/nested/House.java, Ausschnitt

class House {



private String owner = "Ich";



class Room {

void ok() {

System.out.println( owner );

}

// static void error() { }

}

}

Ein Exemplar der Klasse Room hat Zugriff auf alle Eigenschaften von House, auch auf die privaten. Eine wichtige Eigenschaft ist, dass innere Klassen selbst keine statischen Eigenschaften deklarieren dürfen. Der Versuch führt in unserem Fall zu einem Compilerfehler: »The method error cannot be declared static; static methods can only be declared in a static or top level type«.

 

Zum Seitenanfang

10.3.1    Exemplare innerer Klassen erzeugen Zur vorigen ÜberschriftZur nächsten Überschrift

Um ein Exemplar von Room zu erzeugen, muss ein Exemplar der äußeren Klasse existieren. Das ist eine wichtige Unterscheidung gegenüber den statischen geschachtelten Klassen aus Abschnitt 10.2, »Statische geschachtelte Typen«: Statische geschachtelte Typen existieren auch ohne Objekt der äußeren Klasse.

In einem Konstruktor oder in einer Objektmethode der äußeren Klasse kann einfach mit dem Schlüsselwort new ein Exemplar der inneren Klasse erzeugt werden. Kommen wir von außerhalb – oder von einem statischen Block der äußeren Klasse – und wollen wir Exemplare der inneren Klasse erzeugen, so müssen wir bei nichtstatischen geschachtelten Klassen sicherstellen, dass es ein Exemplar der äußeren Klasse gibt. Java schreibt eine spezielle Form für die Erzeugung mit new vor, die folgendes allgemeine Format besitzt:

referenz.new InnereKlasse(...)

Dabei ist referenz eine Referenz vom Typ der äußeren Klasse. Um in der statischen main(String[])-Methode des Hauses ein Room-Objekt aufzubauen, schreiben wir:

Listing 10.4     src/main/java/com/tutego/insel/nested/House.java, main()

House h = new House();

Room r = h.new Room();

Oder auch in einer Zeile:

Room  r = new House().new Room();
 

Zum Seitenanfang

10.3.2    Die this-Referenz Zur vorigen ÜberschriftZur nächsten Überschrift

Möchte eine innere Klasse In auf die this-Referenz der sie umgebenden Klasse Out zugreifen, schreiben wir Out.this. Wenn Variablen der inneren Klasse die Variablen der äußeren Klasse überdecken, so schreiben wir Out.this.Eigenschaft, um an die Eigenschaften der äußeren Klasse Out zu gelangen:

Listing 10.5     src/main/java/com/tutego/insel/nested/FurnishedHouse.java, FurnishedHouse

class FurnishedHouse {



String s = "House";



class Room {

String s = "Room";



class Chair {

String s = "Chair";



void output() {

System.out.println( s ); // Chair

System.out.println( this.s ); // Chair

System.out.println( Chair.this.s ); // Chair

System.out.println( Room.this.s ); // Room

System.out.println( FurnishedHouse.this.s ); // House

}

}

}



public static void main( String[] args ) {

new FurnishedHouse().new Room().new Chair().output();

}

}
[»]  Hinweis

Nichtstatische geschachtelte Klassen können beliebig geschachtelt sein, und da der Name eindeutig ist, gelangen wir mit Klassenname.this immer an die jeweilige Eigenschaft.

Betrachten wir das obige Beispiel, dann lassen sich Objekte für die inneren Klassen Room und Chair wie folgt erstellen:

FurnishedHouse h            = new FurnishedHouse();  // Exemplar von FurnishedHouse

FurnishedHouse.Room r = h.new Room(); // Exemplar von Room in h

FurnishedHouse.Room.Chair c = r.new Chair(); // Exemplar von Chair in r

c.out(); // Methode von Chair

Die Qualifizierung mit dem Punkt bei FurnishedHouse.Room.Chair bedeutet nicht automatisch, dass FurnishedHouse ein Paket mit dem Unterpaket Room ist, in dem die Klasse Chair existiert. Die Doppelbelegung des Punktes verbessert die Lesbarkeit nicht gerade, und es droht Verwechslungsgefahr zwischen inneren Klassen und Paketen. Deshalb sollte die Namenskonvention beachtet werden: Klassennamen beginnen mit Großbuchstaben, Paketnamen mit Kleinbuchstaben.

 

Zum Seitenanfang

10.3.3    Vom Compiler generierte Klassendateien * Zur vorigen ÜberschriftZur nächsten Überschrift

Für das Beispiel House und Room erzeugt der Compiler die Dateien House.class und House$Room.class. Damit die innere Klasse an die Objektvariablen der äußeren Klasse gelangt, generiert der Compiler automatisch in jedem Exemplar der inneren Klasse eine Referenz auf das zugehörige Objekt der äußeren Klasse. Damit kann die innere Klasse auch auf Objektvariablen der äußeren Klasse zugreifen. Für die innere Klasse ergibt sich folgendes Bild in House$Room.class:

class House$Room {



final House this$0;



House$Room( House house ) {

this$0 = house;

}

// ...

}

Die Variable this$0 referenziert das Exemplar House.this, also die zugehörige äußere Klasse. Die Konstruktoren der inneren Klasse erhalten einen zusätzlichen Parameter vom Typ House, um die this$0-Variable zu initialisieren. Da wir die Konstruktoren sowieso nicht zu Gesicht bekommen, kann uns das egal sein.

 

Zum Seitenanfang

10.3.4    Erlaubte Modifizierer bei äußeren und inneren Klassen Zur vorigen ÜberschriftZur nächsten Überschrift

Ist in einer Datei nur eine Klasse deklariert, kann diese nicht privat sein. Private innere Klassen sind aber legal. Statische Hauptklassen gibt es zum Beispiel auch nicht, aber innere statische Klassen sind legitim. Tabelle 10.2 fasst die erlaubten Modifizier noch einmal kompakt zusammen:

Modifizierer

erlaubt auf

äußeren

Klassen

inneren

Klassen

äußeren

Schnittstellen

inneren

Schnittstellen

public

ja

ja

ja

ja

protected

nein

ja

nein

ja

private

nein

ja

nein

ja

static

nein

ja

nein

ja

final

ja

ja

nein

nein

abstract

ja

ja

ja

ja

Tabelle 10.2     Erlaubte Modifizierer

 


Ihre Meinung?

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de

<< zurück
 Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Java ist auch eine Insel Java ist auch eine Insel

Jetzt Buch bestellen


 Buchempfehlungen
Zum Rheinwerk-Shop: Captain CiaoCiao erobert Java

Captain CiaoCiao erobert Java




Zum Rheinwerk-Shop: Algorithmen in Java

Algorithmen in Java




Zum Rheinwerk-Shop: Spring Boot 3 und Spring Framework 6

Spring Boot 3 und Spring Framework 6




Zum Rheinwerk-Shop: Java SE 9 Standard-Bibliothek

Java SE 9 Standard-Bibliothek




 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und in die Schweiz

InfoInfo



 

 


Copyright © Rheinwerk Verlag GmbH 2024

Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.

Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

 

[Rheinwerk Computing]



Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de



Cookie-Einstellungen ändern