© APSIS GmbH extern.gif (1249 Byte), Polling, 2000


Verbesserungen

in der ersten Auflage des Lehrbuchs Programmieren mit Java

Stand: 19. Oktober 1999


Seite 14, Kapitel 1.5.2

Erster Satz im Kapitel:

Im Gegensatz zu vielen Programmiersprachen sind in Java Klein- und Großbuchstaben nicht austauschbar (ähnlich wie in C und C++), d.h. der Compiler unterscheidet zwischen Objekt und objekt.

und nicht wie im Buch

Im Gegensatz zu vielen Programmiersprachen sind in Java Klein- und Großbuchstaben nicht austauschbar (wie in C und C++), d.h. der Compiler unterscheidet zwischen Objekt und objekt.


Seite 18, Kapitel 2.1

Der erste Absatz im Kapitel kann besser formuliert werden:

Die einfachste, leere Klasse enthält nichts. Sie ist  nicht allzu nützlich, an ihr lernen wir nur, wie Klassen in Java formuliert werden können:

und nicht wie im Buch

Das einfachste, leere Programm tut nichts. Er erscheint im ersten Moment als nicht allzu nützlich, es gibt aber Situationen, wo es tatsächlich verwendet wird, z.B. um einen Wartezustand (busy waiting) zu programmieren. In Java kann das leere Programm folgendermaßen formuliert werden:


Seite 25, Kapitel 2.2.6

Der letzte Satz der Übung kann weggelassen werden:

Rufen Sie in einem zweiten Programm die Methode gutenMorgen der Klasse lehrbuch.HalloWelt in der überschriebenen init auf.


Seite 26, Kapitel 2.2.7

Erster Satz im Absatz vor der Übung:

Jede Methode hat also genau eine Definition (wenn der Name einer Methode überladen wird, sind das unterschiedliche Methoden).

und nicht wie im Buch

Jede Methode hat also genau eine Definition (wenn eine Methode überladen wird, sprechen wir von unterschiedlichen Methoden).


Seite 30, Kapitel 2.2.12

In der 6. Zeile des Kapitels (6. Zeile von unten an der Seite, die letzte Textzeile) soll der kursiv gesetzte Ausdruck statische Methoden auf den Ausdruck static-Methoden ausgetauscht werden.


Seite 35, Kapitel 2.3.2

Erster vollständiger Satz auf der Seite:

In einigen Programmiersprachen wie Pascal oder Ada werden diese Operationen als Prozeduren und Funktionen implementiert; die beiden zusammen bilden den Begriff der Unterprogramme.

und nicht wie im Buch

In einigen Programmiersprachen wie Pascal oder Ada heißen diese Prozeduren und Funktionen; die beiden zusammen bilden den Begriff der Unterprogramme.

Erster Satz des zweiten Absatzes:

Für statische Datenbehälter wird die Operation anlegen vom Programmierer der Klasse durchgeführt.

und nicht wie im Buch

Für statische Datenbehälter wird die Operation anlegen vom Klassenprogrammierer durchgeführt.

Ergänzung im ersten Satz des dritten Absatzes:

Die Operation freigeben wird in Java vom Interpreter übernommen: Ein Objekt wird freigegeben, wenn es nicht mehr benötigt wird (d.h. nicht mehr erreichbar ist).


Seite 35, Kapitel 2.4.1

Erster Absatz:

Nach dem einfachsten, dem leeren Algorithmus im Kapitel 2.1. auf Seite 18 lernen wir jetzt die nächstkomplizierte Art, den elementaren Algorithmus kennen. Der Anweisungsteil des Programms, das ihn implementiert, besteht aus einer einzigen einfachen Anweisung. Unter einer einfachen Anweisung verstehen wir im Moment einen Methodenaufruf - später werden wir noch die Zuweisungen kennenlernen. Im Kapitel 10. (auf Seite 216) werden wir auch noch die zusammengesetzten Anweisungen kennen lernen.

und nicht wie im Buch

Nach dem einfachsten, dem leeren Algorithmus im Kapitel 2.1. auf Seite 18 lernen wir jetzt den nächstkomplizierten, den elementaren Algorithmus kennen. Der Anweisungsteil des Programms, das ihn implementiert, besteht aus einer einzigen Anweisung. Unter einer Anweisung verstehen wir im Moment einen Methodenaufruf. Später werden wir andere Anweisungen kennen lernen, z.B. im Kapitel 10. (Seite 216) die zusammengesetzten Anweisungen.


Seite 37, Kapitel 2.4.3

Letzter Satz vor der Übung 2.12:

Dies ist aber nicht immer der Fall.

und nicht wie im Buch

Dies muss aber nicht immer der Fall sein.


Seite 38, Kapitel 2.5

Erster Satz:

Was geschieht, wenn ein leerer Eimer geleert oder ein voller gefüllt wird?

und nicht wie im Buch

Was geschieht, wenn ein leerer Behälter geleert oder ein voller gefüllt wird?


Seite 38, Kapitel 2.5.1

Erster Absatz:

