Errata zum Buch "Fortgeschrittene Programmierung mit Java 5"

Ähnliche Dokumente
Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Fortgeschrittene Programmierung mit Java 5

Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke

Übungsblatt 13. Abgabe / Besprechung in Absprache mit dem Tutor

4. Vererbung Die Klasse Object. Die Klasse Object

Programmieren II. Innere Klassen. Heusch 10, Ratz 5.2.1, Institut für Angewandte Informatik

Übungsblatt 13. Abgabe / Besprechung in Absprache mit dem Tutor

Überschreiben von Methoden

Technische Universität Braunschweig

Fehler und Korrekturen

Ein Vortrag im Rahmen des Wahlpflichtmoduls Fortgeschrittene Programmierung mit JAVA

Die Klasse java.lang.object. Thorsten Treffer

Institut für Programmierung und Reaktive Systeme 2. Februar Programmieren I. Übungsklausur

Die abstrakte Klasse Expression:

Prof. Dr. Wolfgang Schramm. Vorlesung. Techniken der Programmentwicklung. Exkurs: Anonyme Klassen

Institut für Programmierung und Reaktive Systeme 25. Januar Programmieren I. Übungsklausur

Kapitel 5: Interfaces

Klassen, Vererbung, Benutzereingabe

Einstieg in die Informatik mit Java

Prof. Dr. Uwe Schmidt. 21.August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (BInf 211, BTInf 211, BMInf 211, BWInf 211)

Schlussendlich geben wir die Listen aus. Es kommt zu folgender Ausgabe:

Prüfung Softwareentwicklung II (IB)

Felder - Arrays. Typ feldname[] = new Typ[<ganze Zahl >]; Beispiel: double vektor[] = new double[5]; auch eine Initialisierung ist möglich.

Programme erstellen in Java

Vorkurs Informatik WiSe 15/16

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

Realisierungsmöglichkeiten für parametrische Polymorphie

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

kurze Wiederholung class templates

12 Abstrakte Klassen, finale Klassen und Interfaces

Javakurs für Anfänger

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

JAVA 05: Objektorientierte Konzepte

Tücken der dynamischen Bindung

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 14.1.

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Schnittstellen, Vererbung & Polymorphismus für Fortgeschrittene

Einstieg in die Informatik mit Java

Elementare Konzepte von

Programmieren in Java

Philipp Güttler Progwerkstatt Letzte Änderung: Enums, Interfaces, Generics und Threads

Programmiertechnik Vererbung & Polymorphismus für Fortgeschrittene

Vererbung, Polymorphie

Zweck: sequentieller Zugriff auf Elemente eines Aggregats. mehrere Abarbeitungen des Aggregatinhalts

Zweck: sequentieller Zugriff auf Elemente eines Aggregats

Programmierkurs Java

Programmierung für Mathematik HS11

Übung zu Grundlagen der Betriebssysteme. 10. Übung

II.4.1 Unterklassen und Vererbung - 1 -

Universität Karlsruhe (TH)

2. Methoden. n Generelles zum Aufruf von Methoden. n Parameterübergabemechanismen (call by value, call by reference)

CoMa 04. Java II. Paul Boeck. 7. Mai Humboldt Universität zu Berlin Institut für Mathematik. Paul Boeck CoMa 04 7.

Institut für Programmierung und Reaktive Systeme 6. Juli Programmieren II. Übungsklausur

Algorithmen und Datenstrukturen

Kapitel 8. Generische Klassen

Exkurs: ANONYME KLASSEN. Techniken der Programmentwicklung Prof. Dr. Wolfgang Schramm

Erste Java-Programme (Scopes und Rekursion)

II.1.1. Erste Schritte - 1 -

Gebundene Typparameter

Test-Klausuraufgaben Softwaretechnik Fachbereich BW, für WINFO

Kapitel 4: Klassen und Unterklassen

Wintersemester 2004/ Januar Aus der Vorlesung sind Datenstrukturen zur Repräsentation von Wäldern disjunkter Mengen bekannt.

1. Grundzüge der Objektorientierung 2. Methoden, Unterprogramme und Parameter 3. Datenabstraktion 4. Konstruktoren 5. Vordefinierte Klassen

Languages and Tools for Object-Oriented Development Klausur Wintersemester 2007/2008

IT I: Heute. Nachbetrachtung Wissensüberprüfung. Einführung Vererbung. Roboter in becker.robots. Filialenbelieferung 4.11.

Algorithmen und Datenstrukturen 07

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Vererbung. Martin Wirsing. Ziele. Vererbung

Programmiertechnik II Klausur SS 2018 Angewandte Informatik Bachelor

Institut für Programmierung und Reaktive Systeme 5. Dezember Programmieren I. 5. Übungsblatt

Test zu Grundlagen der Programmierung Leitung: Michael Hahsler. 21. Juni 2004

