© APSIS GmbH , Polling, 2000
in der ersten Auflage des Lehrbuchs Programmieren mit Java
Stand: 19. Oktober 1999
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.
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:
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.
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).
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.
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).
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.
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.
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?
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.
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
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.
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.
Vorletzter Satz:
Referenzen sind eine Art von Variablen.
und nicht wie im Buch
Referenzen sind die in Java gebräuchlichen Art von Variablen.
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.
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.
Letzter Satz des ersten Absatzes:
Prozeduren dienen dazu, Algorithmen zu klammern.
und nicht wie im Buch
Sie dienen dazu, Algorithmen zu klammern.
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.
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.
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)
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.
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.
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:
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).
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.
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.
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.
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.
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.
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.
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.
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.
Letztes Kommentar im Programm (4.13)
// kann eigentlich nicht geschehen
und nicht wie im Buch
// dürfte nicht geschehen können
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
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.
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:
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
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:
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.
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.
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.
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 ...
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.
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:
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:
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 ...
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:
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.
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.
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.
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:
Erster Satz auf der Seite:
Von dieser Möglichkeit sollte aber im Gegensatz zur Gewohnheit vieler Java-Programmierer nur 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.
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:
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.
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.
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:
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 ... } }
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)
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);
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)
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
Die Einträge exportieren und importieren sind Gegensätze; jeweils sollte ein Verweis mit « eingefügt werden.
Im Eintrag Nebeneffekt soll das kursiv gesetzte Wort globalen gestrichen werden
Dem Eintrag überschreiben kann der Gegensatz-Verweis hinzufügen mit « eingefügt werden.
© APSIS GmbH , Polling, 2000