Mit Hilfe von Ausnahmen kann verhindert werden, dass ein Programm infolge eines Fehlers (z.B. durch Fehlbedienung oder durch Programmierfehler) abgebrochen wird. Dies geschieht, indem derjenige, der den Fehler feststellt (in diesem Fall die Klasse lehrbuch.EinEimer, in einem anderen Fall der Interpreter oder die Hardware), statt einen generellen Abbruch des Programms nur den Ablauf der aufgerufenen Methode (z.B. die Methode entleeren) abbricht und eine Ausnahme auslöst. Auch die aufrufende Methode (im obigen Fall die Methode start der Klasse EimerFehler) wird abgebrochen. Sie hat aber die Möglichkeit, die Ausnahme am Ende der Methode in einem Ausnahmebehandlungsteil aufzufangen. Dadurch erhält sie Kenntnis über den aufgetretenen Fehler. Er kann z.B. dokumentiert werden (z.B. durch Information über ihn in einer Datei), oder aber wird die Fehlbedienung des Programms mit einer Fehlermeldung abgewiesen.

und nicht wie im Buch

Mit Hilfe von Ausnahmen kann verhindert werden, dass ein Programm infolge eines Fehlers (z.B. durch Fehlbedienung oder durch Programmierfehler) abgebrochen wird. Dies geschieht, indem derjenige, der den Fehler feststellt (in diesem Fall die Klasse lehrbuch.EinEimer, in einem anderen Fall der Interpreter oder die Hardware), statt einen generellen Abbruch des Programms nur den Ablauf der aufgerufenen Methode (z.B. die Methode entleeren) unterbricht und eine Ausnahme auslöst. Auch die aufrufende Methode (im obigen Fall die Methode start der Klasse EimerFehler) wird unterbrochen. Sie hat aber die Möglichkeit, die Ausnahme am Ende der Methode in einem Ausnahmebehandlungsteil aufzufangen. Dadurch erhält sie Kenntnis über den aufgetretenen Fehler. Er kann z.B. dokumentiert (d.h. Information über ihn in eine Datei geschrieben) werden, oder aber wird die Fehlbedienung des Programms mit einer Fehlermeldung abgewiesen.


Seite 39, Kapitel 2.5.1

Erste Programmzeile:

// Anweisungen für den Fehlerfall, z.B. Fehlermeldung; hier gar keine

und nicht wie im Buch

// Anweisungen für den Fehlerfall; hier gar keine


Seite 40, Kapitel 2.5.5

Zweiter Absatz des Kapitels:

Derjenige also, der die Methode aufruft und damit rechnen muss, dass die Ausnahme ausgelöst werden kann, muss die Ausnahme auffangen. Wenn der Programmierer aus der Spezifikation erfährt, dass die Methode, die er aufrufen möchte, eine Ausnahme auslöst, muss er try und catch schreiben – ansonsten bekommt er eine Fehlermeldung vom Compiler.

und nicht wie im Buch

Derjenige also, der die Methode aufruft und damit rechnen muss, dass die Ausnahme ausgelöst werden kann, muss die Ausnahme auffangen. Wenn der Programmierer aus der Spezifikation erfährt, dass die Methode, die er aufrufen möchte, eine Ausnahme auslöst, ist er gehalten, try und catch zu schreiben – ansonsten bekommt er eine Fehlermeldung vom Compiler.


Seite 43, Kapitel 2.6.1

Letzter Satz an der Seite:

Wir haben sie zu Anfang studiert, weil sie einfacher zu benutzen sind.

und nicht wie im Buch

Wir haben sie nur wegen ihrer Einfachheit zu Anfang studiert.


Seite 44, Kapitel 2.6.1

Vorletzter Satz:

Referenzen sind eine Art von Variablen.

und nicht wie im Buch

Referenzen sind die in Java gebräuchlichen Art von Variablen.


Seite 46, Kapitel 2.6.3

Letzter Satz im Punkt 2:

Verloren gegangene Objekte werden von der automatischen Speicherbereinigung entsorgt, d.h. der von ihnen belegte Speicherplatz wird freigegeben.

und nicht wie im Buch

Verloren gegangene Objekte werden von der automatischen Speicherbereinigung entsorgt, d.h. der von ihnen belegte Speicherplatz freigegeben.


Seite 49, Kapitel 2.6.6

erster Satz im zweiten Absatz auf der Seite:

Globale Referenzen (wie auch andere Variablen, s. Kapitel 5. auf Seite 97) werden Datenkomponenten oder Datenfelder (manchmal auch Felder) der Klasse genannt.

und nicht wie im Buch

Globale Referenzen werden Datenkomponenten oder Datenfelder (manchmal auch Felder) der Klasse genannt.


Seite 50, Kapitel 3.1

Letzter Satz des ersten Absatzes:

Prozeduren dienen dazu, Algorithmen zu klammern.

und nicht wie im Buch

Sie dienen dazu, Algorithmen zu klammern.


Seite 55, Kapitel 3.1.4

Letzter Satz über der Abbildung 3.1:

Man kann sich den formalen Parameter einer Prozedur wie ein Loch vorstellen, in das beim Aufruf ein aktueller Parameter eingesetzt wird (das Loch wird zugestopft). Bei verschiedenen Aufrufen kann das Loch jeweils mit unterschiedlichen Referenzen (d.h. mit Adressen i.A. unterschiedlicher Objekte) zugestopft werden.

und nicht wie im Buch

Man kann sich den formalen Parameter einer Prozedur wie ein Loch vorstellen, in das beim Aufruf ein aktueller Parameter eingesetzt wird (das Loch wird zugestopft). Bei verschiedenen Aufrufen kann das Loch jeweils mit unterschiedlichen Referenzen (i.A. mit unterschiedlichen Objekten) zugestopft werden.


Seite 63, Kapitel 3.3.1

Erster Satz des vorletzten Absatzes auf der Seite:

Die lokalen Referenzen (wie alle lokalen Variablen) werden beim Eintritt in die Prozedur (d.h. unmittelbar nach seinem Aufruf) erzeugt, noch bevor ihre erste Anweisung ausgeführt wird.

und nicht wie im Buch

Die lokalen Referenzen (wie alle Variablen) werden beim Eintritt in die Prozedur (d.h. unmittelbar nach seinem Aufruf) erzeugt, noch bevor ihre erste Anweisung ausgeführt wird.


Seite 65, Kapitel 3.3.2

Zweiter Satz im Kapitel:

Eine Methode selbst kann jedoch in Java – im Gegensatz zu Ada und Pascal – keine Methoden enthalten.

und nicht wie im Buch

Eine Methode selbst kann jedoch in Java – im Gegensatz zu Ada und Pascal – keine Prozeduren enthalten.

Erste Zeile des Programms (3.12):