Implementieren von Klassen

Algorithmen implementieren. Implementieren von Algorithmen

Polymorphismus 44. Function.hpp. #include <string>

3. Klassen Statische Komponenten einer Klasse. Klassenvariablen

Schnittstellen, Stack und Queue

9. Ausnahmebehandlung

IT I: Heute. Nachbetrachtung Wissensüberprüfungen. Einführung Vererbung. Roboter in becker.robots. falls Zeit: Scheduling 8.11.

Programmieren in Java

Einführung in die Programmierung

Klausur Software-Entwicklung September 00

Einführung in die Programmierung I. 2.0 Einfache Java Programme. Thomas R. Gross. Department Informatik ETH Zürich

Innere Klassen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

Parallele und funktionale Programmierung Wintersemester 2015/ Übung Abgabe bis , 10:00 Uhr

Basispruefung Herbst 2016/ Einführung in die Programmierung

Tagesprogramm

- EINSTIEG IN JAVA - (1/5) Datum:

Wirtschaftsinformatik II Sommersemester Lo sungshinweise zu den Ü bungen P. Mandl, M. Dolag, B. Rottmüller, et al.

II.1.1. Erste Schritte - 1 -

Klausur Grundlagen der Programmierung

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Programmieren I. Kapitel 8. Vererbung

Einführung in die Programmierung I. 11. Vererbung. Stefan Zimmer

Einfache Arrays. Dr. Philipp Wendler. Zentralübung zur Vorlesung Einführung in die Informatik: Programmierung und Softwareentwicklung

Probeklausur: Programmierung WS04/05

Vererbung P rogram m ieren 2 F örster/r iedham m er K apitel 11: V ererbung 1

Transkript:

Errata zum Buch "Fortgeschrittene Programmierung mit Java 5" Autor: Johannes Nowak dpunkt.verlag, Heidelberg ISBN 3-89864-306-9 Stand: 12. Januar 2006 Die meisten der im Folgenden beschriebenen Fehler wurden von einem äußerst aufmerksamen Leser entdeckt: Herrn Dominik Gruntz. Die Fehler sind großenteils "Flüchtigkeitsfehler" aber es haben sich auch einige "richtige", harte Fehler eingeschlichen. Vielen Dank, Herr Gruntz. Dank auch an Herrn Ulrich Grude, der mir einige Anmerkungen zu den C++- Templates hat zukommen lassen. Im Folgenden beziehen sich negative Zeilenzahlen auf das Ende der Seite (vom Ende an aufwärts). Seite 1, Zeile -7, und Seite 12, unteres Drittel enum Season { SPRING, SUMMER, AUTUMN, WINTER; } Nach Winter sollte kein Semikolon stehen. Seite 11, Zeile -14 bis -11 public static final Season1 SPRING = new Season(0); SPRING etc. ist nicht vom Typ Season1 (den gibt's gar nicht den gab's aber mal in einer Testversion), sondern vom Typ Season. Seite 13 Hier sollte noch die statische Methode valueof erwähnt werden, die der Compiler ebenfalls generiert. Sie kann wie folgt angewendet werden: enum Season { SPRINT, SUMMER,... } System.out.println (Season.SPRING == Season.valueOf ("SPRING")); Es wird true ausgegeben.

2 Seite 14, Zeile -5 bis -1 Hier sollte erwähnt werden, dass die beiden folgenden Zeilen denselben Output erzeugen: Ssytem.out.println(season); System.out.println(season.getName()); Seite18, Zeile 13 Es heißt natürlich nicht: (new int[] { 1, 2) } sondern: (new int[] { 1, 2 }) Seite 45, Zeile 13 Der Compiler generiert nicht: A m (Object t) sondern: A m (A t) Seite 47, Zeile -9 Sowohl in B als auch in A ist... Sowohl in B als auch in C ist...

