Rheinwerk Computing < openbook >


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


Download:

- Listings, ca. 2,7 MB


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

Pfeil9 Geschachtelte Typen
Pfeil9.1 Geschachtelte Klassen, Schnittstellen und Aufzählungen
Pfeil9.2 Statische geschachtelte Typen
Pfeil9.3 Nichtstatische geschachtelte Typen
Pfeil9.3.1 Exemplare innerer Klassen erzeugen
Pfeil9.3.2 Die this-Referenz
Pfeil9.3.3 Vom Compiler generierte Klassendateien *
Pfeil9.3.4 Erlaubte Modifizierer bei äußeren und inneren Klassen
Pfeil9.4 Lokale Klassen
Pfeil9.4.1 Beispiel mit eigener Klassendeklaration
Pfeil9.4.2 Lokale Klasse für einen Timer nutzen
Pfeil9.5 Anonyme innere Klassen
Pfeil9.5.1 Nutzung einer anonymen inneren Klasse für den Timer
Pfeil9.5.2 Umsetzung innerer anonymer Klassen *
Pfeil9.5.3 Konstruktoren innerer anonymer Klassen
Pfeil9.6 Zugriff auf lokale Variablen aus lokalen und anonymen Klassen *
Pfeil9.7 this in Unterklassen *
Pfeil9.7.1 Geschachtelte Klassen greifen auf private Eigenschaften zu
Pfeil9.8 Nester
Pfeil9.9 Zum Weiterlesen
 

Zum Seitenanfang

9.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 9.2    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

9.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 9.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 9.3    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

9.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 9.4    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

9.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 Attribute der äußeren 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 nichtstatische Attribute 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

9.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 9.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 9.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: Java SE 9 Standard-Bibliothek

Java SE 9 Standard-Bibliothek




Zum Rheinwerk-Shop: Algorithmen in Java

Algorithmen in Java




Zum Rheinwerk-Shop: Objektorientierte Programmierung

Objektorientierte Programmierung




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

InfoInfo



 

 


Copyright © Rheinwerk Verlag GmbH 2021

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