public class AuessereKlasse { // (3.12)

und nicht wie im Buch

public class GeschachtelteKlassen { // (3.12)


Seite 69, Kapitel 3.3.5

Erster Absatz nach der Abb. 3.6:

Sobald eine Prozedur (oder eine beliebige Methode) aufgerufen wird, werden alle ihre lokalen Variablen (so auch ihre Parameter) auf dem Stapel angelegt. Diese existieren hier solange, bis die Prozedur beendet wird. Werden weitere Blöcke aktiviert oder Prozeduren aufgerufen, werden diesen weitere Abschnitte (Einträge) des Stapels zugewiesen, in denen alle ihre lokalen Variablen (und evtl. auch Parameter) Platz haben. Infolge des Schachtelungsprinzips wird immer zuerst der innerste (d.h. zuletzt eröffnete) Block abgeschlossen, d.h. der oberste Stapeleintrag kann gelöscht werden.

und nicht wie im Buch

Sobald eine Prozedur (oder eine beliebige Methode) aufgerufen wird, werden alle ihre lokalen Referenzen (so auch ihre Parameter) auf dem Stapel angelegt. Diese existieren hier solange, bis die Prozedur beendet wird. Werden weitere Blöcke aktiviert oder Prozeduren aufgerufen, werden diesen weitere Abschnitte des Stapels zugewiesen, in denen alle ihre lokalen Referenzen (und evtl. auch Parameterreferenzen) Platz haben. Infolge des Schachtelungsprinzips wird immer zuerst der innerste (d.h. zuletzt eröffnete) Block abgeschlossen, d.h. der oberste Stapeleintrag kann gelöscht werden.

Letzter Satz des Kapitels:

Objekte werden in Java also immer auf der Halde gespeichert. Praktisch in allen anderen Programmiersprachen gibt es auch Stapelobjekte; diese wurden in Java abgeschafft, und auf dem Stapel werden nur Variablen (wie z.B. Referenzen) gespeichert.

und nicht wie im Buch

Objekte werden in Java also immer auf der Halde gespeichert. Praktisch in allen anderen Programmiersprachen gibt es auch Stapelobjekte; diese wurden in Java abgeschafft, und auf dem Stapel werden nur Variablen (wie Referenzen) gespeichert.

Seite 69, Kapitel 3.3.6

Nach dem ersten Satz des Kapitels kann eine Motivation eingefügt werden. Der nächste Satz soll dann in einem neuen Absatz beginnen:

Die Speicherung der lokalen Referenzen auf dem Stapel ermöglicht die Programmierung rekursiver Prozeduren, die sich selbst aufrufen. Wenn der Aufruf von sich selbst wiederkehrend erfolgt, liegt hier eine Art Wiederholung vor. Eine andere Art von Wiederholung werden wir im Kapitel 10.2 auf Seite 222 kennenlernen.

Wir unterscheiden zwischen direkten (unmittelbaren) und indirekten (mittelbaren) Rekursionen.


Seite 72, Kapitel 3.4

Letzter Satz des zweiten Absatzes (vor dem Programmtext):

Dieses Paket wird ähnlich benutzt, wie das mit diesem Lehrbuch ausgelieferte Paket lehrbuch:

und nicht wie im Buch

Es wird ähnlich benutzt, wie das mit diesem Lehrbuch ausgelieferte Paket lehrbuch:


Seite 74, Kapitel 3.4.4

Erster Satz des Kapitels:

Eine Klasse, die vom Interpreter java ausgeführt werden kann, heißt Anwendung oder Hauptprogramm. Um eine solche Klasse zu schreiben, muss keine Klasse erweitert werden.

und nicht wie im Buch

Um eine Klasse zu erzeugen, die vom Interpreter java ausgeführt werden kann, muss keine Klasse erweitert werden.

Erster Satz nach dem Programm (3.21):

Das Profil der Methode main kann man einfach abschrieben, ohne sich Gedanken über seine Bedeutung zu machen; die Klasse String werden wir im Kapitel 9.2.3. auf Seite 198 kennen lernen; die Zeichen [] bedeuten eine Reihung (s. Kapitel 9.2. auf Seite 196). Der Parameter args wird nur dann benutzt, wenn sog. Kommandozeilenparameter (s. Kapitel 9.2.4. auf Seite 199) verarbeitet werden sollen.

und nicht wie im Buch

Das Profil der Methode main kann einfach abgeschrieben werden, ohne sich Gedanken über seine Bedeutung zu machen; die Klasse String werden wir im Kapitel 9.2.3. auf Seite 198 kennen lernen; die Zeichen [] bedeuten eine Reihung (s. Kapitel 9.2. auf Seite 196). Ihr Parameter args kommt erst dann zur Geltung, wenn sog. Kommandozeilenparameter (s. Kapitel 9.2.4. auf Seite 199) verarbeitet werden sollen.

Ans Ende des vorletzten Absatzes (vor den Absatz "Die Aufruf ...") kann folgender Satz hinzugefügt werden:

Im obigen Beispiel - wie in den meisten Fällen der folgenden Kapitel - wurde der Parameter ignoriert (s. Kapitel 3.1.4 auf Seite 55).

Seite 75, Kapitel 3.4.4

Zweiter Satz auf der Seite:

In ihr wurde die öffentliche (statische) Referenz out vereinbart; sie referiert (normalerweise) ein Objekt, das der Konsole (dem Fenster, von wo aus der Interpreter gestartet wurde) entspricht.

und nicht wie im Buch

In ihr wurde die öffentliche (statische) Referenz out vereinbart; sie referiert (normalerweise) ein Objekt, das der Systemkonsole entspricht.


Seite 76, Kapitel 3.4.6

Dritter Satz im Kapitel:

Dies bedeutet, dass der Programmierer jede seiner Klassen ohne den Paketnamen erwähnen kann.

und nicht wie im Buch

Dies bedeutet, dass jede seiner Klassen in Anspruch genommen werden kann, ohne das Paket erwähnen zu müssen.

Letzter Satz des vorletzten Absatzes:

Beispiele für die Benutzung der Klasse String sind die Programme (2.16) auf Seite 32 und (3.21) auf Seite 74.

und nicht wie im Buch

Beispiele für das Letzte sind die Programme (2.16) auf Seite 32 und (3.21) auf Seite 74.


Seite 77, Kapitel 4.1

Der zweiter Satz des Kapitels soll gestrichen werden:

Sie beinhalten auch ein Applet, sodass sie vom Benutzerprogramm erweitert werden können.

Der Absatz nach dem Programm (4.1):

In der Klasse selbst legen wir zwei globale Referenzen vom Typ lehrbuch.Eimer an. Das reservierte Wort static bedeutet hier, dass das von der Klasse zur Verfügung gestellte Objekt (nämlich die zwei Eimer) genau einmal vorhanden ist; es ist charakteristisch für Klassen, die ein statisches Objekt implementieren.

und nicht wie im Buch

In der Klasse selbst legen wir zwei globale Referenzen vom Typ lehrbuch.Eimer an. Das reservierte Wort static bedeutet hier, dass dieses Objekt bei der Benutzung dieser Klasse genau einmal zur Verfügung steht; es ist charakteristisch für Klassen, die ein statisches Objekt implementieren.

Seite 78, Kapitel 4.1

Erster Satz des dritten Absatzes:

Die Klassenkomponenten wurden - im Gegensatz zu den Objektkomponenten - mit dem reservierten Wort static gekennzeichnet; sie sind genau einmal vorhanden, unabhängig davon, wie viele Objekte der Klasse erzeugt wurden.

und nicht wie im Buch

Die Klassenkomponenten wurden mit dem reservierten Wort static gekennzeichnet.


Seite 81, Kapitel 4.3

Als erster Satz soll eingefügt werden:

Die Klassenkomponenten (gekennzeichnet mit static) - wie schon im Kapitel 4.1 auf Seite 77 erläutert wurde - sind für alle Objekte der Klasse einmal vorhanden. Im Gegensatz dazu werden die Objektkomponenten (Datenkomponenten ohne static) der Klasse in jedem Ausprägung der Klasse (in jedem Objekt) angelegt.

Auch Klassen für dynamische Objekte werden oft mit Hilfe anderer Klassen implementiert.

Seite 81, Kapitel 4.3.1

Nach dem Programm (4.5) soll eingefügt werden:

Hier sind die Referenzen linkerEimer und rechterEimer ohne static vereinbart worden, sie sind also Objektkomponenten. In einem Benutzerprogramm wird nun diese Klasse wie üblich ausgeprägt.


Seite 82, Kapitel 4.3.2

Erster Satz:

Die Klasse ZweiEimer im Programm (4.1) auf Seite 77 enthält nur Klassenkomponenten, die Klasse DoppelEimer im Programm (4.5) auf Seite 81 enthält nur Objektkomponenten. Es gibt Klassen, die sowohl Objekt- wie auch Klassenkomponenten enthalten.

und nicht wie im Buch

Eine Klasse kann sowohl Objekt- wie auch Klassenkomponenten enthalten.


Seite 87, Kapitel 4.5

Zweiter Satz des Kapitels:

Die Erste von diesen ist ein Konstruktor, der Letzte heißt Destruktor.

und nicht wie im Buch

Die Erste von diesen ist der Konstruktor, der Letzte ist der Destruktor.

Erster Satz des letzten Absatzes auf der Seite:

Eine Klasse kann mehrere Konstruktoren enthalten; diese unterscheiden sich durch ihre Signatur.

und nicht wie im Buch

Eine Klasse kann mehrere Konstruktoren enthalten; diese unterscheiden sich durch ihr Profil.

Seite 88, Kapitel 4.5

Letztes Kommentar im Programm (4.13)

// kann eigentlich nicht geschehen

und nicht wie im Buch

// dürfte nicht geschehen können

Seite 89, Kapitel 4.5.2

Zweiter Satz des zweiten Absatzes im Kapitel:

Der Klassenprogrammierer hat jedoch die Möglichkeit, den Destruktor zu überschreiben und hier letzte Aufräumarbeiten zu erledigen

und nicht wie im Buch

Der Klassenprogrammierer hat jedoch die Möglichkeit, den Destruktor zu überschreiben und hier letzte Aufräumarbeiten erledigen

Seite 89, Kapitel 4.6

Erster Satz:

Im Kapitel 2.6.5. auf Seite 47 wurde gesagt, dass Java eine streng typisierte Sprache ist.

und nicht wie im Buch

Im Kapitel 2.6.5. auf Seite 47 wurde gezeigt, dass Java eine streng typisierte Sprache ist.

Seite 89, Kapitel 4.6.1

Letzter Absatz auf der Seite:

Wir können diese Regel auch folgendermaßen umformulieren: Eine Methode kann für Objekte derselben Klasse aufgerufen werden, in der sie vereinbart wurde, oder deren Unterklassen:

und nicht wie im Buch

Wir können diese Regel auch folgendermaßen umformulieren: Eine Methode kann für Objekte derselben Klasse aufgerufen werden, in der sie vereinbart wurde, oder deren Unterklasse:


Seite 91, Kapitel 4.6.2

Erster Satz im letzten Absatz der Seite:

Es kommt aber – wie im vorherigen Kapitel gezeigt – vor, dass eine Referenz der Oberklasse ein Objekt der Unterklasse referiert.

und nicht wie im Buch

Es kommt aber – wie im vorherigen Kapitel gezeigt – vor, dass eine Referenz der Oberklasse die Adresse eines Objekts der Unterklasse enthält.

Letzte Zeile auf der Seite:

oberReferenz.methode(); // Typfehler, obwohl für das Objekt methode zur Verfügung steht

und nicht wie im Buch

oberReferenz.methode(); // Typfehler, obwohl es möglich sein würde

Seite 93, Kapitel 4.6.4

Zweiter Satz im Kapitel:

Sie wird verwendet, wenn eine Oberklasse erweitert wird. Hierbei muss die Unterklasse eine Methode aus der Oberklasse überschreiben:

und nicht wie im Buch

Sie wird verwendet, wenn eine Oberklasse von zwei Unterklassen erweitert wird. Hierbei müssen die Unterklassen eine Methode aus der Oberklasse überschreiben:

Seite 94, Kapitel 4.6.4

Absatz nach dem Programm (4.29):

Polymorphie wird also verwendet, wenn für eine Referenz der Oberklasse eine überschriebene Methode der Unterklasse aufgerufen wird. Hier wird auf Grund der Klasse des aktuell referierten Objekts zur Laufzeit entschieden, welche Methode aufgerufen wird.

und nicht wie im Buch

Polymorphie wird also verwendet, wenn für eine Referenz (auch Parameterreferenz) der Oberklasse eine überschriebene Methode der Unterklasse aufgerufen wird. Hier wird auf Grund der Klasse des aktuell referierten Objekts zur Laufzeit entschieden, welche Methode aufgerufen wird. Wir werden im Kapitel 6.4.3. auf Seite 133 vorführen, wie man von der Polymorphie wesentlichen Gebrauch macht.

Seite 95, Kapitel 4.6.4

Vorletzter Absatz auf der Seite::

In diesem Programm machen wir davon Gebrauch, dass Ausnahmen auch polymorph aufgefangen werden können: Wenn sie alle Objekte von Unterklassen derselben Ausnahmeklasse (Exception oder Error) sind, können sie mit einem catch abgefangen werden.

und nicht wie im Buch

In diesem Programm machen wir davon Gebrauch, dass Ausnahmen auch polymorph aufgefangen werden können: Wenn sie alle Unterklassen derselben Ausnahmeklasse (Exception oder Error) sind, können sie mit einem catch abgefangen werden.

Die letzte Zeile auf dieser Seite und die ersten drei Zeilen auf der nächsten Seite sollen gestrichen werden:

Polymorphie wird also über zwei Mechanismen angesteuert:

Zusätzlich können wir noch das polymorphe Abfangen von Ausnahmen dazuzählen.


Seite 97, Kapitel 5

Vorletzer Satz des zweiten Absatzes:

Die Wertefunktionen (sie sind immer parameterlos) können auch als die verschiedenen Zustände des Datenbehälters angesehen werden.

und nicht wie im Buch

Sie können auch als die verschiedenen Zustände des Datenbehälters angesehen werden.


Seite 99, Kapitel 5.2

Zweiter Satz des Kapitels:

Prozeduren haben wir schon im Kapitel 3.1. (auf Seite 50) kennen gelernt. In Java werden sie als void-Methoden programmiert. Öffentliche void-Methoden haben wir wegen ihrer Wirkung auf ihre Zielobjekte als Mutatoren bezeichnet.

und nicht wie im Buch

Prozeduren haben wir schon im Kapitel 3.1. (auf Seite 50) kennen gelernt. Öffentliche Prozeduren haben wir wegen ihrer Wirkung auf Objekte außerhalb ihres Rumpfes als Mutatoren bezeichnet.

Klammer in der Mitte des zweiten Absatzes:

... Objekten (von Seiteneffekten an globalen Objekten wird abgeraten), sondern ...

und nicht wie im Buch

... Objekten (von Nebeneffekten an globalen Objekten wird abgeraten), sondern ...


Seite 100, Kapitel 5.2.1

Zweiter Satz im zweiten Absatz nach dem Programm (5.4):

In seinem Profil wird an Stelle des reservierten Wortes void – im Gegensatz zu einem Mutator – der Name einer Klasse (oder eines Basistyps, s. Kapitel 7. auf Seite 144) angegeben. Dieser wird manchmal Rückgabetyp, besser aber Ergebnistyp genannt.

und nicht wie im Buch

In seinem Profil wird an Stelle des reservierten Wortes void – im Gegensatz zu einem Mutator – der Name der gelieferten Klasse angegeben. Dieser wird manchmal Rückgabetyp, besser aber Ergebnistyp genannt.


Seite 101, Kapitel 5.2.2

Zweiter Satz nach dem Programm (5.5):

Hierzu wurde sie in ihrer Klasse mit dem Zusatz static vereinbart:

und nicht wie im Buch

Hierzu wurde sie dort mit dem Zusatz static vereinbart:


Seite 102, Kapitel 5.2.4

Zweiter und dritter Absatz des Kapitels:

Funktionen können als private Methoden vereinbart werden, haben (wie alle Methoden) einen Namen, und können formale Parameter haben. Darüber hinaus liefern sie ein Ergebnis von einem vor ihrem Namen angegebenen Typ.

Im Anweisungsteil einer Funktion muss – ähnlich wie beim Informator – eine Rückkehranweisung enthalten sein, durch die das Ergebnis an die aufrufende Stelle zurückgegeben wird:

und nicht wie im Buch

Funktionen werden als private Methoden vereinbart, haben (wie alle Methoden) einen Namen, und können formale Parameter haben. Darüber hinaus liefern sie ein Ergebnis von einem vor ihrem Namen angegebenen Typ.

Im Anweisungsteil einer Funktion muss – ähnlich wie beim Informator – eine Rückkehranweisung mit einem Wert vom Ergebnistyp enthalten, durch die das Ergebnis an die aufrufende Stelle zurückgegeben wird:

Seite 102, Kapitel 5.2.4, Programm 5.8

In der 2. Zeile der Klasse Funktion kann der Zusatz extends java.applet.Applet gestrichen werden, er ist überflüssig. Im Rumpf der Methode berechneterInhalt kann try und catch auch weggelassen werden. Somit ist die Klasse

import lehrbuch.*; // (5.8)
public class Funktion {
	private static Eimer eimer1 = new Eimer(),eimer2 = new Eimer(),eimer3 = new Eimer();
	private static Getraenk berechneterInhalt(Eimer e1, Eimer e2) { // ¬
		// formale Parameter sind zwei Datenbehälter namens e1 und e2 vom Typ Eimer
		// ihr Ergebnis ist vom Typ Getraenk
		Getraenk g;
		... // berechnen des Ergebnisses
		return g; // das Ergebnis wird dem Aufrufer zurückgegeben ¬
	}
	public static void main(String[] args) {
		try { ... // die Eimer werden angezeigt und gefüllt/entleert
			Eimer.meldung(berechneterInhalt(eimer1, eimer3)); // Aufruf ¬
			eimer1.fuellen(berechneterInhalt(eimer2, eimer3)); // weiterer Aufruf
		} catch ...

und nicht wie im Buch

import lehrbuch.*; // (5.8)
public class Funktion extends java.applet.Applet {
	private static Eimer eimer1 = new Eimer(),eimer2 = new Eimer(),eimer3 = new Eimer();
	private static Getraenk berechneterInhalt(Eimer e1, Eimer e2) { // ¬
		// formale Parameter sind zwei Datenbehälter namens e1 und e2 vom Typ Eimer
		// ihr Ergebnis ist vom Typ Getraenk
		try {
			Getraenk g;
			... // berechnen des Ergebnisses
			return g; // das Ergebnis wird dem Aufrufer zurückgegeben ¬
		}
		catch (LeerAusn ausnahme) {
			return Eimer.wasser();
		}
	}
	public static void main(String[] args) {
		try { ... // die Eimer werden angezeigt und gefüllt/entleert
			Eimer.meldung(berechneterInhalt(eimer1, eimer3)); // Aufruf ¬
			eimer1.fuellen(berechneterInhalt(eimer2, eimer3)); // weiterer Aufruf
		} catch ...

Seite 105, Kapitel 5.3.3

Absatz in der Mitte der Seite nach der Aufzählung:

Die Entscheidung darüber, ob die geerbte Methode clone benutzt werden darf, liegt beim Programmierer der Lieferantenklasse. Soll clone erlaubt sein, so muss die Klasse die (leere) Schnittstelle Cloneable implementieren; sie hat keine Methoden; sie ist einzig dafür gedacht, dass die clone-Methode entscheiden kann, ob sie kopieren oder eine Ausnahme auswerfen soll:

und nicht wie im Buch

Um derartige Inkonsistenzen zu vermeiden, liegt die Entscheidung darüber, ob die geerbte Methode clone benutzt werden darf, beim Programmierer der Lieferantenklasse. Soll clone erlaubt sein, so muss die Klasse die (leere) Schnittstelle Cloneable implementieren; sie hat keine Methoden; sie ist einzig dafür gedacht, dass die clone-Methode entscheiden kann, ob sie kopieren oder Ausnahme auswerfen soll:


Seite 108, Kapitel 5.4.1

Erster Satz auf der Seite:

Der Aufrufer muss die Anzahl und die Typen sowie die Reihenfolge der formalen Parameter kennen, um das Unterprogramm aufrufen zu können.

und nicht wie im Buch

Der Aufrufer muss die Anzahl und die Typen sowie die Reihenfolge oder die Namen der formalen Parameter kennen, um das Unterprogramm aufrufen zu können.


Seite 109, Kapitel 5.5

Zweiter Satz des Kapitels:

Für Unerfahrene ist es manchmal nicht einfach, Java-Programme zu lesen, die diese Klassen extensiv benutzen.

und nicht wie im Buch

Für Unerfahrene ist es manchmal nicht einfach, Java-Programme zu lesen, die sie extensiv benutzen.


Seite 110, Kapitel 5.5.2

Zweiter Satz des Kapitels:

Dort haben wir für diesen Parameter die Methode drawString aufgerufen.

und nicht wie im Buch

Dort haben wir für ihn die Methode drawString aufgerufen.


Seite 115, Kapitel 5.5.6

Erster Satz des Kapitels:

Die folgende Zeichnung stellt dar, woher die in einem Programm benutzten Namen stammen können:

und nicht wie im Buch

Die folgende Zeichnung stellt den Vorgang dar, woher die in einem Programm benutzten Namen stammen können:

Seite 116, Kapitel 5.5.6

Erster Satz auf der Seite:

Von dieser Möglichkeit sollte aber – im Gegensatz zur Gewohnheit vieler Java-Programmierernur begrenzt Gebrauch gemacht werden und auch nur dann, wenn die Eindeutigkeit des Programms für den Leser nicht gefährdet wird.

Selbstverständlich lehnt der Compiler die Uneindeutigkeiten ab, die infolge der import-Klausel durch die Überlappung von Namensräumen entstehen (s. Kapitel 2.2.2. auf Seite 21): Wenn zwei Pakete importiert werden, die je eine Klasse mit demselben Namen enthalten, darf die Klasse nur mit der vollen Paketangabe angesprochen werden, so als gäbe es keine import-Klausel. Der mehrdeutige Name ohne Paketangabe wird vom Compiler abgelehnt.

und nicht wie im Buch

Von dieser Möglichkeit sollte aber – im Gegensatz zu vielen Java-Programmen – begrenzt Gebrauch gemacht werden und auch nur dann, wenn die Eindeutigkeit des Programms für den Leser nicht gefährdet wird.

Selbstverständlich lehnt der Compiler die Uneindeutigkeiten, die infolge der import-Klausel durch die Überlappung von Namensräumen entstehen (s. Kapitel 2.2.2. auf Seite 21): Wenn zwei Pakete importiert werden, die je eine Klasse mit demselben Namen enthalten, darf die Klasse nur mit der vollen Paketangabe angesprochen werden, so als gäbe es keine import-Klausel. Der mehrdeutige Name ohne Paketangabe wird vom Compiler als nicht bekannt behandelt.


Seite 117, Kapitel 6

Erster Satz im dritten Absatz:

Eine dritte Art von Programmen sind die Realzeitprogramme, die nicht von einem (i.A. langsamen) Menschen gesteuert werden, sondern von technischen Geräten:

und nicht wie im Buch

Eine dritte Art von Programmen sind die Realzeitprogramme, die nicht von einem (i.A. langsamen) Menschen bedient werden, sondern von technischen Geräten:


Seite 122, Kapitel 6.2.2

Erster Satz:

Dies ist möglich, wenn die Menüklasse das Profil der Rückrufprozeduren definiert und erlaubt, diese Methoden zu überschreiben.

und nicht wie im Buch

Dies ist möglich, wenn die Menüklasse das Profil der Rückrufprozeduren zwar definiert, erlaubt aber, diese Methoden zu überschreiben.

Seite 123, Kapitel 6.2.2

Zweiter Satz nach der Abb.6.2

Dies ist dann sinnvoll, wenn sie in der Oberklasse noch allgemein, d.h. ohne Bedeutung sind (wie e1 und e2), in der Unterklasse jedoch schon einen festgelegten Sinn haben.

und nicht wie im Buch

Dies ist dann sinnvoll, wenn sie in der Oberklasse noch allgemein, d.h. ohne Bedeutung sind (wie e1 und e2), in der Unterklasse jedoch schon eine Semantik haben.


Seite 127, Kapitel 6.2.8

Erster Absatz des Kapitels:

Ähnlich wie im Programm (6.11) auf Seite 125 mehrere Methoden der Klasse lehrbuch.kapitel6.Menue2 überschrieben wurden, können auch in einer aufgeschobenen Klasse mehrere aufgeschobenen Methoden überschrieben werden:

und nicht wie im Buch

Ähnlich wie im Programm (6.11) auf Seite 125 mehrere Methoden der Klasse lehrbuch.kapitel6.Menue2 überschrieben wurden, können auch in einer aufgeschobenen Klasse mehrere aufgeschobenen Methoden überschrieben werden müssen:


Seite 130, Kapitel 6.3.3, Programm 6.19

Im Rumpf der Methode start kann try und catch auch weggelassen werden. Somit ist die Klasse

import lehrbuch.*; // Eimer // (6.19)
public class EimerMitAuswahlliste extends java.applet.Applet {
	public void start() {
		Eimer e = new Eimer();
		e.getraenkWahl(); // hier wird die Auswahlliste aufgerufen ¬
		e.anzeigen(); // das Ergebnis der Auswahl wird angezeigt
	}
}

und nicht wie im Buch

import lehrbuch.*; // Eimer // (6.19)
public class EimerMitAuswahlliste extends java.applet.Applet {
	public void start() {
		try {
			Eimer e = new Eimer();
			e.getraenkWahl(); // hier wird die Auswahlliste aufgerufen ¬
			e.anzeigen(); // das Ergebnis der Auswahl wird angezeigt
		} catch ...
	}
}

Seite 142, Kapitel 6.5.6, Programm 6.28

Die Pakete java.awt und java.awt.event sollten vor der ersten Zeile explizit importiert werden:

import java.awt;
import java.awt.event;
public class VerteilteEreignisse extends Frame { // (6.28)

Seite 200, Kapitel 9.2.4, Programm 9.5

Das Programm Addieren funktionert mehr erwartungsgemäß, wenn sie eine int-Addition durchführt:

int a = new Integer(args[0]).intValue(); // ¬
int b = new Integer(args[1]).intValue(); // ¬
int c = a + b;
System.out.println(a + " + " + b + " = " + c);

und nicht wie im Buch:

System.out.println(a + " + " + b + " = " + a+b);

Seite 209/211, Kapitel 9.3.5, und 9.3.6, Programme 9.12 und 9.13

Die innere Klasse Knoten kann in den Klassen WarteschlangeListe und PosListePol als private vereinbart werden:

private class Knoten { ... // innere Klasse wie im Programm (9.9)

und nicht wie im Buch:

class Knoten { ... // innere Klasse wie im Programm (9.9)

Seite 311, Glossar

Der Eintrag automatische Speicherbereinigung kann folgendermaßen besser formuliert werden:

automatische Speicherbereinigung: Prozess des Java-Interpreters, der die unreferierten Objekte auf der Halde aufspürt und freigibt, dabei ihren Destruktor aufruft

Seite 314/316, Glossar

Die Einträge exportieren und importieren sind Gegensätze; jeweils sollte ein Verweis mit « eingefügt werden.

Seite 319, Glossar

Im Eintrag Nebeneffekt soll das kursiv gesetzte Wort globalen gestrichen werden

Seite 325, Glossar

Dem Eintrag überschreiben kann der Gegensatz-Verweis hinzufügen mit « eingefügt werden.


© APSIS GmbH extern.gif (1249 Byte), Polling, 2000