3 Seite 50, Zeile 14 this.m((a)obj; this.m((a)obj); Seite 51, Zeile 8 public void C.m(java.lang.Object) public java.lang.object C.m(java.lang.Object) Seite 57 Die Zeile D<? super C> <-- D<? super B> <-- D<? super A> <-- D<?> enthält einen Fehler. Richtig ist vielmehr: D<?> <-- d<? super C> <-- D<? super B> <-- D<? super A> Danke an Herrn Ch. Sahnwaldt, der mich auf den Fehler aufmerksam gemacht hat. Seite 78, Figur Die Beschriftung ist unvollständig. GenericArra GenericArrayType

4 Seite 83, Zeile -3 getargumenttypes getactualtypearguments Seite 122, Zeile 14 Kein Fehler. Aber statt der Klassen MethodFilter und FieldFilter hätte man eine Klasse Filter<M extends Member> schreiben können. Seite 129, Zeile -9 Die Methode getchildname ist ein Relikt. Sie kann gestrichen werden. Statt dessen gibt s die Methode tostring (T node). Seite 130, Zeile 1 Bei der Methode getattributename ist return "" sinnvoller. Seite 158 Die Methode getparameterizedtype ist algorithmisch noch nicht vollständig durchdacht. Sie funktioniert aber in allen "Standard-Situationen". Es sind aber "vertrackte" Fälle denkbar, die es erforderlich machen, den Algorithmus präziser zu fassen. Seite 160, Zeile 13 p4.isassignablefrom(p1) p3.isassignablefrom(p1)

5 Seite 197, Mitte "Unmittelbar nach ihrer Erzeugung ist sie signalisiert..." In diesem Satz fehlt das wichtige Wort "NICHT": Unmittelbar nach ihrer Erzeugung ist die Condition NICHT signalisiert. Seite 205, Zeile -20 (Mitte) "Zwei Producer, die beide darauf warten, dass ein Platz in der Queue frei wird. Der Consumer holt ein Produkt ab. Beide Producer werden aufgeweckt - aber natürlich kommt nur einer der beiden zum Zuge. Der andere wartet erneut. Am Ende der put- Methode ruft dann der erste Producer notifyall auf mit dem Ergebnis, dass der zweite Producer erneut aufwacht, und nichts tun kann, als erneut zu warten..." Herr Dominik Gruntz stellt die Sache richtig: "Diese Aussage ist richtig, aber die Schlussfolgerung nicht. Der andere Producer der aufgeweckt worden ist wartet auf den synchronisations-lock. Wenn dann der erste Producer notifyall aufruft, so geht dieser Aufruf ins leere, da der andere Producer noch nicht das wait aufrufen konnte. Wenn der erste Producer dann den Synchronisationsblock verlässt, dann kommt der zweite Producer dran und wird feststellen, dass die Queue weiterhin voll ist und erst dann wird er wait aufrufen. Aber die Aussage, dass mit dem notifyall sowohl Producer als auch Consumer aufgeweckt werden stimmt natürlich schon." Seite 209, Zeile 1 "Zusätzlich zu der bereits in Queue spezifizierten parameterlosen offer-methode... " Es bigt dort keine parameterlose offer-methode. Es ist natürlich die erste offer-methode (mit EINEM Parameter) gemeint. Seite 215, Zeile -6 Herr Dominik Gruntz ist etwas verwundert: "Ich verstehe nicht, warum die Elemente in umgekehrter Reihenfolge produziert werden, denn mit products.add werden die Produkte am Ende eingefügt, d.h., zuvorderst ist Product 0, dann Product 1, etc. und in dieser Reihenfolge werden die Elemente mit dem Iterator auch besucht und produziert." Er wundert sich zu Recht.

6 Der Programmtext ist falsch. Er muss lauten (so steht es auch in der Original-Source - ich habe aber wohl eine frühere bzw. eine Testversion in das Manuskript übertragen): for (int i = 5; i >= 0; i--) products.add ("Product " + i); Dann wird die Ausgabe verständlich. Dann sollte allerdings auch in der viertletzten Zeile dieser Seite auch nicht von "Product 9", "Product 8" etc. die Rede sein, sondern von "Product 5", "Product 4" etc. Seite 229-231 Die Klase CancellableTask war in der Version 1.5.0 der J2SE noch enthalten, aber nicht mehr in der endgültigen Version. Seite 239 Im Konstuktor der Klasse Counter befindet sich folgende Zeile: this.count = count; Es muss dort natürlich heißen: this.count = initialcount; Der Fehler wurde auch in den Sourcen beseitigt. Danke an Herrn P. Saratchev, der den Fehler entdeckt hat. Seite 253 Herr Ulrich Grude kritisiert zu Recht, dass ich nicht all die Möglichkeiten beschreibe, die die C++-Templates bieten dass auch die Templates "Einschränkungen" kennen. Das ist richtig (und ich denke hierbei nur an die ATL und an die STL). Ich halte aber dagegen: Diese "Einschränkungen" sind nur implizit sie können nicht explizit in der Schnittstelle ausgedrückt werden. Man muss die Implementierung lesen, um die impliziten Einschränkungen zu erkennen. C++-Templates müsste man natürlich wesentlich ausführlicher behandeln.

7 Seite 254, Abschnitt "Template-Funktionen" Ich behaupte dort, es könnten nur globale Template-Funktionen definiert werden. Was mich zu diesem Satz veranlasst hat, ist mir völlig unerklärlich. Natürlich können auch Member-Funktionen als Template-Funktionen definiert werden. Generell Herr Ulrich Grude kritisiert zudem zu Recht, dass ich immer von Container- Klassen rede, wenn ich Collection-Klassen meine. Ich nehme aber an, dass aus dem Kontext hervorgeht, dass ich natürlich nicht die AWT-Container- Klasse meine, sondern eben "Sammlungs"-Klassen.