Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 1 Stichworte

Werbung
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 1
Stichworte
zur Lehrveranstaltung Informatik 3
im dritten Semester des Studiengangs Technische Informatik Bachelor
im Wintersemester 2010/11 an der Beuth-Hochschule für Technik Berlin
von Ulrich Grude.
Gegenstand dieser Lehrveranstaltung: Objektorientierte Programmierung (mit Java)
In dieser Datei finden Sie nach jedem SU (seminaristischen Unterricht, Vorlesung)
- Wiederholungsfragen für den nächsten SU,
- Antworten zu den Wiederholungsfragen des letzten SU und
- Stichworte zum Stoff, der im letzten SU behandelt wurde.
Die Regeln, nach denen Sie in diesem Semester eine Note für das Fach TB3-IN3 erwerben können,
stehen am Anfang der Datei AufgabenIN3.pdf.
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 2
1. Übung:
Gruppe 1a: Mo 27.09.2010, 14.15 Uhr, Raum D E 16a
Gruppe 1b: Fr 01.10.2010, 12.15 Uhr, Raum D E 16b
1. Falls mehr StudentInnen an dieser Übungsgruppe (1a bzw. 1b) teilnehmen möchten als Plätze vorhanden sind, die vorhandenen Plätze verlosen.
Anmerkung: Die Kapazität der Übungsgruppen (ca. 22 TeilnehmerInnen) wird vor allem durch die Kapazität des Betreuers begrenzt, nicht durch die Anzahl der Rechner im SWE-Labor. Diese menschliche
Betreuungskapazität wird nicht größer, wenn einige StudentInnen auf eigenen Laptops arbeiten, statt die
Labor-Rechner zu benutzen (eigene Laptops benötigen eher ein bisschen mehr menschliche Betreuung
als die fertig eingerichteten Laborrechner).
2. Einloggen (Noch fehlende Benutzer-Konten einrichten).
3. Meine Netzseite: http://public.beuth-hochschule.de/~grude/
4. Dort die Datei für TB3-IN3 TipsZumTextPad.pdf öffnen
Den folgenden Tip ausführen: 5. Ein kleines Programm zusammenklicken statt es einzutippen.
In das erstellte Programm einen Fehler einbauen (z.B. eine Klammer löschen).
Erneut compilieren.
Auf die 1. Zeile der Fehlermeldung doppelklicken. Was passiert dadurch?
Den eingebauten Fehler korrigieren (z.B. die Klammer wieder einfügen).
Erneut compilieren und ausführen lassen.
5. Netzseite zum Buch "Java ist eine Sprache":
http://public.beuth-hochschule.de/~grude/JavaIstEineSprache/
Von dort das Archiv BspJaSp.zip herunterladen
und in ein Verzeichnis namens Z:\BspJaSp entpacken.
6. Ein Verzeichnis namens Z:\Java\Hallo erstellen
und aus Z:\BspJaSp alle Hallo*.java-Dateien nach Z:\Java\Hallo kopieren.
Die drei Java-Quelldateien Hallo01.java, Hallo01A.java und Hallo01B.java mit dem
TextPad öffnen, compilieren und ausführen lassen.
Was ist bei diesen drei Quelldateien gleich? Wodurch unterscheiden sie sich?
7. Auf meiner Netzseite die Datei für TB3-IN3 Aufgaben.pdf öffnen
Die Seiten 6 und 7 ansehen und den darin beschriebenen Stoff genau verstehen (ist hoffentlich schon bekannt, aber falls nicht, dann jetzt noch mal lernen).
Die Aufgabe 1 (auf den Seiten 4 und 5) ausdrucken und lösen (in Gruppen zu je 2 Personen).
Diese Übung konnte wegen technischer Probleme nicht wie geplant stattfinden und wird beim
nächsten Übungstermin (siehe unten Übung 2) nachgeholt.
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 3
1. SU Fr 01.10.2010
im Raum B554
1. Begrüßung
2. Organisation der LV
Wie bekommt man eine Note für diese Lehrveranstaltung?
13 Tests, je 10 Testpunkte, mind. 5 Testpunkte in mind. 10 Tests, Gründe für nicht-Teilnahme an einem
Test (keine Lust, Bus verpasst, Krankheit, ...) machen keinen Unterschied.
Übungstermine: 1a. montags 4. Block, 1b. freitags 3. Block
Falls nötig Verlosung von je 20 Plätzen pro Übungsgruppe.
Grundlage der LV: Das Buch "Java ist eine Sprache" (in der BHT-Bibliothek oder
im Buchhandel, 30 Euro). Bringen Sie es immer mit. Bin dankbar für Hinweise auf Fehler
(Liste bekannter Fehler auf der Netzseite des Buches:
http://public.beuth-hochschule.de/~grude/JavaIstEineSprache/welcome.html.
Fragen an die TeilnehmerInnen:
1. Sie hatten 2 Semester C-Programmierung. Betriebssystem? Compiler?
2. Wer hat schon mal ein Java-Programm geschrieben?
3. Wer hat zu Hause einen Rechner? Alle?
4. Wer hat sich das Buch "Java ist eine Sprache" schon besorgt?
Klausurtermin: Wird noch bekannt gegeben.
Beuth Hochschule, TB3-IN3
1. SU Fr 01.10.2010
WS10/11, Seite 4
3. Jetzt geht es los mit dem Stoff (Abschnittsnummern aus dem Buch)
Es geht in dieser Lehrveranstaltung um 2 Sprachen: Deutsch und Java (in dieser Reihenfolge).
Rein äußerlich sehen viele Befehle in einem Java-Programm ganz ähnlich aus wie C-Befehle. Aber die
"Ideen hinter diesen Befehlen", die Grundkonzepte auf denen sie beruhen, sind bei Java ziemlich anders
als bei C.
Ganz allgemein gilt: C ist eine maschinennahe Sprache. Was ein C-Programm bewirkt hängt (nicht nur
vom Programm sondern meistens) auch davon ab, auf was für einer Plattform (Harware, Betriebssystem)
man es ausführen lässt. Der C-Standard legt die Bedeutung von C-Programmen nicht in allen Einzelheiten fest, sondern überlässt vieles der jeweiligen Implementierung, z.B.
•
•
•
•
Wie viele Ganzzahltypen gibt es? Nur einen? Oder 2? Oder 8? Oder ...
Wie viele Werte gehören zum Ganzzahltyp int?
Wie groß ist der größte Wert des Bruchzahltyps double?
Was passiert, wenn man die double-Zahl 17.0 durch die double-Zahl 0.0 dividiert?
etc.
Dagegen ist Java eine maschinenunabhängige Sprache und die Sprachbeschreibung legt die Bedeutung
von Java-Programmen bis in alle Einzelheiten ("Bit-genau") fest, z.B.
•
Es gibt 5 Ganzzahltypen (namens byte, char, short, int, long)
•
Zum Ganzzahltyp int gehören genau 232 (etwa 4.3 Milliarden) Werte
•
Der größte Wert des Bruchzahltyps double ist etwa gleich 1.797693E308, seine genaue
Darstellung als Dezimalzahl erfordert 309 Dezimalziffern (alle vor dem Dezimal-Punkt, alle genau festgelegt)
•
Wenn man die double-Zahl 17.0 durch die double-Zahl 0.0 dividiert ist das Ergebnis ein
spezieller double-Wert namens POSITIV_INFINITY.
Noch ein paar wichtiger Unterschiede:
Ein C-Programmierer
Ein Java-Programmierer
interessiert sich dafür und weiß, wie seine
Programme im Speicher eines bestimmten
Rechners aussehen.
sollte abstrakter denken und sich weniger
um konkrete Maschinen kümmern.
ist stolz darauf, die ASCII-Codes aller gängigen
Zeichen auswendig zu können.
ist stolz darauf, dass man seine Programme lesen
kann ohne irgendwelche ASCII-Codes auswendig
zu kennen.
kennt ein bestimmtes Compilationsmodell
(insbesondere die Arbeitsteilung zwischen
Compiler und Binder).
interessiert sich meist nicht dafür, wie oft seine
Quellprogramme compiliert werden (gar nicht,
einmal, zweimal, ...) und ob es einen Binder gibt.
Jetzt wollen wir noch mal ganz von vorn anfangen und uns (kurz) damit beschäftigen, was
Programmieren eigentlich ist und was die wichtigsten Grundbegriffe der Programmierung sind.
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 5
1.1 Programmieren als ein Rollenspiel
Rolle
Tätigkeiten (die meisten beziehen sich auf Programme)
Programmierer
schreibt, übergiebt (an den Ausführer)
Ausführer
prüft, lehnt ab/akzeptiert, führt aus
Benutzer
läßt ausführen, ist für Ein-/Ausgabedaten zuständig
Warter
wartet (Programme, nicht auf den Bus)
(Wieder-) Verwender
will wiederverwenden
Sinn der Rollen Warter und (Wieder-) Verwender. Gemeinsam bezeichnen wir den Warter und den
(Wieder-) Verwender auch als "die Kollegen des Programmierers".
Besetzung der Rollen, verschiedene Möglichkeiten.
Def.: Programm: (S. 3)
Bevor wir uns mit "kleinen Einzelheiten" befassen, ein Versuch, die "großen Ideen" der Programmierung
kurz zu beschreiben:
1.4 Die vier wichtigsten Grundkonzepte der Programmierung
Variable (Wertebehälter, Inhalt beliebig oft veränderbar)
Typ
Unterprogramm
Modul
Zur Entspannung: Was kostet ein Studium an der Beuth Hochschule?
Haushalt der Beuth Hochschule ca. 50 Millionen [Euro pro Jahr].
An der Beuth Hochschule studieren ca. 10 Tausend StudentInnen.
Also kostet das Studieren an der Beuth Hochschule ca. 5000 [Euro pro StudentIn und Jahr].
Ein Bachelor-Studium (6 Semester, 3 Jahre) kostet also ca. 15 Tausend [Euros pro StudentIn].
Im WS10/11 liegt die Anzahl der StudentInnen an der Beuth Hochschule
erstmals ein wenig über 10 Tausend.
Beuth Hochschule, TB3-IN3
1. SU Fr 01.10.2010
WS10/11, Seite 6
2. Übung
Gruppe 1a: Mo 04.10.2010, 14.15 Uhr, Raum D E 16a
Gruppe 1b: Fr 08.10.2010, 12.15 Uhr, Raum D E 16b
Bei der 1. Übung haben wir noch weitgehend auf die Benutzung der Rechner im SWE-Labor verzichtet.
In dieser 2. Übung sollen diese Rechner intensiv benutzt werden.
Tip: Verwenden Sie als Browser nicht den Internet Explorer (weil der zur Darstellung von
.pdf-Dateien den Adobe Reader sucht, der im SWE-Labor nicht installiert ist),
sondern den Mozilla Firefox (der .pdf-Dateien ohne Probleme anzeigen kann).
1. Meine Netzseite: http://public.beuth-hochschule.de/~grude/ ansehen.
2. Dort die Datei für TB3-IN3
TipsZumTextPad.pdf
(finden und) öffnen. Darin den folgenden Tip ausführen:
5. Ein kleines Programm zusammenklicken, statt es einzutippen.
3. In das erstellte Programm einen Fehler einbauen (z.B. eine Klammer löschen).
Erneut compilieren.
Auf die 1. Zeile einer Fehlermeldung doppelklicken. Was passiert dadurch?
Den eingebauten Fehler korrigieren (z.B. die Klammer wieder einfügen).
Erneut compilieren und ausführen lassen.
4. Die Netzseite zum Buch "Java ist eine Sprache":
http://public.beuth-hochschule.de/~grude/JavaIstEineSprache/ ansehen.
5. Von dort das Archiv BspJaSp.zip herunterladen
und in ein Verzeichnis namens Z:\BspJaSp entpacken.
6. Ein Verzeichnis namens Z:\Java\Hallo erstellen
und aus dem Verzeichnis Z:\BspJaSp (siehe vorigen Punkt 5.)
alle Hallo*.java-Dateien
nach Z:\Java\Hallo kopieren.
In einem regulären Ausdruck wie Hallo*.java steht der * allgemein für eine beliebige Zeichenkette.
In diesem konkreten Anwendungsfalll steht er für Zahlen wie 01, 01A, 01B, 02 etc.)
7. Die drei Java-Quelldateien
Hallo01.java
Hallo01A.java
Hallo01B.java
mit dem TextPad öffnen, compilieren und ausführen lassen.
Was ist bei diesen drei Quelldateien gleich? Wodurch unterscheiden sie sich?
8. Auf meiner Netzseite die Datei für TB3-IN3
Aufgaben.pdf
(finden und) öffnen
9. Die Aufgabe 2: Rechnen mit Ganzzahlen bearbeiten (und dabei das unter Punkt 2. gelernte "Zusammenklicken eines Programms" praktisch anwenden).
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 7
Wiederholungsfragen, 2. SU, Fr 08.10.10
1. Was sind die charakteristischen Tätigkeiten des Programmierers?
Geben Sie nur Tätigkeitsworte an, z.B. laufen, essen, schlafen.
2. Was sind die charakteristischen Tätigkeiten des Ausführers?
3. Was ist ein Programm?
4. Beschreiben Sie kurz den Unterschied zwischen
einer M-Variablen in einer mathematischen Abhandlung oder in einem Beweis und
einer P-Variablen in einem Programm.
5. Beschreiben Sie den Vorteil von Typen (in einer Programmiersprache wie C oder Java) mit einem
möglichst einfachen, kurzen Satz. Diesen Satz soll Ihr Manager (der nur oberflächliche Informatikkenntnisse hat und nicht Programmieren kann) möglichst gut verstehen können.
6. Angenommen, Sie haben eine (in C programmierte) Divisionsfunktion mit folgendem Profil bekommen:
int div(int dend, int dor);
Schreiben Sie (in C) die zu dieser Divisionsfunktion passende Modulo-Funktion
int mod(int dend, int dor) {
Beuth Hochschule, TB3-IN3
1. SU Fr 01.10.2010
WS10/11, Seite 8
Antworten zu den Wiederholungsfragen, 2. SU, Fr 08.10.10
1. Was sind die charakteristischen Tätigkeiten des Programmierers?
Geben Sie nur Tätigkeitsworte an, z.B. laufen, essen, schlafen.
schreiben, übergeben
2. Was sind die charakteristischen Tätigkeiten des Ausführers?
prüfen, akzeptieren/ablehenen, ausführen
3. Was ist ein Programm?
Eine Folge von Befehlen, die ein Programmierer geschrieben hat und die von einem Ausführer
ausgeführt werden können.
4. Beschreiben Sie kurz den Unterschied zwischen
einer M-Variablen in einer mathematischen Abhandlung oder in einem Beweis und
einer P-Variablen in einem Programm.
Einer M-Variablen darf man nur einmal einen Wert zuordnen (und diesen Wert dann nicht mehr
verändern). Den Wert einer P-Variablen darf man beliebig oft verändern.
5. Beschreiben Sie den Vorteil von Typen (in einer Programmiersprache wie C oder Java) mit einem
möglichst einfachen, kurzen Satz. Diesen Satz soll Ihr Manager (der nur oberflächliche Informatikkenntnisse hat und nicht Programmieren kann) möglichst gut verstehen können.
Typen ermöglichen es dem Ausführer bestimmte Fehler des Programmierers automatisch (und
damit schneller und billiger) zu erkennen.
6. Angenommen, Sie haben eine (in C programmierte) Divisionsfunktion mit folgendem Profil bekommen:
int div(int dend, int dor);
Schreiben Sie (in C) die zu dieser Divisionsfunktion passende Modulo-Funktion
int mod(int dend, int dor) {
return dend - (div(dend, dor) * dor);
}
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 9
2. SU Fr 08.10.10
A. Wiederholung
B. Organisation:
Entgegen dem, was ich am letzten Freitag (01.10.10) dachte, gibt es noch ein paar freie Plätze in der
Übungsgruppe 1a (montags im 4. Block), aber die Übungsgruppe 1b (freitags, 3. Block) ist schon weitgehend voll.
Rollenspiel, ein Nachtrag
Wozu haben wir die Rollen des Warters und des Wiedervervenders (also die Rollen "der Kollegen des
Programmierers") eingeführt?
Um deutlich zu machen, dass Programme nicht nur die richtigen Befehle an den Ausführer enthalten
müssen (der Ausführer ist meist eine Maschine), sondern auch von anderen Menschen (den Kollegen)
gelesen und verstanden werden müssen.
Es gschieht leider immer noch häufig, dass Programmierer nur "mit dem Ausführer kämpfen", aber nicht
an ihre armen Kollegen denken, die das Programm später warten oder wiederverwenden sollen.
1.4 Die vier wichtigsten Grundkonzepte der Programmierung (Fortsetzung)
Modul
Das fünfte der vier wichtigsten Grundkonzepte: Klasse
Eine unvollständige Definition: Eine Klasse ist ein Modul und ... .
1.5 Drei Arten von Befehlen
Bezeichnung
(deutsch)
Bezeichnung
(englisch)
Übersetzung eines solchen Befehls ins Deutsche
(oder: Was befiehlt ein solcher Befehl dem Ausführer?)
Vereinbarung
declaration
"Erzeuge ... !"
Ausdruck
expression
"Berechne den Wert des Ausdrucks ... !"
Anweisung
statement
"Tue die Werte ... in die Wertebehälter ... !"
Was ein Ausdruck macht und was ein (normaler) Ausdruck nicht macht!
Zwei Vokablen:
Methode (engl. method)
Attribut (engl. field)
Ein Unterprogramm, das in einer Klasse vereinbart wurde.
Eine Variable,
die in einer Klasse vereinbart wurde.
Zur Entspannung: Al-Khwarizmi (ca. 780-850)
Abu Ja'far Muhammad ibn Musa Al-Khwarizmi war ein islamischer Mathematiker, der in Bagdad lebte,
über Indisch-Arabische Zahlen schrieb und zu den ersten gehörte, die die Ziffer 0 benutzten. Aus seinem
Namen entstand (durch Übertragung ins Latein und dann in andere Sprachen) das Wort Algorithmus.
Eine seiner Abhandlungen heißt Hisab al-jabr w'al-muqabala (auf Deutsch etwa: "Über das Hinüberbringen", von einer Seite einer Gleichung auf die andere). Daraus entstand unser Wort Algebra.
5.3 Mit primitiven Werten rechnen (S.103)
Verschiedene Mengen von Zahlen wie Mathematiker und Ingenieure sie sehen:
Verschiedene Mengen von Zahlen wie ein Java-Ausführer sie sieht:
Wie viele Elemente enthalten die Zahlen-Mengen N, Z, Q, R und C?
(unendlich viele)
S.103, Bild 5.1
S.104, Bild 5.2
Beuth Hochschule, TB3-IN3
2. SU Fr 08.10.10
WS10/11, Seite 10
Was haben die Mengen N, Z, Q, R und C miteinander zu tun?
(Sie sind Teilmengen voneinander: N ⊂ Z, Z ⊂ Q, Q ⊂ R, R ⊂ C)
Wie viele Elemente enthalten die Zahlen-Mengen
byte, char, short, int, long, float, double?
(endlich viele, die genauen Anzahlen stehen auf S. 93 des Buches)
Was haben die Mengen byte, char, short, int, long, float, double miteinandner zu tun?
(Wenig, sie sind disjunkt, d.h. sie haben keine gemeinsamen Elemente).
In der Mathematik gibt es nur eine Zahl siebzehn. Diese Zahl ist gleichzeitig
eine natürliche, eine ganze, eine rationale, eine reelle und eine komplexe Zahl.
Ein Java-Ausführer unterscheidet sieben Zahlen namens siebzehn:
Eine siebzehn vom Typ byte, eine siebzehn vom Typ char, ..., eine siebzehn vom Typ double.
Kurz-Notation: byte-17, char-17, short-17, int-17, long-17, float-17, double-17.
Diese sieben Zahlen unterscheiden sich erheblich voneinander. Beispiel für Unterschiede:
Beispiel-1: Die Zahl double-17 darf man einer Variablen des Typs double zuweisen,
aber nicht in einer Variablen des Typs int oder byte etc.
Beispiel-2: Wenn man die Zahl double-17 durch die Zahl double-2 dividiert, kommt als Ergebnis
die Zahl double-8.5 heraus.
Wenn man die Zahl int-17 durch die Zahl int-2 dividiert, kommt als Ergebnis
die Zahl int-8 heraus.
Beispiel-3: Wenn man die Zahl float-17 durch die Zahl float-0 dividiert, kommt als Ergenis
eine float-Zahl namens Float.POSITIVE_INFINITY heraus.
Wenn man die Zahl long-17 durch die Zahl long-0 dividiert, kommt kein Ergebnis heraus,
vielmehr wird "eine Ausnahme geworfen". Praktisch bedeutet das häufig (aber nicht immer),
dass die Ausführung des betreffende Programm mit einer Fehlermeldung abgebrochen wird).
Mit Ausnahmen werden uns später genauer befassen.
Allgemein gilt:
Wenn ein Java-Ausführer mit Ganzzahlen rechnet (d.h. mit Zahlen der Typen byte, char, short, int oder
long), dann gelten ganz andere Regeln, als wenn er
mit Gleitpunktzahlen rechnet (d.h. mit Zahlen der Typen float oder double).
In einem Java-Programm bezeichnen
Literale wie 0 oder 123 oder 587389 immer int-Werte,
Literale wie 0.0 oder 12.345 oder 8799.34567 bezeichnen dagegen double-Werte.
Es folgen ein paar Beispiele für Rechnungen mit int Werten:
7 / 2 ist gleich 3
5 / 0 loest eine Ausnahme des Typs ArithmeticException aus (Programmabbruch)
0 / 0 loest eine Ausnahme des Typs ArithmeticException aus (Programmabbruch)
Beispiele für Rechnungen mit double-Werten:
7.0
5.0
5.0
0.0
7.0
7.0
7.0
/
/
/
/
/
/
+
2.0
0.0
-0.0
0.0
(5.0 / 0.0)
(5.0 / -0.0)
(0.0 / 0.0)
ist
ist
ist
ist
ist
ist
ist
gleich 3.5
gleich Infinity
gleich -Infinity
gleich NaN
gleich 0.0
gleich -0.0
gleich NaN
Anhand der Aufgaben 2 und 3 sollen sie sich mit den Rechenregeln für int-Werte bzw. float-Werte
vertraut machen. Auf S. 107 des Buches finden sie zwei Tabellen, die die Multiplikation * und die Division / für float- und double-Werte beschreiben.
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 11
Wiederholungsfragen, 3. SU, Fr 15.10.10
1. Was ist ein Modul? Vollständige Definition!
2. Was ist eine Klasse? Unsere vorläufige, unvollständige Definition.
3. Wie heißen die drei Arten von Befehlen, die im letzten SU eingeführt wurden auf Deutsch?
4. Ebenso, auf Englisch?
5. Geben Sie von jedem der Java-Befehle in der folgenden Tabelle an, zu welcher Art er gehört:
Befehl
Art des Befehls
int n = 25;
n = 37;
n + 3
int mult(int a, int b) {
return a * b;
}
double d;
pln("Hallo Welt!");
17 + mult(3, 5)
Tip: Um einen Befehl richtig einzuordnen sollten Sie sich fragen:
Was befiehlt dieser Befehl dem Ausführer? Etwas zu erzeugen? Oder einen Wert zu berechnen?
Oder die Inhalte bestimmter Wertebehälter (Variablen, Bildschirm etc.) zu verändern?
6. Welche zwei Arten von Typen unterscheidet man in Java?
7. Wie viele primitive Typen gibt es in Java, und wie heißen sie?
Beuth Hochschule, TB3-IN3
2. SU Fr 08.10.10
WS10/11, Seite 12
Antworten zu den Wiederholungsfragen, 3. SU, Fr 15.10.10
1. Was ist ein Modul? Vollständige Definition!
Ein Behälter für Variablen, Unterprogramme, Typen, Module, ... etc., der aus mindestens zwei
Teilen besteht, einem öffentlichen Teil und einem privaten Teil (oder: einem ungeschützten und einem geschützten Teil, oder: einem erreichbaren und einem nicht-erreichbaren Teil).
2. Was ist eine Klasse? Unsere vorläufige, unvollständige Definition.
Ein Modul und ...
3. Wie heißen die drei Arten von Befehlen, die im letzten SU eingeführt wurden auf Deutsch?
Vereinbarung, Ausdruck, Anweisung
4. Ebenso, auf Englisch?
declaration, expression, statement
5. Geben Sie von jedem der Java-Befehle in der folgenden Tabelle an, zu welcher Art er gehört:
Befehl
Art des Befehls
int n = 25;
Vereinbarung
n = 37;
Anweisung
n + 3
Ausdruck
int mult(int a, int b) {
return a * b;
}
Vereinbarung
double d;
Vereinbarung
pln("Hallo Welt!");
Anweisung
17 + mult(3, 5)
Ausdruck
Tip: Um einen Befehl richtig einzuordnen sollten Sie sich fragen:
Was befiehlt dieser Befehl dem Ausführer? Etwas zu erzeugen? Oder einen Wert zu berechnen?
Oder die Inhalte bestimmter Wertebehälter (Variablen, Bildschirm etc.) zu verändern?
6. Welche zwei Arten von Typen unterscheidet man in Java?
Primitive Typen, Referenztypen.
7. Wie viele primitive Typen gibt es in Java, und wie heißen sie?
Acht Stück: byte, char, short, int, long, float, double, boolean.
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 13
3. SU Fr 15.10.10
A. Wiederholung
B. Organisation
Typen und Variablen
Def.: Ein Typ ist ein Bauplan für Variablen
Eine Variablen-Vereinbarung beginnt deshalb immer mit einem Typ.
1
2
3
4
5
6
7
// Variablen-Vereinbarungen (mit Initialisierung)
int
anna = 17;
String bert = "Hallo!";
// Zuweisungen (keine Vereinbarungen!)
anna = 18;
bert = "Hello?";
2.3. Mehrere Klassen, ein Programm (S. 31)
In Zeile 6 wird eine Methode aufgerufen. Welche?
Was passiert in Zeile 7? In Zeile 8?
Die Punktnotation: Modul Punkt Element
Die Methode pln im Modul Hallo04
Die Methode sin im Modul Math
Das Attribut MAX_VALUE im Modul Integer
Das Attribut PI im Modul Math
Hallo04.pln(...)
Math.sin(...)
Integer.MAX_VALUE
Math.PI
Mit dieser Notation ist es also ganz leicht, innerhalb eines Moduls M1 auf Methoden und Atrribute
zuzugreifen, die in einem anderen Modul M2 drin sind. Die Module M1 und M2 können z.B. zwei
Klassen sein (später werden wir noch andere Module kennen lernen, die keine Klassen sind).
Zur Entspannung: Unlösbare Probleme?
Gibt es exakt definierte Probleme, die man mit Computern nicht lösen kann? Ja.
Beispiel 1: Das Kachel-Katalog-Problem
Eingabe: Ein Katalog von "Kacheln mit vier farbigen Kanten" und der Anschlussbedingung, dass nur
gleichfarbige Kanten aneinander stoßen dürfen.
Ausgabe: "Ja", wenn man mit Kacheln aus dem Katalog eine beliebig große Fläche kacheln kann,
"Nein" wenn das nicht möglich ist.
3
Katalog 1: 1
4
2
2
1
2
3
7
6
3
2
1
3
4
2
2
6
5
Katalog 2:
4
3
Katalog 3:
1
4
1
3
4
8
6
5
7
4
8
7
8
7
6
5
6
8
1
Kann mit Kacheln aus dem Katalog 1 eine beliebig große Fläche kacheln? (Ja)
Ebenso mit Katalog 2? (Ja) Ebenso mit Katalog 3? (Nein)
Beispiel 2: Das Halte-Problem
Eingabe: Ein Java-Programm P und ein Satz Eingaben E für P.
Ausgabe: "Hält" (oder "Ja"), wenn das Programm P mit der Eingabe E nach endlich vielen Rechenschritten von allein anhält. "Hält nicht" (oder "Nein"), wenn P mit E in eine Endlosschleife oder in eine
Endlos-Rekursion gerät.
Beuth Hochschule, TB3-IN3
3. SU Fr 15.10.10
WS10/11, Seite 14
Variablen als Bojen darstellen
Das Bild 5.6 auf S. 119 an der Tafel entwickeln, dann kurz im Buch ansehen.
StringBuilder otto = new StringBuilder("Hallo!");
|otto|--<78>--[<22>]--["Hallo!"]
Def.: Eine Variable besteht aus mindestens zwei Teilen (Referenz und Wert). Einige Variablen haben
ein oder zwei zusätzliche Teile (Name und/oder Zielwert).
Variablen eines primitiven Typs (primitive Variablen) bestehen aus
höchstens 3 Teilen (Name, Referenz, Wert).
Variablen eines Refereztyps (Referenzvariablen) bestehen aus
höchstens 4 Teilen (Name, Referenz, Wert, Zielwert)
S. 121, Beispiel-02: Der Unterschied zwischen
primitiven Variablen (eines primitiven Typs) und
Referenzvariablen (eines Referenztyps)
S. 122, Beispiel-03: Eine Zuweisung ändert immer den Wert einer Variablen!
(und nicht etwa die Referenz oder den Zielwert einer Variablen)
S. 125, Beispiel-07: Die Vergleichsoperatoren == und != vergleichen immer Werte!
(und nicht etwa Referenzen oder Zielwerte von Variablen)
Zielwerte kann man nur vergleichen, wenn ihr Typ das zuläßt. Und wenn er es zuläßt, muss man
zum Vergleichen Methoden namens equals, compareTo bzw. compare verwenden
(und nicht etwa Operationen namens <, <=, ==, !=, >=, >).
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 15
Wiederholungsfragen, 4. SU, Fr 22.10.10
1. Was ist ein Typ?
2. Wie viele primitve Typen gibt es in Java?
3. Wie heißen die primitiven Typen in Java?
4. Beschreiben Sie kurz (Stichworte genügen) den Unterschied zwischen der Zahl 3 in der Mathematik
und der Zahl 3 in der Sprache Java.
5. Angenommen, Sie sehen in einem Java-Programm folgenden Befehl:
1
Anna.bert = Carl.dora();
Was für ein Ding bezeichnet der Name Anna in diesem Befehl? Und bert? Und Carl? Und dora?
6. Aus wie vielen Teilen besteht eine Variable mindestens? Und wie heißen diese Teile?
7. Aus wie vielen Teilen besteht eine Variable höchstens? Und wie heißen diese Teile?
8. Welcher Teil einer Variablen wird durch eine Zuweisung (z.B. x = ...;) verändert?
9. Wenn man zwei Variablen mit einem Vergleichsoperator vergleicht
(z.B. x == y oder x != y oder x < y etc.), welche Teile der Variablen werden dann verglichen?
10. Stellen Sie die folgenden Variablen als Bojen dar:
2
3
4
long
emil = 123;
String fanny = new String("ABC");
String gerd = null;
Um ehrlich zu sein: Die letzte Teilaufgabe (in Zeile 4) ist gar keine Wiederholung, sondern "Neuland".
Raten Sie mal, wie die Boje von gerd aussieht. Welcher Teil der Variablen gerd wird durch
die Initialisierung = null festgelegt? Der Name? Oder die Referenz? Oder ... ?
Beuth Hochschule, TB3-IN3
3. SU Fr 15.10.10
WS10/11, Seite 16
Antworten zu den Wiederholungsfragen, 4. SU, Fr 22.10.10
1. Was ist ein Typ?
Ein Bauplan für Variablen.
2. Wie viele primitve Typen gibt es in Java?
8 Stück.
3. Wie heißen die primitiven Typen in Java?
byte, char, short, int, long, float, double, boolean.
4. Beschreiben Sie kurz (Stichworte genügen) den Unterschied zwischen der Zahl 3 in der Mathematik
und der Zahl 3 in der Sprache Java.
In der Mathematik gibt es nur eine Zahl 3, die gleichzeitig eine eine natürliche, eine ganze, eine rationale ... Zahl ist. In Java gibt es sieben verschiedene Zahlen 3, eine vom Typ byte, eine vom Typ
char, eine vom Typ short etc.
5. Angenommen, Sie sehen in einem Java-Programm folgenden Befehl:
1
Anna.bert = Carl.dora();
Was für ein Ding bezeichnet der Name Anna in diesem Befehl? Und bert? Und Carl? Und dora?
Anna bezeichnet einen Modul (z.B. eine Klasse).
bert bezeichnet eine Variable (die sich im Modul Anna befindet).
Carl bezeichnet einen Modul (z.B. eine Klasse).
dora bezeichnet eine Methode (die sich im Modul Carl befindet).
6. Aus wie vielen Teilen besteht eine Variable mindestens? Und wie heißen diese Teile?
Aus 2 Teilen: Referenz und Wert.
7. Aus wie vielen Teilen besteht eine Variable höchstens? Und wie heißen diese Teile?
Aus 4 Teilen: Name, Referenz, Wert, Zielwert.
8. Welcher Teil einer Variablen wird durch eine Zuweisung (z.B. x = ...;) verändert?
Der Wert
9. Wenn man zwei Variablen mit einem Vergleichsoperator vergleicht
(z.B. x == y oder x != y oder x < y etc.), welche Teile der Variablen werden dann verglichen?
Die Werte der Variablen
10. Stellen Sie die folgenden Variablen als Bojen dar:
2
3
4
long
emil = 123;
String fanny = new String("ABC");
String gerd = null;
Um ehrlich zu sein: Die letzte Teilaufgabe (in Zeile 4) ist gar keine Wiederholung, sondern "Neuland".
Raten Sie mal, wie die Boje von gerd aussieht.Welcher Teil der Variablen gerd wird durch
die Initialisierung = null festgelegt? Der Name? Oder die Referenz? Oder ... ?
Die Variablen emil, fanny und gerd als ASCII-Bojen dargestellt:
|emil|---<10>---[123]
|fanny|--<20>---[<30>]---["ABC"]
|gerd|---<40>---[<null>]
Die Variable gerd hat (noch) keinen Zielwert.
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 17
4. SU Fr 22.10.10
A. Wiederholung
B. Organisation:
Bojen (Ergänzung)
Referenztypen in Java haben ziemlich viel Ähnlichkeit mit Pointer-Typen in C (die man daran erkennt,
dass ihre Namen mit mindestens einem Sternchen * beginnen, z.B. *int oder **double etc.).
Eine Referenzvariabe in Java
(d.h. eine Variable eines Referenztyps wie z.B. String oder StringBuilder etc.)
kann den besonderen Wert null haben.
In einem solchen Fall hat sie keinen Zielwert ("der Wert null zeigt nicht [auf einen Zielwert]").
Wenn eine Referenzvariable einen anderen Wert hat als null, dann hat sie einen Zielwert
(dann zeigt sie auf einen Zielwert).
Eine Referenzvariable in Java kann aber nie auf null zeigen!
(Eine Pointer-Variable in C kann dagegen auf null zeigen,
aber nur wenn der Name ihres Typs mit mindestens zwei Sternchen ** beginnt, z.B. **double).
Eine Klasse (wir sind wieder bei Java) ist nicht nur ein Modul, sondern gleichzeitig ein Typ, genauer: ein
Referenztyp. In der Java-Standardbibliothek gibt es zur Zeit etwa 4000 Klassen (d.h. Referenztypen),
und jeder Programmierer kann weitere solche Referenztypen programmieren.
Aufgabe: Lernen Sie bis nächste Woche die Namen aller Referenztypen in Java!
(War nicht ernst gemeint :-).
Anweisungen
Man unterscheidet (in Java und anderen Sprachen)
2 Arten von Anweisungen: einfache und zusammengesetzte
(simple and compound expressions).
Def.: Eine Anweisung ist zusammengesetzt, wenn sie andere Anweisungen enthalten kann.
Einfache Anweisungen: Zuweisung, Prozeduraufruf (in C-Slang: Aufruf einer void-Funktion),
return, break, continue, throw, assert, die leere Anweisung.
Woraus besteht eine Zuweisung? (Aus einem Variablennamen und einem Ausdruck).
Eine Zweisung kann aber keine anderen Anweisungen enthalten.
Woraus besteht eine return-Anweisung? (Nur aus dem Schlüsselwort return oder
aus return und einem Ausdruck).
Eine return-Anweisung kann aber keine anderen Anweisungen enthalten).
Zusammengesetzte Anweisungen: Die Blockanweisung {... }, if, switch, while, for, ... .
Eine if-Anweisung enthält Anweisungen als ihre Teile (sie besteht unter anderem aus Anweisungen).
Wie viele Anweisungen kann eine if-Anweisung enthalten? Mindestens? Höchstens?
(Mindestens eine, höchstens zwei).
Wie viele Anweisungen enthält eine while-Schleife? (Genau eine).
Beuth Hochschule, TB3-IN3
4. SU Fr 22.10.10
WS10/11, Seite 18
Beispiel für eine while-Schleife:
Wir wollen wiederholt int-Werte einlesen und in eine summe addieren, bis der Benutzer 999 eingibt
(die 999 bedeutet nur, dass der Benutzer aufhören will, soll aber nicht addiert werden)
1 int summe = 0;
2
3 while(true) {
4
int n = EM.liesInt();
5
if (n == 999) break;
6
summe += n;
7 }
Tip: Schreiben Sie alle while-Schleifen so wie diese. Vermeiden Sie
while-Schleifen mit einer "komplizierten Bedingung" (ungleich true) und benutzen Sie auf keinen
Fall do-while-Schleifen (es sei denn, sie wollen den Sinn Ihres Programms unbedingt geheim
halten :-).
Allerdings: Sie müssen while-Schleifen mit "komplizierten Bedingungen" und do-while-Schleifen
lesen und verstehen können (weil offenbar noch ziemlich viele Programmierer den Sinn ihrer Programme geheim halten wollen :-)!
Um ehrlich zu sein: Was while-Schleifen betrifft sind einige (vielleicht sogar noch ziemlich viele)
Informatiker (darunter auch einige meiner Kollegen an der Beuth Hochschule) anderer Ansicht als ich.
for-i-Schleifen
Aus wie vielen Teilen besteht eine for-i-Schleife und wie heißen diese Teile?
Diagramm auf S. 75 besprechen.
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 19
Zur Entspannung: Eigenschaften von Qbits (Quanten-Bits)
1. Mit n "normalen Bits" kann man eine Zahl (zwischen 0 und 2n-1) darstellen. Mit n Qubits kann man
gleichzeitig bis zu 2n Zahlen (zwischen 0 und 2n-1) darstellen und mit einer Operation kann man alle
diese Zahlen "gleichzeitig bearbeiten".
2. Wenn man ein Qubit "ansieht und ausliest", bekommt man nur einen seiner Werte. Alle anderen Werte gehen dabei unvermeidbar und unwiderruflich verloren.
3. Es ist nicht möglich, ein Qubit (mit all seinen Werten) zu kopieren. Man kann höchstens einen seiner
Werte kopieren.
4. Auf Qubits kann man nur umkehrbare Verknüpfungen anwenden.
Zur Zeit (2008) erforschen mehrere Tausend Physiker, Informatiker und Ingenieure in mehr als 100 Forschungsgruppen etwa ein Dutzend Möglichkeiten, Qbits zu realisieren (durch ion traps. quantum dots,
linear optics, ...).
Eine interessante Einführung in die Quantenmechanik von einer berliner Schülerin:
Silvia Arroyo Camejo: "Skurrile Quantenwelt", Springer 2006, Fischer 2007
7 Reihungen (arrays)
Angenommen, wir brauchen in einem Programm 100 Variablen des Typs long. Wie können wir dem
Ausführer befehlen, diese Variablen zu erzeugen?
S. 150, Beispiel-01: Viele Variablen eines bestimmten Typs vereinbaren
Das war ziemlich viel Schreibarbeit. Und jedesmal, wenn wir alle Variablen bearbeiten wollen (z.B. mit
pln ausgeben oder ihren Wert auf 0 setzen oder ...) müssen wir nochmal 100 Befehle hinschreiben.
S. 150, Beispiel-02: Viele Variablen ausgeben
Was kann der Programmierer mit einer Schleife bewirken? (Dass die Befehle im Rumpf der Schleife
mehr als einmal, z.B. 100 Mal, ausgeführt werden).
S. 151: Beispiel-03: Viele Variablen mit einer Schleife erzeugen lassen
Warum funktioniert diese Schleife nicht so, wie wir gewünscht haben. Es werden doch 100 Variablen erzeugt. Was ist das Problem? (Die Namen der 100 Variablen sind alle gleich. Deshalb können wir immer
nur auf eine zugreifen, nämlich auf die zuletzt erzeugte)
Um möglichst einfach viele Variablen (eines bestimmten Typs) vereinbaren zu können, hat man
Reihungen (engl. arrays) erfunden (und in die meisten Programmiersprachen eingebaut).
S. 151, Beispiel-04: Eine Reihung von 100 long-Variablen vereinbaren
Wir mussten nur einen Namen für die Reihung erfinden (im Beispiel: v). Damit
haben wir aber 100 Namen festgelegt: v[0], v[1], v[2], ..., v[99].
Zusätzlich gibt es automatisch noch eine ganz neue Art von Namen (für Variablen), z.B. so:
8
9
10
11
12
13
int i = 17;
pln(v[i]);
i = 38;
pln(v[i]);
...
...
// Hie bezeichnet der Name v[i] die Variable v[17]
// Hie bezeichnet der Name v[i] die Variable v[38]
Die Bedeutung des Namens v[i] steht nicht "eisern fest". Wir können sie ändern, indem wir der Variablen i einen anderen Wert zuweisen. Mit diesem Trick ist es möglich, alle 100 Variablen in der Reihung
v mit demselben Namen v[i] zu bezeichnen. Wow!
S. 152, Beispiel-05: Die Reihung v mit Hilfe von Schleifen bearbeiten
In Java ist auch jede Reihung ein Modul. Dieser Modul enthält u.a. eine (unveränderbare) int-Variable
namens length. In der steht die Länge der Reihung (d.h. die Anzahl der Variablen in der Reihung).
Beuth Hochschule, TB3-IN3
4. SU Fr 22.10.10
WS10/11, Seite 20
Was passiert, wenn wir die Vereinbarung der Reihung v (S. 151, Zeile 13) verändern, etwa so:
14 long[] v = new long[500];
und danach die Schleifen im Beispiel-05 noch mal ausführen lassen? (Alles geht gut! Wow2!)
Mit Reihungen kann man auch ganz neue Fehler machen, z.B.:
15 pln(v[100]);
16 pln(v[-17]);
Solche Fehler entdeckt der Java-Ausführer noch nicht
bei der Übergabe des Programms ("zur Compilezeit"), aber
immerhin während der Ausführung ("zur Laufzeit")
und wirft dann eine Ausnahme des Typs ArrayIndexOutOfBoundsException.
Die zweite for-Schleifen im Beispiel-05 ist noch unnötig kompliziert. Mit Java 5 wurden für solche
Fälle einfachere for-each-Schleifen eingeführt.
S. 153, Beispiel-06: Eine (neue) for-each-Schleife und eine (alte) for-i-Schleife, die das Gleiche
machen (daran kann man erkennen, was man mit einer for-each-Schleife machen kann und was
nicht).
Das Schwierige an diesen einfachen Schleifen ist, dass man bestimmte Schleifenprobleme damit
nicht lösen kann (und dann z.B. eine klassische for-i-Schleife verwenden muss,
z.B. die erste Schleife im Beispiel-05).
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 21
Wiederholungsfragen, 5. SU, Fr 29.10.10
1. Welche der folgenden Variablenvereinbarungen werden vom Java-Ausführer akzeptiert und welche
werden abgelehnt?
1
2
3
String siegfried = null;
int
ingeborg = null;
Integer irmgard
= null;
2. Stellen Sie die akzeptablen Variablen der vorigen Frage als Bojen dar.
3. Was kann der Programmierer dem Ausführer (ganz allgemein) mit einer Anweisung
(eng. statement) befehlen?
4. Welche Anweisungen gehören zur Gruppe der zusammengesetzten Anweisungen
(engl. compound statements)?
5. Was kann man (ganz allgemein) mit einer if- oder einer switch-Anweisung bewirken?
6. Was kann man (ganz allgemein) mit einer while- oder for-Anweisung bewirken?
7. Vereinbaren Sie 3500 double-Variablen und
sorgen Sie dafür, dass in jeder dieser Variablen der Wert -1.0 steht.
8. Geben Sie die Werte aller double-Variablen
(die Sie als Lösung der vorigen Aufgabe vereinbart haben) zur Standardausgabe aus
(einen Wert pro Zeile, mit dem Befehl pln), und zwar zweimal:
8.1. Mit einer for-i-Schleife (die Sie schon aus C kennen)
8.2. Mit einer for-each-Schleife (die es in C nicht gibt).
9. Erhöhen Sie den Wert von jeder double-Variablen
(die Sie als Lösung der vorvorigen Aufgabe vereinbart haben)
um den Wert 3.0.
Beuth Hochschule, TB3-IN3
4. SU Fr 22.10.10
WS10/11, Seite 22
Rückseite der Wiederholungsfragen, 5. SU, Fr 29.10.10
Sorry: Das SWE-Labor wurde in den vorigen Semesterferien (erfolgreich) umgebaut, musste dann aber
in sehr kurzer Zeit wieder eingerichtet werden. Dabei ist mir bei der Konfiguration des Editors Textpad
ein Fehler unterlaufen, den jeder einzelne von Ihnen möglichst bald (in der nächsten Übung) korrigieren
sollte. Hier ein paar Hinweise dazu.
1. Korrigieren Sie die Parameter für den TextPad-Befehl
Extras, Benutzer-Programme, Java kompilieren.
Wie das geht, wird im Papier TipsZumTextpad,
im Abschnitt 15. Der TextPad-Befehle "Java kompilieren" beschrieben.
Sie müssen nur den Wert im Textfeld hinter Parameter: verändern, indem Sie dort
-d Z:\klassen $FileName
eintragen. Den Wert im Textfeld unter Regulärer Ausdruck für Sprungziele in Werkzeug-Ausgabe
brauchen Sie nicht zu ändern.
2. Und wenn Sie schon mal dabei sind, die Konfirguration Ihres TextPads zu verbessern, sollten Sie auch
noch zwei Tasten-Kürzel (für zwei besonders praktische Editier-Befehle) vereinbaren. Wie das im Prinzip geht, steht im Papier TipsZumTextpad im Abschnitt 14. Nützliche Tasten-Kürzel. Hier ein paar
eränzende Hinweise dazu:
Starten Sie den TextPad und wählen Sie
Konfiguration, Einstellungen, Tastatur.
Ein Fenster wie das folgende sollte aufgehen:
Wählen Sie (wie oben dargestellt) unter Kategorien die Kategorie Bearbeiten.
Wählen Sie dann unter Befehle den Befehl EditCopyLine. Geben Sie dann unter Neue Tastenkombination die Tastenkombination Alt-C ein und klicken Sie auf den Knopf Zuweisen (rechts oben).
Wählen Sie dann unter Befehle den Befehl EditDeleteLine. Geben Sie dann unter Neue Tastenkombination die Tastenkombination Alt-Y ein und klicken Sie auf den Knopf Zuweisen (rechts oben).
Jetzt können Sie beim Editieren die aktuelle Zeile (die, in der der Curser sich gerade befindet)
mit Alt-C copieren und mit Alt-Y löschen (ohne die ganze Zeile umständlich mit der Maus auswählen zu müssen).
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 23
Antworten zu den Wiederholungsfragen, 5. SU, Fr 29.10.10
1. Welche der folgenden Variablenvereinbarungen werden vom Java-Ausführer akzeptiert und welche
werden abgelehnt?
1
2
3
String siegfried = null;
int
ingeborg = null;
Integer irmgard
= null;
Die Vereinbarungen der (Referenz-) Variablen siegfried und irmgard sind akzeptabel,
die Vereinbarung der (primitiven) Variablen ingeborg ist nicht akzeptabel.
2. Stellen Sie die akzeptablen Variablen der vorigen Frage als Bojen dar.
|sigfried|--<110>--[<null>]
|irmgard|---<120>--[<null>]
3. Was kann der Programmierer dem Ausführer (ganz allgemein) mit einer Anweisung
(eng. statement) befehlen?
Bestimmte Werte in bestimmte Wertebehälter zu tun.
4. Welche Anweisungen gehören zur Gruppe der zusammengesetzten Anweisungen
(engl. compound statements)?
Die, die andere Anweisungen als ihre Teile enthalten.
5. Was kann man (ganz allgemein) mit einer if- oder einer switch-Anweisung bewirken?
Dass die in der (if- bzw. switch-) Anweisung enthaltenen Anweisungen
weniger als einmal ausgeführt werden.
6. Was kann man (ganz allgemein) mit einer while- oder for-Anweisung bewirken?
Dass die in der (while- bzw. for-) Anweisung enthaltenen Anweisungen
mehr als einmal ausgeführt werden
(oder in Sonderfällen nullmal oder einmal ausgeführt werden).
7. Vereinbaren Sie 3500 double-Variablen und
sorgen Sie dafür, dass in jeder dieser Variablen der Wert -1.0 steht.
4
5
double[] dora = new double[3500];
for (int i=0; i<dora.length; i++) dora[i] = -1;
8. Geben Sie die Werte aller double-Variablen
(die Sie als Lösung der vorigen Aufgabe vereinbart haben) zur Standardausgabe aus
(einen Wert pro Zeile, mit dem Befehl pln), und zwar zweimal:
8.1. Mit einer for-i-Schleife (die Sie schon aus C kennen)
6
for (int i=0; i<dora.length; i++) pln(dora[i]);
8.2. Mit einer for-each-Schleife (die es in C nicht gibt).
7
for (double d : dora) pln(d);
9. Erhöhen Sie den Wert von jeder double-Variablen
(die Sie als Lösung der vorvorigen Aufgabe vereinbart haben)
um den Wert 3.0.
8
for (int i=0; i<dora.length; i++) dora[i] += 3.0;
Anmerkung: Diese Aufgabe kann man nicht mit einer for-each-Schleife lösen!
Beuth Hochschule, TB3-IN3
5. SU Fr 29.10.10
WS10/11, Seite 24
5. SU Fr 29.10.10
A. Wiederholung
B. Organisation
1. Bei den Tests auf das ausgeteilte Blatt bitte nur die Lösungen schreiben. Nebenrechnungen und Skizzen sollten Sie auf einem extra Papier machen. Solche "Skizzenblätter" brauchen Sie nicht abzugeben.
2. Bei den Übungen: Achten Sie darauf, nur auf der Z-Platte Ordner anzulegen und Dateien abzuspeichern. Schreiben Sie nie auf die C-Platte!
3. Klausur: Am Mo 07.02.2011, 14 Uhr im Raum B101
Was man mit for-each-Schleifen nicht kann:
- Die Werte der Komponenten (Variablen) einer Reihung verändern.
- 2 oder mehr Reihungen "parallel" bearbeiten (z.B. komponentenweise vergleichen)
Andererseits: Wenn man eine Reihung von Referenzvariablen (z.B. des Typs StringBuilder) hat,
dann kann man die Zielwerte der Reihungskomponenten durchaus mit einer for-each-Schleife verändern, etwa so:
9
10
11
12
13
14
15
16
17
StringBuilder[] sbr = {
new StringBuilder("Hallo");
new StringBuilder("Sonja!");
new StringBuilder("Wie geht's?");
}
for (StringBuilder sb : sbr) {
sb.append("ABC");
}
Reihungen als Bojen darstellen
Die "Dinger, die in einer Reihung drin sind" bezeichnen wir als die Komponenten der Reihung
(engl. elements of an array).
Achtung: Komponenten sollte man im Deutschen nicht Elemente nennen (weil Elemente schon als Übersetzung des engl. member verbreitet ist)
Reihungen mit primitiven Komponenten: S. 155, Beispiel-01, Seite 156, Bild 7.1
In vereinfachter Darstellung: S. 157, Bild 7.2
Reihungen mit Referenzkomponenten: S. 157, Beispiel-02, Bild 7.3
In vereinfachter Darstellung: S. 158, Bild 7.4
Statt Zielwert sagt man häufig: Objekt
Statt Reihung mit Referenzkomponenten sagt man häufig: Reihung von Objekten
Wichtig: Eine Reihung von Objekten enthält (genau genommen) keine Objekte, sondern nur Referenzen,
die auf Objekte zeigen. Die Objekte liegen außerhalb der Reihung!
7.2 Erzeugung einer Reihung in 3 Schritten (S. 161)
7.3 Reihungen auf verschiedene Weisen kopieren (S. 162)
7.4 Mehrstufige Reihungen (Reihungen von Reihungen) (S. 165)
Mehrstufige Reihungen (engl. nested arrays) sollte man nicht mit
mehrdimensionalen Reihungen (engl. multidimensional arrays) verwechseln!
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 25
S. 165, Beispiel-01: Die zweistufige Reihung irrA
Vereinbarung und Bojendarstellung
Die Komponenten irrA[0], irrA[1], ... dieser Reihung sind
Reihungen vom Typ int[].
Die elementaren Komponenten von irrA
(d.h. die Komponenten der Komponenten, die keine Reihungen mehr sind) sind vom Typ int.
Noch ein Beispiel, um die Grundbegriffe zu üben:
1
String[][][] robert = new String[3][2][4];
Von welchem Typ ist robert?
(Reihung von Reihungen von Reihung von String-Variablen)
Von welchem Typ sind die Komponenten robert[0], robert[1], ... von robert?
(Reihung von Reihungen von String-Variablen)
Von welchem Typ sind die Komponenten der Komponenten von robert?
(Reihung von String-Variablen)
Von welchem Typ sind die elementaren Komponenten von robert?
(Sie sind vom Typ String)
Wichtiger Unterschied zwischen mehrstufigen und mehrdimensionalen Reihungen:
Mehrstufige Reihungen (nested arrays) können Komponenten unterschiedlicher Länge enthalten
(mit Worten aus der Druckindustrie: "sie können einen Flatterrand haben"). Mehrdimensionale Reihungen müssen immer "rechteckig" sein.
S. 168, Beispiel-04: Ein dreistufige Reihung mit unterschiedlich langen Komponenten
Ein Unterschied zwischen C und Java:
In C gibt es erstmal mehrdimensionale Reihungen.
Mehrstufige Reihungen kann man aber leicht als Reihungen von Pointern realisieren.
In Java gibt es erstmal nur mehrstufige Reihungen.
Es gibt aber Klassen, deren Objekte sich genau wie mehrdimensionale Reihungen verhalten
(siehe alphaWorks.ibm.com).
Zur Entspannung: Englische Vokabeln: ambiguous, geek, drag etc.
ambiguous
zweideutig, unklar
geek
Fachmann (z. B. für Computer), mild negativ. Früher war ein geek "ein wilder Mann
mit Bart" auf einer Kirmes, der z. B. Mäusen den Kopf abbiss.
to execute
ausführen (z. B. ein Programm oder einen Befehl), hinrichten (z. B. einen Verurteilten,
nur in Ländern mit Todesstrafe).
rocket science
wörtlich: Raketenwissenschaft, sonst: schwierig zu lernen, anspruchsvoll.
to drag
ziehen, zerren (z. B. eine Maus über eine Tischplatte).
what a drag
Was für ne Mühe, Umstand.
in full drag
aufgebrezelt, aufgetakelt, auffällig zurecht gemacht.
drag queen
Transvestit.
for the birds
für die Katz (wörtlich: für die Vögel), bringt nichts, unnütz, z. B. im Wortspiel
nesting (of functions) is for the birds.
Beuth Hochschule, TB3-IN3
5. SU Fr 29.10.10
WS10/11, Seite 26
Wiederholungsfragen, 6. SU, Fr 05.11.10
1. Aus wie vielen Teilen besteht eine Variable höchstens und wie heißen diese Teile?
2. Welche Teile der Komponenten einer Reihung kann man nicht mit
einer for-each-Schleife verändern?
3. Betrachten Sie die folgende Vereinbarung einer Reihungsvariablen:
1
int[][][] otto = {{{1,2}, {3,4,5}}, {{6}, {7,8,9},{10}}};
Geben Sie die folgenden Typen so in Worten an, wie man sie ausspricht:
3.1. Den Typ von otto?
3.2. Den Typ der Komponenten von otto?
3.3. Den Typ der Komponenten der Komponenten von otto?
3.4. Den Typ der elementaren Komponenten von otto?
4. Betrachten Sie die folgenden drei Befehle:
2
3
4
Integer[] ir = null;
ir = new Integer[2];
ir[1] = new Integer(17);
Wie sieht die Reihungsvariable ir nach Ausführung der Zeile 2 aus (als Boje dargestellt)?
Ebenso für Zeile 3 und für Zeile 4 (Sie sollen ir also insgesamt dreimal als Boje darstellen).
5. Erinnern Sie sich an den Unterschied zwischen
mehrstufigen Reihungen und
mehrdimensionalen Reihungen. Welche Eigenschaft können die Komponenten einer
mehrstufigen Reihung haben, aber die Komponenten einer
mehrdimensionalen Reihung können sie nicht haben?
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 27
Rückseite der Wiederholungsfragen, 6. SU, Fr 05.11.10
Mehrdimensionale und mehrstufige Reihungen in der Programmiersprache C (kurze Wiederholgung)
A: Zwischen eindimensionalen und einstufigen Reihungen gibt es keinen Unterschied:
1
2
// Die Reihung dr ist eindimensional und einstufig:
double dr[3] = {1.5, 2.5, 3.5};
B: Mehrdimensionale und mehrstufige Reihungen unterscheiden sich voneinander:
3
4
5
6
7
8
double
double
double
double
double
double *
zd [3][2]
drA[3]
drB[2]
drC[4]
drD[0]
zs [6]
=
=
=
=
=
=
{{11.5, 12.5}, {21.5, 22.5}, {31.5, 32.5}};
{11.5, 12.5, 13.5};
{21.5, 22.5};
{31.5, 32.5, 33.5, 34.5};
{};
{drA, drB, drC, NULL, drD, NULL};
Die Reihung zs enthält 6 Komponenten vom Typ double * (Zeiger-auf-double, engl. pointer to
double). Davon haben 2 den Wert NULL. Die anderen 4 Komponenten zeigen auf einstufige Reihungen
von double-Variablen. Diese einstufigen Reihungen sind unterschiedlich lang.
Merke: Eine Reihung der Länge 0 (wie z.B. die Reihung drD oder zs[4]) ist etwas ganz anderes als
eine NULL-Komponente (wie z.B. zs[3] und zs[5]).
C: Eine zweidimensionale Reihung von double-Variablen enthält nur double-Variablen, keine Zeiger
(engl. pointer). Z.B. enthält die zweidimensionale Reihung zd insgesamt 6 double Variablen.
D: Eine mehrdimensionale Reihung ist in einem bestimmten Sinne "rechteckig". Z.B. entspricht die
zweidimensionale Reihung zd einem Rechteck von double-Variablen. Eine dreidimensionale Reihung
entspricht einem Quader etc.
E: Eine zweistufige Reihung (von Reihungen von double-Variablen) enthält (erstmal) keine doubleVariablen, sondern Zeiger, die auf Reihungen zeigen (oder den Wert NULL haben). Diese Reihungen
können unterschiedlich lang sein.
F: Problem: In einem C-Programm enthält keine Reihung "von sich aus" Informationen über ihre Länge
(d.h. über die Anzahl ihrer Komponenten). Dieses Problem ist bei mehrstufigen Reihungen besonders
groß (weil die Komponenten-Reihungen unterschiedlich lang sein können).
Lösung 1: Man läßt jede Reihung mit einer Null-Komponenten enden (bei int-Reihungen ist die NullKomponente eine 0, bei double-Reihungen eine 0.0, bei Reihungen von Zeigern ein NULL-Wert etc.).
Lösung 2: Bei Reihungen r mit Zahlen als Komponenten (int, double, ...) kann man die Länge in
der 0-ten-Komponente r[0] ablegen.
G: In C ist der Name einer Reihung (wie z.B. der Name dr) der Name einer Zeiger-Konstanten. Eine
Konstante besteht (nur) aus einem Namen und einem Wert. Der Wert einer Konstanten kann nicht verändert werden. Der Wert einer Zeiger-Konstanten ist ein Zeiger. Die Zeiger-Konstante dr zeigt auf die
nullte Komponente der Reihung dr (d.h. auf die Komponente mit dem Index 0). Die Ausdrücke *dr
und dr[0] bezeichnen also dieselbe Variable (vom Typ double).
Als Illustration eine Darstellung der Reihung dr (siehe oben Zeile 1) als ASCII-Boje:
|dr|--[<100>]
|
[1.5]
<108>
|
[2.5]
<116>
|
[3.5]
Der Zeiger dr gleich <100> zeigt auf die nullte Komponente von dr (die den Wert 1.5 hat). Die Zeiger dr+1 gleich <108> und dr+2 gleich <116> zeigen auf die 1. bzw. 2. Komponente von dr (unter
der Annahme, dass ein double-Wert 8 Bytes lang ist).
H: Die folgenden Ausdrücke bezeichnen (per Definition) dieselbe Variable:
dr[i] ist gleich *(dr + i) ist gleich *(i + dr) ist gleich i[dr].
Beuth Hochschule, TB3-IN3
5. SU Fr 29.10.10
WS10/11, Seite 28
Antworten zu den Wiederholungsfragen, 6. SU, Fr 05.11.10
1. Aus wie vielen Teilen besteht eine Variable höchstens und wie heißen diese Teile?
Aus 4 Teilen: Name, Referenz, Wert, Zielwert
2. Welche Teile der Komponenten einer Reihung kann man nicht mit
einer for-each-Schleife verändern?
Die Werte
3. Betrachten Sie die folgende Vereinbarung einer Reihungsvariablen:
1
int[][][] otto = {{{1,2}, {3,4,5}}, {{6}, {7,8,9},{10}}};
Geben Sie die folgenden Typen so in Worten an, wie man sie ausspricht:
3.1. Den Typ von otto?
3.2. Den Typ der Komponenten von otto?
3.3. Den Typ der Komponenten der Komponenten von otto?
3.4. Den Typ der elementaren Komponenten von otto?
3.1. Reihung von Reihungen von Reihungen von int (-Variablen).
3.2. Reihung von Reihungen von int (-Variablen).
3.3. Reihung von int (-Variablen)
3.4. int
4. Betrachten Sie die folgenden drei Befehle:
2
3
4
Integer[] ir = null;
ir = new Integer[2];
ir[1] = new Integer(17);
Wie sieht die Reihungsvariable ir nach Ausführung der Zeile 2 aus (als Boje dargestellt)?
Ebenso für Zeile 3 und für Zeile 4 (Sie sollen ir also insgesamt dreimal als Boje darstellen).
Nach Zeile 2: |ir|--<110>--[<null>]
0
1
Nach Zeile 3: |ir|--<110>--[<120>]--[ [<null>] [<null>] ]
0
1
Nach Zeile 4: |ir|--<110>--[<120>]--[ [<null>] [<130>] ]
|
[17]
5. Erinnern Sie sich an den Unterschied zwischen
mehrstufigen Reihungen und
mehrdimensionalen Reihungen. Welche Eigenschaft können die Komponenten einer
mehrstufigen Reihung haben, aber die Komponenten einer
mehrdimensionalen Reihung können sie nicht haben?
Die Komponenten von mehrstufigen Reihungen (sind Reihungen und)
können unterschiedlich lang sein ("mehrstufige Reihungen können einen Flatterrand haben").
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 29
6. SU Fr 05.11.10
A. Wiederholung
B. Organisation
Was bedeutet oder bezeichnet der Name einer Rerferenzvariablen?
Angenommen, wir haben folgende Referenzvariable:
1 StringBuilder stb = new StringBuilder("ABC");
Die vier Teile der Variablen stb als (ASCI-) Boje dargestellt:
|stb|
|
<100>
|
[<110>]
|
["ABC"]
Name
Referenz
Wert
Zielwert
In jedem der folgenden Befehle kommt der Variablenname stb vor:
1
2
3
4
if (stb == ...) ...
stb.append("ZZ");
stb = ... ;
pln(stb);
Welchen Teil der Variablen bezeichnet der Name stb in den einzelnen Befehlen?
In Zeile 1: Den Wert [<110>], denn der wird durch den Operator == verglichen.
In Zeile 2: Den Zielwert ["ABC"]. Dieser Zielwert ist ein Objekt des Typs StringBuilder, d.h. ein
Modul, in dem sich u.a. eine Methode namens append (mit einem String-Parameter) befindet. Diese
Methode append im Zielwert-Modul von sb wird aufgerufen.
In Zeile 3: Den Wert [<110>], denn dieser Wert wird durch einen anderen Wert ersetzt.
In Zeile 4: Ein Teil des Zielwertes d.h. Moduls ["ABC"], falls ein Zielwert vorhanden ist, sonst der
Wert der Variablen sb (der dann gleich null ist).
Man muss also immer aus dem Zusammenhang erkennen, ob mit dem Namen einer Referenzvariablen
gerade der Wert oder der Zielwert (bzw. welcher Teil des Zielwertes) gemeint ist.
6. Ausdrücke
Man unterscheidet (in Java und anderen Sprachen)
2 Arten von Ausdrücken: einfache und zusammengesetzte
(simple and compound expressions).
Haben Sie einen ganz ähnlichen Satz schon mal gehört oder gelesen? Siehe oben, S. 17
6.1. Einfache Ausdrücke
Jeder Variablenname und jedes Literal ist ein (einfacher) Ausdruck.
S. 133, Beispiel-01: Typische Literale verschiedener Typen
S. 133, Beispiel-02: int-Literale
Def.: Ein Literal ist ein Name für einen bestimmten Wert.
Ein Java-Programmierer kann im Prinzip von jedem Literal wissen,
zu wlechem Typ es gehört und welchen Wert es bezeichnet!
Die Literale 10, 0xA, 0Xa und 012 bezeichnen alle den int-Wert zehn.
Das Literal 0.1 bezeichnet einen double-Wert, der ein bisschen größer ist als ein Zehntel (diesen
Wert braucht man nur "im Prinzip" zu kennen, ohne seine exakte Darstellung auswendig zu wissen).
Beuth Hochschule, TB3-IN3
6. SU Fr 05.11.10
WS10/11, Seite 30
Das Literal 0.1F bezeichnet einen float-Wert, der ein bisschen größer ist als ein Zehntel und ein
bisschen größer als der Wert des double-Literals 0.1.
Ein Variablenname ist auch eine Art Name für einen Wert (für den Wert, den die Variable gerade enthält). Aber so ein Name sagt einem nicht, welcher Wert gemeint ist: Eine int-Variable namens drei
muss nicht unbedingt den Wert 3, sondern kann ohne weiteres einen anderen Wert enthalten.
Eine double-Variable namens pi muss nicht den Wert der berühmten Kreiszahl enthalten, sondern
kann auch den Wert 5.0 oder -7.5 etc. enthalten.
Dagegen bezeichnet das Literal 17 immer den int-Wert siebzehn (sonst dürfen Sie ihren Java-Ausführer umtauschen und einen neuen verlangen :-).
Literale sind syntaktische Größen (d.h. sie können in einem Quellprogramm vorkommen).
Werte sind semantische Größen (d.h. sie können in Quellprogrammen nur benannt werden, dort aber
selbst nicht vorkommen). Sie werden erst bei der Ausführung eines Programms vom Ausführer berechnet, miteinander verglichen, umgewandelt, in Variablen gespeichert etc.
Vergleich: Menschen können in Romanen nur benannt werden, dort aber selbst (als Wesen aus Fleisch
und Blut) nicht vorkommen.
6.2 Zusammengesetzte Ausdrücke
Sie bestehen aus Ausdrücken, Operatoren wie +, -, *, /, %, <, <=, &&, ||, ! ... etc. und runden Klammern.
Beispiele: Aus welchen Teilen bestehen die Ausdrücke in der nachfolgenden Tabelle?
// Als "Rohmaterial" vereinbaren wir ein paar Variablen:
int
otto, emil, anna, bert, carl, dora;
boolean fany, gerd, heinz;
Ausdruck
Teil 1
Teil 2
Teil 3
otto + emil
otto
+
emil
anna + bert + carl
+
dora
anna + bert * carl
anna
+
anna * bert + carl
anna * bert
+
-
otto
anna + bert + carl + dora
-otto
bert * carl
carl
fany || gerd && heinz
fany
||
gerd && heinz
fany && gerd || heinz
fanny && gerd
||
heinz
!
heinz
!heinz
Zur Entspannung: Christian Morgenstern (1871-1914)
Tertius Gaudens
Da freut sich der Dritte (eigentlich das 4. Perlhuhn nach 3 Schweinen)
Vor vielen Jahren sozusagen, hat folgendes sich zugetragen:
Drei Säue taten um ein Huhn / in einem Korb zusammen ruhn.
Ein String-Literal bezeichnet ein String-Objekt
Der Unterschied zwischen
5
6
String s04 = "Hallo";
String s05 = new String("Hallo");
S. 230, Beispiel-02
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 31
Wiederholungsfragen, 7. SU, Fr 12.11.10
1. Betrachten Sie die folgenden Befehle:
1
2
3
4
5
6
StringBuilder sb = new StringBuilder("Hallo") ;
pln(sb);
sb = null;
pln(sb);
if (sb != null) pln("Guten Morgen!");
pln(sb.length());
Welchen Teil der Variablen sb bezeichnet der Name "sb" in Zeile 2?
Und in Zeile 3?
Und in Zeile 4?
Und in Zeile 5?
Und in Zeile 6?
2. Woraus bestehen zusammengesetzte Ausdrücke?
3. Mit welchen Werten werden die Variablen gleich1 und gleich2 initialisiert?
7
8
9
10
11
String
String
String
boolean
boolean
meldungA
meldungB
meldungC
gleich1
gleich2
= new String("Falscher Param");
=
"Falscher Param";
=
"Falscher Param";
= meldungA == meldungB;
= meldungB == meldungC;
Im Buch auf S. 143-144 finden Sie eine Tabelle aller Operatoren, die in Java-Ausdrücken vokommen
dürfen.
4. Wo in der Tabelle steht die Regel "Punktrechnung geht vor Strichrechnung"? Geben Sie zwei ZeilenNummern und die Überschrift einer Spalte an (die Zeilen müssen Sie selbst "mit dem Finger zählen").
5. Betrachten Sie folgende Variablenvereinbarung:
12
13
int
i1, i2, i3, i4;
boolean b1, b2, b3, b4;
Aus welchen Teilen bestehen die Ausdrücke, die in der zweiten Spalte der folgenden Tabelle stehen?
Tragen Sie die Teile in die daneben stehenden Spalten der Tabelle ein.
Nr Ausdruck
1
i1 + i2 < i3
2
i1 >= i2 + i3
3
i1 < i2 == i3 < i4
4
i1 == i2 == b1
5
b1 & b2 ^ b3
6
b1 || b2 | b3
7
b1 & b2 && b3
8
b1 != b2 != b3
Teil1
Teil2
Teil3
Beuth Hochschule, TB3-IN3
6. SU Fr 05.11.10
WS10/11, Seite 32
Rückseite der Wiederholungsfragen, 7. SU, Fr 12.11.10
Zum Thema char-Literale
Informelle
Bezeichnung
Wie viele char-Werte
kann man mit solchen
Literalen bezeichnen?
Normale Literale
viele, aber nicht alle
'A'
'0'
'?'
8
'\b'
'\''
'\t'
'\"'
'\n' '\f' '\r'
'\\'
Flucht-Literale
Unicode-Literale
alle 65535
Oct-Literale
256
Beispiele
'\u0000'
'\0'
'"'
'\1'
'\u0001'
...
...
'\uFFFF'
'377'
Achtung: Wenn man dem Java-Ausführer ein Programm übergibt, "sieht er" keine grafischen Zeichen
(Kringel für eine 0 oder ein O, Striche für Minuszeichen oder Unterstriche etc.), sondern eine Folge von
Zahlen (z.B. die Zahlenfolge 65 66 67 wenn der Programmierer die Zeichenfolge ABC in sein Programm
geschrieben hat).
Bevor der Ausführer das Programm liest und prüft, ersetzt er darin alle Zeichenfolgen der Form \uxxxx
(wobei jedes x für eine Hex-Ziffer steht) in die entsprechende Zahl. Zwei Beispiele:
Die Zeichenfolge
d.h. die Zahlenfolge
wird ersetzt durch die Zahl
\u0041
92 117 48 48 52 49
65
\u4EB8
92 117 52 69 66 56
die steht für das Zeichen
A
亸
19976
Das Schriftzeichen 亸 bedeutet (wenn ich mich nicht täusche) in etwa
"früh aufstehen" oder "die Morgenröte" :-).
Durch die Ersetzung kann der Programmtext falsch (unakzeptabel) werden, z.B. in folgenden Fällen:
Fehlerhafte char-Literale:
1
2
3
4
5
6
char[] cr = {
'\u000A', //
'\u000D', //
'\u0027', //
'\u005C', //
};
Ein
Ein
Ein
Ein
LF-Zeichen '\n'
CR-Zeichen '\r'
einfaches Anfuehrungszeichen
Rueckwaertsschraegstrich
'
\
Wie diese Zeilen aussehen, wenn der Java-Ausführer sie liest:
1
2
3
4
5
6
char[] cr = {
'
', // Ein LF-Zeichen, '\n'
'
', // Ein CR-Zeichen, '\r'
''', // Ein einfaches Anfuehrungszeichen '
'\', // Ein Rueckwaertsschraegstrich
\
};
Dass der Java-Ausführer zuerst alle Zeichenfolgen der Form \uxxxx durch die Codezahlen der entsprechenden Zeichen ersetzt, macht es möglich, auch ohne einen speziellen Editor z.B. Variablennamen einzugeben, die aus chinesischen Schriftzeichen bestehen etwa so:
14
char 丈丅亸 = (char) 19976;
Eine (für den Java-Ausführer) gleichwertige Vereinbarung kann z.B. so aussehen:
15
char \u4E08\u4E05\u4EB8 = '\uEB8';
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 33
Antworten zu den Wiederholungsfragen, 7. SU, Fr 12.11.10
1. Betrachten Sie die folgenden Befehle:
1
2
3
4
5
6
StringBuilder sb = new StringBuilder("Hallo") ;
pln(sb);
sb = null;
pln(sb);
if (sb != null) pln("Guten Morgen!");
pln(sb.length());
Welchen Teil der Variablen sb bezeichnet der Name "sb" in Zeile 2?
Den Zielwert
Und in Zeile 3?
Den Wert
Und in Zeile 4?
Den Wert
Und in Zeile 5?
Den Wert
Und in Zeile 6?
Den Zielwert
2. Woraus bestehen zusammengesetzte Ausdrücke?
Aus Ausdrücken, Operatoren und runden Klammern.
3. Mit welchen Werten werden die Variablen gleich1 und gleich2 initialisiert?
7
8
9
10
11
String
String
String
boolean
boolean
meldungA
meldungB
meldungC
gleich1
gleich2
= new String("Falscher Param");
=
"Falscher Param";
=
"Falscher Param";
= meldungA == meldungB;
= meldungB == meldungC;
Die Variable gleich1 wird mit false und gleich2 wird mit true initialisiert.
Im Buch auf S. 143-144 finden Sie eine Tabelle aller Operatoren, die in Java-Ausdrücken vokommen
dürfen.
4. Wo in der Tabelle steht die Regel "Punktrechnung geht vor Strichrechnung"? Geben Sie zwei ZeilenNummern und die Überschrift einer Spalte an (die Zeilen müssen Sie selbst "mit dem Finger zählen").
In den Zeilen 3 und 4 in der Spalte Bindungsstärke (12 bzw. 11).
5. Betrachten Sie folgende Variablenvereinbarung:
12
13
int
i1, i2, i3, i4;
boolean b1, b2, b3, b4;
Aus welchen Teilen bestehen die Ausdrücke, die in der zweiten Spalte der folgenden Tabelle stehen?
Tragen Sie die Teile in die daneben stehenden Spalten der Tabelle ein.
Nr Ausdruck
Teil1
Teil2
Teil3
1
i1 + i2 < i3
i1 + i2
<
i3
2
i1 >= i2 + i3
i1
>=
i2 + i3
3
i1 < i2 == i3 < i4
i1 >= i2
==
i3 < i4
4
i1 == i2 == b1
i1 == i2
==
b1
5
b1 & b2 ^ b3
b1 & b2
^
b3
6
b1 || b2 | b3
b1
||
b2 | b3
7
b1 & b2 && b3
b1 & b2
&&
b3
8
b1 != b2 != b3
b1 != b2
!=
b3
Beuth Hochschule, TB3-IN3
7. SU Fr 12.11.10
WS10/11, Seite 34
7. SU Fr 12.11.10
A. Wiederholung
B. Organisation
Ausdrücke (Ergänzung)
In Java gibt es verschiedene Arten von Literalen.
S. 133, Beispiel-01: Eine Übersicht über typische Literale verschiedener Typen
Für alle primitive Typen außer byte und short gibt es Literale:
S. 133, Beispiel-02: int-Literale
S. 134, Beispiel-04: char-Literale
Die Rückseite der Wiederholungsfragen besprechen.
S. 135, Beispiel-05: String-Literale
Daumenregel: Ein String besteht aus char-Werten. Jeden einzelnen dieser char-Werte kann man
ganz ähnlich beschreiben wie mit einem char-Literal, aber ohne die einfachen Anführungszeichen '
drumrum.
Beispiel:
14
15
16
17
char
char
char
String
c1
c2
c3
s
=
=
=
=
'A';
'\u0042';
'\\';
"A\u0042\\";
//
//
//
//
Ein A
Ein B
Ein Rueckswaertsschraegstrich \
Drei Zeichen: AB\
Unterschied zwischen "ein char-Wert" und "ein Zeichen":
Im Unicode werden etwa 60 Tausend Zeichen durch je einen char-Wert dargestellt.
Etwa eine Million weitere Zeichen können durch je zwei char-Werte dargestellt werden.
Zwei char-Werte, die zusammen ein Zeichen repräsentieren, bezeichnet man als
ein Surrogat-Paar oder auch als einen Codepoint.
Ist s ein String, so bezeichnet
s.length()
die Anzahl der char-Werte in s und
s.codePointCount(0, s.length()) die Anzahl der Zeichen in s
Beispiel für den Unterschied zwischen char-Werten und Zeichen:
18
19
String s41 = "\u0041\u0042\u0043";
String s42 = "\uD840\uDC01\u0043";
Für die Strings s41 und s42 gilt:
------------------------------------s41.length()
: 3
s41.codePointCount(0, s.length(): 3
s41
: ABC
------------------------------------s42.length()
: 3
s42.codePointCount(0, s.length(): 2
s42
: 洛C
-------------------------------------
Um ehrlich zu sein: Das hier abgebildete chinesische Schriftzeichen ist nicht das richtige (das mit dem
Unicode \uD840\uDC01), sondern ein falsches (das mit dem Unicode \uF915), weil ich nicht herausfinden konnte, ob und wie man in ein OpenOffice-Dokument Surrogat-Paare eingeben kann. Aber
das richtige Zeichen sieht dem hier abgebildeten Zeichen hoffentlich sehr ähnlich :-).
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 35
Zur Entspannung: Alan Mathison Turing (1912-1954), einer der Begründer der Informatik
Bevor man die ersten elektronischen Computer baute, konzipierte und untersuchte der Mathematiker
Turing eine Rechenmaschine, die so einfach war, dass niemand an ihrer prinzipiellen Realisierbarkeit
zweifelte. Eine solche Turing-Maschine besteht aus einem unbegrenzt langen Band, welches in kleine
Abschnitte eingeteilt ist, von denen jeder genau ein Zeichen eines endlichen Alphabets aufnehmen kann.
Ein Schreib-Lese-Kopf über dem Band kann bei jedem Arbeitsschritt der Maschine das Zeichen auf
dem aktuellen Abschnitt lesen und in Abhängigkeit davon ein bestimmtes Zeichen auf den aktuellen
Abschnitt schreiben und einen Abschnitt nach links oder rechts weiterrücken. Ein Programm für eine
solche Maschine besteht aus einer endlichen Menge von Befehlen der folgenden Form:
"Wenn das aktuelle Zeichen gleich X ist, dann schreibe Y und gehe einen Abschnitt nach links bzw.
nach rechts bzw. bleib wo du bist" (wobei X und Y beliebige Zeichen des Alphabets sind).
Wichtige Erkenntnis 1: Es gibt viele (präzise definierte, mathematische) Probleme, die man mit Hilfe einer solchen Turing-Maschine lösen kann (z. B. das Multiplizieren von dreidimensionalen Matrizen).
Wichtige Erkenntnis 2: Es gibt aber auch (präzise definierte, mathematische) Probleme, die man nicht
mit Hilfe einer solchen Turing-Maschine lösen kann.
Wichtige Vermutung 3: Alle Probleme, die man mit heutigen oder zukünftigen Computern lösen kann,
kann man im Prinzip auch mit einer Turing-Maschine lösen.
Im zweiten Weltkrieg arbeitete Turing für die Government Code and Cypher School in Bletchley Park
(d. h. für den britischen Geheimdienst) und half entscheidend dabei, die Maschine zu durchschauen, mit
der die deutsche Marine ihre Funksprüche verschlüsselte (die Enigma), und wichtige Funksprüche zu
entschlüsseln. Damit hat er vermutlich einer ganzen Reihe von aliierten Soldaten (Engländern, Amerikanern, Franzosen, Russen) das Leben gerettet.
Weil er homosexuell war, wurde Turing nach dem Krieg zu einer Hormonbehandlung "seiner Krankheit" gezwungen, bekam schwere Depressionen und nahm sich das Leben. Inzwischen wurden die entsprechenden Gesetze in England (und ähnliche Gesetze in anderen Ländern) beseitigt. Im September
2009 entschuldigte sich der britische Premierminister Gordon Brown dafür, wie Turing behandelt worden ist.
Ein Blatt mit den Übungen Schleifen (ausführen) 1 und Schleifen (programmieren) 2 austeilen und
bearbeiten lassen.
Beuth Hochschule, TB3-IN3
7. SU Fr 12.11.10
WS10/11, Seite 36
Wiederholungsfragen, 8. SU, Fr 19.11.10
1. Geben Sie von jedem der folgenden Typen mindestens ein Literal an:
Typ
Literal(e)
long
String
int
double
boolean
char
float
2. Geben von jeder der folgenden pln-Anweisungen den Typ ihres Parameters und ihre Ausgabe zum
Bidlschirm an:
pln-Anweisung
Typ des Parameters
Ausgabe
pln('\u0041');
pln("\u0041");
pln(0041);
pln(0x41L);
pln(0.041);
pln(0041F);
3. Sie bekommen zum Kurban Bayrami (dtsch: Opferfest) anstelle eines Lammrückens einen String s
geschenkt und stellen fest, dass der Funktionsaufruf s.length() den Wert 10 liefert. Wie viele
char-Werte enthält dieser String? Was wissen Sie über die Anzahl der Zeichen, die s enthält?
4. Zwei der folgenden Namen bezeichnen verbreitete und erfolgreich eingesetzte Zeichencodes. Einer
der Name bezeichnet mehrere Zeichencodes, die viele Probleme und Ärger verursacht haben. Welcher
Name bezeichnet diese problematischen Codes?
8-Bit-ASCII
7-Bit-ASCII
Unicode
5. Wie vielen Namen von Zeichen kann der Unicode eine 16-Bit lange Codezahl zuordnen?
6. Wie vielen Namen von Zeichen kann der Unidoce eine 32-Bit lange Codezahl zuordnen?
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 37
Rückseite der Wiederholungsfragen, 8. SU, Fr 19.1110
Klassen und Objekte (Beginn eines größeren Kapitels)
Def.: Eine Klasse ist ein Modul und ein Bauplan für Module.
Beispiel-M für die Benutzung der Klasse Character als Modul:
1 char meinZeichen = EM.liesChar();
2 ... Character.isDigit(meinZeichen) ...
In Zeile 2 wird die Funktion isDigit aufgerufen, die sich im Modul Character befindet. Sie liefert
true, wenn ihr Parameter eine Ziffer darstellt. Im Unicode gelten zur Zeit 208 Zeichen als Ziffern. Einige davon werden im folgenden dargestellt (aber für einige habe ich offenbar keinen passenden Font):
0123456789٩٨٧٦٥٤٣٢١٠۰۱۲۳۴۵۶۷۸۹०१२३४५६७८९০১২৩৪৫৬৭৮৯
੦੧੨੩੪੫੬੭੮੯૦૧૨૩૪૫૬૭૮૯୦୧୨୩୪୫୬୭୮୯௧௨௩௪௫௬௭௮௯౦౧౨౩౪
౫౬౭౮౯೦೧೨೩೪೫೬೭೮೯൦൧൨൩൪൫൬൭൮൯๐๑๒๓๔๕๖๗๘๙໐໑໒໓໔໕
໖໗໘໙༠༡༢༣༤༥༦༧༨༩ ??????????????????????????????????
????
0 1 2 3 4 5 6 7 8 9
Beispiel-B1 für die Benutzung der Klasse Character als Bauplan:
3 ... new Character(meinZeichen) ...
Hier wird dem Ausführer befohlen, einen neuen Modul nach dem Bauplan Character zu bauen. Im
Bauplan steht, welche Methoden und Variablen in diesen neuen Modul eingebaut werden müssen.
Module, die man (wie hier gezeigt) mit dem new-Befehl erzeugen läßt, werden meist als Objekte oder
als Instanzen (der Klasse Character) bezeichnet.
Beispiel-B2 für die Benutzung der Klasse Character als Bauplan:
4 Character deinZeichen = null;
Hier wird dem Ausführer befohlen, eine Variable vom Typ Character zu bauen. Diese Variable kann
im Prinzip auf ein Character-Objekt zeigen, wird aber erstmal mit dem Wert null initialisiert und
zeigt somit erstmal nicht auf ein Objekt.
Beispiel-B3 für die Benutzung der Klasse Character als Bauplan:
Die vorigen beiden Beispiele kann man auch kombinieren, etwa so:
5 Character deinZeichen = new Character(meinZeichen);
Hier wird dem Ausführer befohlen, einen neuen Modul (oder: ein neues Objekt) nach dem Bauplan
Character zu bauen und eine Variable namens deinZeichen zu erzeugen, die auf das neue Objekt
zeigt (oder: die das neue Objekt als Zielwert hat).
Beuth Hochschule, TB3-IN3
7. SU Fr 12.11.10
WS10/11, Seite 38
Antworten zu den Wiederholungsfragen, 8. SU, Fr 19.11.10
1. Geben Sie von jedem der folgenden Typen mindestens ein Literal an:
Typ
long
Literal(e)
123L 123l (<- schrecklich!)
String
"Hallo!"
int
123
double
12.345
boolean
true
char
'A'
float
12.345F
" "
""
1234567890
0L
1234567890123456789L
"A\u0042B"
0
12345E-3
0.12345E2
0.0
false
'\u0041'
'\n'
12345E-3f
'\100'
0.12345E2
0.0F
2. Geben von jedem der folgenden pln-Anweisungen den Typ seines Parameters und seine Ausgabe
zum Bidlschrim an:
pln-Anweisung
Ausgabe
pln('\u0041');
Typ des Parameters
char
pln("\u0041");
String
A
int
33
pln(0x41L);
long
65
pln(0.041);
double
0.041
pln(0041F);
float
41.0
pln(0041);
A
3. Sie bekommen zum Kurban Bayrami (dtsch: Opferfest) anstelle eines Lammrückens einen String s
geschenkt und stellen fest, dass der Funktionsaufruf s.length() den Wert 10 liefert. Wie viele
char-Werte enthält dieser String? Was wissen Sie über die Anzahl der Zeichen, die s enthält?
s enthält 10 char-Werte und zwischen 5 und 10 Zeichen.
4. Zwei der folgenden Namen bezeichnen verbreitete und erfolgreich eingesetzte Zeichencodes. Einer
der Name bezeichnet mehrere Zeichencodes, die viele Probleme und Ärger verursacht haben. Welcher
Name bezeichnet diese problematischen Codes?
8-Bit-ASCII
7-Bit-ASCII
Unicode
Zahlreiche 8-Bit-ASCII-Codes verursachen auch heute noch viele Probleme und Ärger.
5. Wie vielen Namen von Zeichen kann der Unicode eine 16-Bit lange Codezahl zuordnen?
Etwa 63 Tausend Zeichen
6. Wie vielen Namen von Zeichen kann der Unidoce eine 32-Bit lange Codezahl zuordnen?
Etwa einer Million Zeichen
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 39
8. SU Fr 19.11.10
A. Wiederholung
B. Organisation
Unicode
Zur Zeit (November 2010) ordnet der Unicode
98 884 Zeichen eine Codezahl zu, davon etwa
60 Tausend eine 16-Bit-Codezahl und den restlichen etwa 40 Tausend Zeichen eine 32-Bit-Codezahl.
4598 Anträge zur Aufnahme weiterer Zeichen, die zusammen 2030 Zeichen betreffen, werden zur Zeit
bearbeitet und geprüft (Quelle: www.decodeunicode.org)
Wenn Sie ein wichtiges Zeichen entdecken, dem im Unicode noch keine Codezahl zugeordnet wird,
können Sie auch einen Antrag stellen (über 900 Tausend Codezahlen sind noch frei!).
Klassen
Klassen in Java sind so etwas wie "Kombinationswerkzeuge" (z.B. ein Kugelschreiber-und-Flaschenöffner oder ein Stemmeisen-mit-Haken-zum-Nägel-rausziehen etc.).
Wir betrachten jetzt die Rückseite der Wiederholungsfragen:
Def.: Eine Klasse ist ein Modul und ein Bauplan für Module.
Beispiel-M für die Benutzung der Klasse Character als Modul:
1 char meinZeichen = EM.liesChar();
2 ... Character.isDigit(meinZeichen) ...
In Zeile 2 wird die Funktion isDigit aufgerufen, die sich im Modul Character befindet. Sie liefert
true, wenn ihr Parameter eine Ziffer darstellt.
Beispiel-B1 für die Benutzung der Klasse Character als Bauplan:
3 ... new Character(meinZeichen) ...
Hier wird dem Ausführer befohlen, einen neuen Modul nach dem Bauplan Character zu bauen. Im
Bauplan steht, welche Methoden und Variablen in diesen neuen Modul eingebaut werden müssen.
Module, die man (wie hier gezeigt) mit dem new-Befehl erzeugen läßt, werden meist als Objekte oder
als Instanzen (der Klasse Character) bezeichnet.
Beispiel-B2 für die Benutzung der Klasse Character als Bauplan:
4 Character deinZeichen = null;
Hier wird dem Ausführer befohlen, eine Variable vom Typ Character zu bauen. Diese Variable kann
im Prinzip auf ein Character-Objekt zeigen, wird aber erstmal mit dem Wert null initialisiert und
zeigt somit erstmal nicht auf ein Objekt.
Beispiel-B3 für die Benutzung der Klasse Character als Bauplan:
Die vorigen beiden Beispiele kann man auch kombinieren, etwa so:
5 Character deinZeichen = new Character(meinZeichen);
Hier wird dem Ausführer befohlen, einen neuen Modul (oder: ein neues Objekt) nach dem Bauplan
Character zu bauen und eine Variable namens deinZeichen zu erzeugen, die auf das neue Objekt
zeigt (oder: die das neue Objekt als Zielwert hat).
Beuth Hochschule, TB3-IN3
8. SU Fr 19.11.10
WS10/11, Seite 40
S. 203, Beispiel-01: Die Klasse Zaehler01
S. 204, Bild 9.1: Der Modulaspket der Klasse Zaehler01
S. 205, Bild 9.2: Zwei Objekte der Klasse Zaehler01
Die record-Types in C/C++ kann man als Vorläufer von Klassen sehen. Oder andersherum:
Mit record-Types kann man einige Eigenschaften von Klassen nachmachen. Aber Klassen sind "viel
mächtiger" als record-Types.
Zur Entspannung: Hilberts Hotel
Denken Sie sich ein Hotel mit unendlich vielen, nummerierten Zimmern: 1, 2, 3, ... . Alle Zimmer sind
belegt. Dieses Hotel wurde nach dem Mathematiker David Hilbert (1862-1943) benannt.
1. Wie kann man einen weiteren Gast unterbringen? (ZrNr := ZrNr + 1)
2. Wie kann man 100 weitere Gäste unterbringen? (ZrNr := ZrNr + 100)
3. Wie kann man unendlich viele weitere Gäste unterbringen? (ZrNr := ZrNr * 2, danach sind
alle Zimmer mit ungeraden Nrn. (1, 3, 5, ...) frei.
Def.: Eine Variable, die innerhalb einer Klasse vereinbart wurde, bezeichnet man auch als ein Attribut.
Beispiel:
6 class Otto {
7
static int punkte;
8
String text;
9
10
void machWas() {
11
int n = 17;
12
13
...
14
} // machWas
15
...
16 } // class Otto
// Ein Attribut
// Ein Attribut
// Kein Attribut,
// sondern lokale Variable der Methode machWas!
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 41
9. SU Fr 26.11.03
Frau Dr. Wolfers hält eine Probevorlesung über das Thema: "Effiziente Datenstrukturen und ihre Implementierung, eine Auswahl" (insgesamt ca. 60 Minuten).
Anschließend sollen von den teilnehmenden StudentInnen Evalutationsbögen ausgefüllt werden.
Beuth Hochschule, TB3-IN3
9. SU Fr 26.11.03
Wiederholungsfragen, 10. SU, Fr 03.12.10
Betrachten Sie die folgende Klassenvereinbarung:
1 class Carsten {
2
int
e1;
3
static String e2()
4
float
e3()
5
Carsten(int n)
6
static double e4;
7
static String e5;
8
Carsten()
9
String
e6()
10 }
{ ... }
{ ... }
{ ... }
{ ... }
{ ... }
1. Wie viele Elemente werden in der Klasse Carsten vereinbart?
2. Wie viele Konstruktoren werden in der Klasse Carsten vereinbart?
3. Wie heißen die Elemente, die zum Modulaspekt der Klasse Carsten gehören?
4. Wie heißen die Elemente, die zum Bauplanaspket der Klasse Carsten gehören?
5. Geben Sie einen Befehl an, der die Klasse Carsten als Modul benutzt.
6. Geben Sie einen Befehl an, der die Klasse Carsten als Bauplan benutzt.
7. Was ist ein Modul?
8. In Java gibt es zwei verschiedene Arten von Modulen. Welche der folgenden Dinge
sind (auch) Module:
Variablen, Objekte, Methoden, Anweisungen, Klassen, Pakete, Programme
WS10/11, Seite 42
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 43
Rückseite der Wiederholungsfragen, 10. SU, Fr 03.12.10
Ein wichtiger Informatiker:
Niklaus Wirth (geb. 1934 in Winterthur, Schweiz)
Diplom 1959 an der ETH Zürich,
M.Sc. 1960 an der Laval University, Canada und
1963 Ph.D. an der UCL Berkley.
Wirth erhielt 1984 den Turing-Award (die wohl höchste Auszeichnung für Informatiker).
Einige wichtige Programmiersprachen (die von Wirth entwickelten Sprachen sind fett hervorgehoben):
1955
1960
1965
1968
1970
1972
1975
1980
1980
1984
1990
1994
1995
Fortran, Cobol
Algol60
Algol-W
Algol68
C
Pascal
Modula
Modula-2
Ada
C++
Oberon
Java
Ada95
Erste höhere Programmiersprachen
Erste "akademische" Sprache
Besseres Algol
2-Stufen-Grammatiken., Bojen
Maschinennahe höhere Sprache
Strukturierte Programmierung
Module
Module, Nebenläufigkeit
Module, Nebenläufigkeit, Schablonen
C mit Klassen, Schablonen
Klassen
Maschinenunabhängigkeit
Klassen
Beuth Hochschule, TB3-IN3
9. SU Fr 26.11.03
WS10/11, Seite 44
Antworten zu den Wiederholungsfragen, 10. SU, Fr 03.12.10
Betrachten Sie die folgende Klassenvereinbarung:
1 class Carsten {
2
int
e1;
3
static String e2()
4
float
e3()
5
Carsten(int n)
6
static double e4;
7
static String e5;
8
Carsten()
9
String
e6()
10 }
{ ... }
{ ... }
{ ... }
{ ... }
{ ... }
1. Wie viele Elemente werden in der Klasse Carsten vereinbart?
6
2. Wie viele Konstruktoren werden in der Klasse Carsten vereinbart?
2
3. Wie heißen die Elemente, die zum Modulaspekt der Klasse Carsten gehören?
e2, e4, e5
4. Wie heißen die Elemente, die zum Bauplanaspket der Klasse Carsten gehören?
e1, e3, e6
5. Geben Sie einen Befehl an, der die Klasse Carsten als Modul benutzt.
11
12
13
String s = Carsten.e2();
double d = Carsten.e4;
if (Carsten.e5.equals("Hallo") ...
6. Geben Sie einen Befehl an, der die Klasse Carsten als Bauplan benutzt.
14
15
Carsten c01 = new Carsten(17);
Carsten c02 = new Carsten();
7. Was ist ein Modul?
Ein Behälter für Variablen, Unterprogramme, Typen, Module (und evtl. weitere Elemente), der
aus mindestens zwei Teilen besteht, einem öffentlichen (ungeschützten) Teil und einem privaten
(geschützten) Teil.
8. In Java gibt es zwei verschiedene Arten von Modulen. Welche der folgenden Dinge
sind (auch) Module:
Variablen, Objekte, Methoden, Anweisungen, Klassen, Pakete, Programme
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 45
10. SU Fr 03.12.10
A. Wiederholung
B. Organisation
Module mit vier Teilen
Module in Java (d.h. Klassen und Objekte) bestehen nicht nur aus zwei Teilen, sondern aus vier Teilen:
je einem öffentlichen, halb-öffentlichen, halb-privaten, privaten Teil.
Die Klasse Zaehler01 enthält nur primitive Attribute.
9.2 Eine Klasse mit Attributen eines Referenztyps
S. 211, Beispiel-04: Ein Bauplan für etwas kompliziertere Objekte
Wie viele Attribute werden in der Klasse Person00 vereinbart? (3)
Welche davon sind von einem Referenztyp? (vorName und nachName)
Was wird dem Ausführer in Zeile 18 befohlen? (Ein Objekt zu erzeugen und eine Variable zu erzeugen
und die Variable auf das Objekt zeigen zu lassen)
Und in Zeile 19? (Ebenso)
S.212, Bild 9.6: Zwei Person00-Objekte und drei String-Objekte
Wichtig: Die Person00-Objekte enthalten nur Referenzen auf String-Objekte (die Referenzen
<77>, <78> und <81>), die String-Objekte (die Module, auf die die Referenzen zeigen),
liegen ausserhalb der Person00-Objekte.
Vorteil: Das String-Objekt "Schulz" gibt es nur einmal, und die Attribute anna.nachName und
bert.nachName zeigen auf (ein und) dasselbe String-Objekt.
9.4 Klassische Fachbegriffe
In einer Klasse kann man Elemente (engl. members) und Konstruktoren (engl. constructors) vereinbaren.
Konstruktoren gelten also nicht als Elemente!
Die Elemente einer Klasse kann man (unter anderem) nach den folgenden Kriterien einteilen (und dann
die folgenden Gruppen unterscheiden):
Einteilungskriterium
Gruppen
nach Art
Attribut, Methode, Klasse, Schnittstelle
nach Aspektzugehörigkeit Klassenelemente (gehören zum Modulaspekt)
Objektelemente (gehören zum Bauplanaspekt)
nach Erreichbarkeit
öffentlich (public)
geschützt (protected)
paketweit erreichbar (--)
privat (private)
Wenn man ein Element einer Klasse kurz und präzise beschreibt, nennt man die Gruppenzugehörigkeiten in folgender Reihenfolge: Erreichbarkeit, Aspektzugehörigkeit, Art. Es gibt alle Kombinationen, z.B.
so:
Öffentliches Klassen-Attribut
Öffentliche Klassen-Methode
Öffentliche Klassen-Schnittstelle
etc.
Private Objekt-Methode
Privates Objekt-Attribut
Öffentliche Objekt-Schnittstelle
Wie viele solcher Kombinationen gibt es? (4 x 2 x 4 ist gleich 32)
Beuth Hochschule, TB3-IN3
10. SU Fr 03.12.10
WS10/11, Seite 46
S. 218, Beispiel-01: und Aufgabe-01:
Was ist n1?
Was ist n2?
Was ist inkrementA?
Was ist inkrementB?
Was ist Erreichbarkeit01?
etc.
(Ein öffentliches Klassen-Attribut)
(Ein privates Klassen-Attribut)
(Eine öffentliche Klassen-Methode)
(Eine private Klassen-Methode)
(Ein öffentlicher Konstruktor, kein Element)
9.5 Objektorientierte Programmierung
Angenommen, wir woll ein objektorientiertes Programm zur Verwaltung der Beuth Hochschule schreiben? Wie gehen wir vor?
1. Wir fragen: Was sind die wichtigen Objekte in der Beuth Hochschule?
Mögliche Antwort: StudentInnen, Hörsäle, Lehrveranstaltungen, ...
2. Wir fragen: Was sind die relevanten Daten einer StudentIn?
Mögliche Antwort: Name, Matrikel-Nr, Noten, ...
3. Wir fragen: Was sind die relevanten Tätigkeiten und Aktionen einer StudentIn?
Mögliche Antworten: Einschreiben, belegen, eine-Note-bekommen, ...
Für Hörsäle, Lehrveranstaltungen klären wir entsprechende Fragen wie 2. und 3.
4. Wir programmieren eine Klasse Namens StudentIn mit
Attributen namens name, matrikel_nr, noten, ... und
Methoden namens einschreiben, belegen, bekommtEineNote, ...
Jedes Objekt dieser Klasse repräsentiert eine StudentIn.
Für Hörsäle, Lehrveranstaltungen etc. programmieren wir entsprechend Klassen namens
Hoersaal, Lehrveranstaltung, ... etc.
Ziel: Die Objekte ausserhalb von Computern
(StudentInnen, Hörsäle, Lehrveranstaltungen, ...) und
die Objekte im Verwaltungscomputer
(StudentIn-Objekte, Hoersaal-Objekte, Lehrveranstaltung-Objekte, ...)
sollen sich möglichst direkt und offensichtlich entsprechen.
Zur Entspannung: Niklaus Wirth (siehe Rückseite der Wiederholungsfragen)
Wofür er gelobt wurde:
Er hat immer wieder von vorn angefangen
Wofür er getadelt wurde:
Er hat immer wieder von vorn angefangen
10 Ein paar Standardklassen und Methoden (S. 221)
10.1 Die Klasse String
String-Objekte repräsentieren unveränderbare Zeichenfolgen.
S. 222, Beispiel-01 bis
S. 225, Beispiel-06
kurz besprechen.
10.3 Die Klasse StringBuilder (S. 233)
StringBuilder-Objekte repräsentieren veränderbare Zeichenfolgen.
S. 233, Beispiel-01 (Kapazität und Länge)
Die Methoden insert und delete.
10.2 Objekte mit Hilfe von Bojen genauer verstehen (S. 228)
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 47
Wiederholungsfragen, 11. SU, Fr 10.12.10
Vereinbaren Sie eine Klasse namens Clarissa und innerhalb dieser Klassenvereinbarung folgende
Elemente und Konstruktoren:
1. Ein privates Klassenattribut namens anna vom Typ float mit dem Anfangswert 1.5.
2. Eine geschützte Klassenmethode namens bert mit dem Rückgabetyp float und zwei float-Parametern.
3. Eine paketweit sichtbare Klassenmethode namens caesar mit dem Rückgabetyp String und einem String-Parameter.
4. Ein paketweit erreichbares Objektattribut namens dora vom Typ String.
5. Eine öffentliche Objektmethode namens emil mit dem Rückgabetyp String und einem int-Parameter.
6. Ein geschütztes Objektattribut namens fritz vom Typ boolean.
7. Einen paketweit erreichbaren Standardkonstruktor, der die Attribute dora und fritz mit "XXX"
bzw. true initialisiert.
8. Einen öffentlichen Konstruktor mit einem String-Paramtern namens dora und einem boolean-Parameter namens fritz, der mit den Werten seiner Parameter die Attribute dora und fritz
initialisiert. Hinweis: Wenn Mißverständnisse zu befürchten sind, kann man das aktuelle Objekt (welches vom Konstruktor gerade initialisiert wird) immer mit this und seine Elemente a, b, ... mit
this.a, this.b, ... bezeichnen).
Was die Methoden bert, caesar und emil "machen" (d.h. die Befehle in ihren Rümpfen) können
Sie frei festlegen. Allerdings müssen Sie dabei die Java-Regeln für Methoden einhalten.
9. Was für einen Wert liefert der Ausdruck "Bückling".equals("Büffet")?
10. Was für einen int-Wert liefert der Ausdruck "Bückling".compareTo("Büffet"), einen
negativen int-Wert, den int-Wert 0 oder einen positiven int-Wert?
Beuth Hochschule, TB3-IN3
10. SU Fr 03.12.10
WS10/11, Seite 48
Rückseite der Wiederholungsfragen, 11. SU, Fr 10.12.10
Wie verändern sich die Kapazität und die Länge eines StringBuilder-Objekts wenn man wiederholt
weitere Zeichen einfügt (z.B. mit der Methode append)? Eine kleine Demo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// Datei CapacityAndLength.java
/* -----------------------------------------------------------------------Demonstriert die Laenge und die Kapazitaet eines StringBuilder-Objekts
------------------------------------------------------------------------ */
class CapacityAndLength {
// --------------------------------------------------------------------static public String myString(StringBuilder sb) {
// Liefert eine String-Darstellung von sb mit Laenge und Kapazitaet
int
len = sb.length();
int
cap = sb.capacity();
String inh = (len<=15) ? sb.toString() :
sb.substring(0, 6) + "..." + sb.substring(len-6);
return String.format(" %2d| %2d|%-15s|", cap, len, inh);
} // myString
// --------------------------------------------------------------------static public void main(String[] _) {
// Haengt ein paar Zeichenketten an einen StringBuilder sb an.
// Dabei werden die Ziffern 1, 2, 3 etc. je 5-Mal wiederholt.
// Gibt nach jedem Anhaengen die Kapazitaet, die Laenge und
// den Inhalt von sb aus.
StringBuilder sb = new StringBuilder("111");
// Ausgabe zum Bildschirm:
pln("+-+---+---+---------------+"); // +-+---+---+---------------+
pln("| |cap|len|Inhalt von sb: |"); // | |cap|len|Inhalt von sb: |
pln("+-+---+---+---------------+"); // +-+---+---+---------------+
pln("|A|" + myString(sb));
// |A| 19| 3|111
|
sb.append("11222223333344");
pln("|B|" + myString(sb));
// |B| 19| 17|111112...333344|
sb.append("444");
pln("|C|" + myString(sb));
// |C| 40| 20|111112...344444|
sb.append("5555566666");
pln("|D|" + myString(sb));
// |D| 40| 30|111112...677777|
sb.append("7777788888");
pln("|E|" + myString(sb));
// |E| 40| 40|111112...899999|
sb.append("9");
pln("|F|" + myString(sb));
// |F| 82| 41|111112...999990|
pln("+-+---+---+---------------+"); // +-+---+---+---------------+
pln("CapacityAndLength: Das war's erstmal!");
} // main
// --------------------------------------------------------------------// Eine Methode mit einem kurzen Namen:
static void pln(Object ob) {System.out.println(ob);}
// --------------------------------------------------------------------} // class CapacityAndLength
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 49
Antworten zu den Wiederholungsfragen, 11. SU, Fr 10.12.10
Vereinbaren Sie eine Klasse namens Clarissa und innerhalb dieser Klassenvereinbarung folgende
Elemente und Konstruktoren:
1. Ein privates Klassenattribut namens anna vom Typ float mit dem Anfangswert 1.5.
2. Eine geschützte Klassenmethode namens bert mit dem Rückgabetyp float und zwei float-Parametern.
3. Eine paketweit sichtbare Klassenmethode namens caesar mit dem Rückgabetyp String und einem String-Parameter.
4. Ein paketweit erreichbares Objektattribut namens dora vom Typ String.
5. Eine öffentliche Objektmethode namens emil mit dem Rückgabetyp String und einem int-Parameter.
6. Ein geschütztes Objektattribut namens fritz vom Typ boolean.
7. Einen paketweit erreichbaren Standardkonstruktor, der die Attribute dora und fritz mit "XXX"
bzw. true initialisiert.
8. Einen öffentlichen Konstruktor mit einem String-Paramtern namens dora und einem boolean-Parameter namens fritz, der mit den Werten seiner Parameter die Attribute dora und fritz
initialisiert. Hinweis: Wenn Mißverständnisse zu befürchten sind, kann man das aktuelle Objekt (welches vom Konstruktor gerade initialisiert wird) immer mit this und seine Elemente a, b, ... mit
this.a, this.b, ... bezeichnen).
1 class Clarissa {
2
private
static float
anna = 1.5F; // Das F ist notwendig!
3
protected static float
bert (float f1, float f2) {return f1+f2;}
4
static String caesar(String s)
{return s+s;}
5
6
String dora;
7
public
String emil(int n) {return "Ergebnis: " + n;}
8
protected
boolean fritz;
9
10
Clarissa() {
11
dora = "XXX";
12
fritz = true;
13
}
14
15
public Clarissa(String dora, boolean fritz) {
16
this.dora = dora;
17
this.fritz = fritz;
18
}
19 }
9. Was für einen Wert liefert der Ausdruck "Bückling".equals("Büffet")?
Den boolean-Wert false.
10. Was für einen int-Wert liefert der Ausdruck "Bückling".compareTo("Büffet"), einen
negativen int-Wert, den int-Wert 0 oder einen positiven int-Wert?
Einen negativen int-Wert (genauer: den Wert 'c' - 'f' gleich -3)
Beuth Hochschule, TB3-IN3
11. SU Mo 10.12.10
WS10/11, Seite 50
11. SU Mo 10.12.10
A. Wiederholung
B. Organisation: Die Vorlesung am Fr 28.02.1011 findet nicht hier im B554 statt, sondern
im Raum C113. Das ist im Haus Grashof (im Haus "mit den vielen Stockwerken").
Die Online-Dokumentation der Java-Standardklassen
Spätestens in der nächsten Übung sollte jeder damit anfangen, in dieser Online-Dokumentation Informationen über Standard-Klassen wie String, StringBuilder, Integer, ArrayList<K>, ... etc.
nachzusehen.
Suchmaschinen wie Yahoo und Google finden die richtige Dokumentation, wenn man z.B. nach
java 6 doc api
sucht. Achtung: Es gibt viele falsche (ältere) Versionen dieser Dokumentation!
10.3 Die Klasse StringBuilder
Zeichenketten, die man nicht verändern will, sollte man durch String-Objekte darstellen.
Zeichenketten, die man
verändern will, sollte man durch StringBuilder-Objekte darstellen.
Ein StringBuilder-Objekt besteht im Kern aus einer internen Reihung von char-Variablen.
Diese Reihung ist privat, und man kann nicht direkt darauf zugreifen, nur indirekt über öffentliche Objekt-Methoden wie charAt, append, insert, delete, ... etc.
Jedes StringBuilder-Objekt hat in jedem Moment eine
Länge ("Wie viele char-Werte enthält die interne Reihung gerade?") und eine
Kapazität ("Für wie viele char-Werte hat die interne Reihung Platz?").
Die Kapazität wird meistens vom Ausführer verwaltet.
Das Demoprogramm CapacityAndLength auf der Rückseite der Wiederholungsfragen besprechen.
Ein kleiner, informeller Zeitvergleich (mit einem Pentium 2.52 GHz, Windows XP, Java 6, Dez 2010):
A append : pro Sekunde: 15.656.250
B insert : pro Sekunde: 5.637
C konkat : pro Sekunde: 1.333
append und insert sind StringBuilder-Methoden, konkat bezeichnet hier das Konkatenieren
von String-Objekten mit dem Plus-Operator +.
Die in der Klasse StringBuilder vereinbarte equals-Methode vergleicht
die Werte von StringBuilder-Variablen, nicht die Zielwerte!
Zum Vergleich: Die in der Klasse String vereinbarte equals-Methode vergleicht
die Zielwerte von String-Variablen, nicht die Werte!
10.4 Die Klasse ArrayList<K>
Eine gewöhnliche Klasse definiert einen Typ: Die Klasse String definiert den einen Typ String, die
Klasse Integer definiert den einen Typ Integer etc.
Die Klasse ArrayList ist eine generische Klasse (erkennbar an den Spitzen Klammern <K>), sie definiert unbegrenzt viele Typen, z.B. ArrayList<Integer>, ArrayList<StringBuilder>,
ArrayList<String>,
ArrayList<ArrayList<String>>,
ArrayList<ArrayList<ArrayList<String>>>, ...
Außerdem ist ArrayList ein Sammlungstyp. Das bedeutet: In einem Objekt eines ArrayList-Typs
kann man andere Objekte sammeln (d.h. einfügen, suchen, wieder entfernen etc.).
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 51
Für den Typ-Parameter K zwischen den spitzen Klammern darf man nur Referenztypen einsetzen, keine
primitiven Typen. Mit anderen Worten: Primitive Werte kann man nicht sammeln.
Aber: Für jeden der 8 primitiven Typen gibt es eine sog. Hüllklasse.
S. 91, unten
Einen int-Wert in ein Integer-Objekt umwandeln oder umgekehrt,
ein Integer-Objekt in einen int-Wert umwandeln
geht ganz einfach (mit einem Cast-Befehl wie (int) bzw. (Integer)) und an vielen Stellen eines
Java-Programms führt der Ausführer solche Umwandlungen automatisch durch (ohne ausdrücklichen
Befehl des Programmierers).
Statt primitive Werte direkt zu sammeln (was nicht erlaubt ist) kann man
die entsprechenden Hüllobjekte sammeln.
Vergleich zwischen Reihungen und Sammlungen:
S. 243, Tabelle
Beuth Hochschule, TB3-IN3
11. SU Mo 10.12.10
WS10/11, Seite 52
Wiederholungsfragen, 12. SU, Fr 17.12.10
1. Sie wollen in einem Java-Programm eine Zeichenkette benutzen. Wann realisieren Sie diese
Zeichenkette als String-Objekt und wann als StringBuilder-Objekt?
Betrachten Sie die folgende Befehle:
1
2
3
StringBuilder sb = new StringBuilder(EM.liesString());
int n1 = sb.length();
int n2 = sb.codePointCount(0, s.b.length());
2. Was steht nach Ausführung dieser Befehle in der Variablen n1?
Die Anzahl der Komponenten von sb? Die Anzahl der Zeichen von sb? Die Anzahl der int-Variablen
in sb? Die Anzahl der char-Variablen in sb? Die Zahl 0, weil sb noch leer ist?
3. Und was steht in der Variablen n2?
Die Anzahl der Komponenten von sb? Die Anzahl der Zeichen von sb? Die Anzahl der int-Variablen
in sb? Die Anzahl der char-Variablen in sb? Die Zahl 0, weil sb noch leer ist?
4. Angenommen, s ist ein String- oder StringBuilder-Objekt der Länge 10. Wie viele Zeichen
enthält s dann mindestens und wie viele höchstens?
Zur Erinnerung: Eine Variable besteht aus 2 bis 4 Teilen.
5. Angenommen, s1 und s2 sind String-Variablen. Welche Teile dieser Variablen werden durch den
Vergleichsbefehl s1.equals(s2) verglichen?
6. Angenommen, s1 und s2 sind StringBuilder-Variablen. Welche Teile dieser Variablen werden
durch den Vergleichsbefehl s1.equals(s2) verglichen?
7. Angenommen, s1 und s2 sind Variablen von irgendeinem Typ
(z.B. String oder StringBuilder oder int oder double oder ...).
Welche Teile dieser Variablen werden durch den Vergleichsbefehl s1==s2 verglichen?
8. Ein StringBuilder-Objekt sb besteht "im Kern" aus einer privaten Reihung rc
von char-Variablen. Was versteht man unter der Kapazität von sb?
9. Wie viele Typen definiert die generische Klasse ArrayList<K>?
Geben Sie drei Beispiele für solche ArrayList-Typen an.
10. Geben Sie zwei Unterschiede zwischen Reihungen (engl. arrays) und
Sammlungen (engl. collections) an.
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 53
Antworten zu den Wiederholungsfragen, 12. SU, Fr 17.12.10
1. Sie wollen in einem Java-Programm eine Zeichenkette benutzen. Wann realisieren Sie diese
Zeichenkette als String-Objekt und wann als StringBuilder-Objekt?
Als StringBuilder wenn die Zeichenkette wiederholt verändert werden soll, sonst als String.
Betrachten Sie die folgende Befehle:
1
2
3
StringBuilder sb = new StringBuilder(EM.liesString());
int n1 = sb.length();
int n2 = sb.codePointCount(0, s.b.length());
2. Was steht nach Ausführung dieser Befehle in der Variablen n1?
Die Anzahl der Komponenten von sb? Die Anzahl der Zeichen von sb? Die Anzahl der int-Variablen
in sb? Die Anzahl der char-Variablen in sb! Die Zahl 0, weil sb noch leer ist?
3. Und was steht in der Variablen n2?
Die Anzahl der Komponenten von sb? Die Anzahl der Zeichen von sb! Die Anzahl der int-Variablen
in sb? Die Anzahl der char-Variablen in sb? Die Zahl 0, weil sb noch leer ist?
4. Angenommen, s ist ein String- oder StringBuilder-Objekt der Länge 10. Wie viele Zeichen
enthält s dann mindestens und wie viele höchstens?
Mindestens 5, höchstens 10.
Zur Erinnerung: Eine Variable besteht aus 2 bis 4 Teilen.
5. Angenommen, s1 und s2 sind String-Variablen. Welche Teile dieser Variablen werden durch den
Vergleichsbefehl s1.equals(s2) verglichen?
Die Zielwerte.
6. Angenommen, s1 und s2 sind StringBuilder-Variablen. Welche Teile dieser Variablen werden
durch den Vergleichsbefehl s1.equals(s2) verglichen?
Die Werte.
7. Angenommen, s1 und s2 sind Variablen von irgendeinem Typ
(z.B. String oder StringBuilder oder int oder double oder ...).
Welche Teile dieser Variablen werden durch den Vergleichsbefehl s1==s2 verglichen?
Die Werte.
8. Ein StringBuilder-Objekt sb besteht "im Kern" aus einer privaten Reihung rc
von char-Variablen. Was versteht man unter der Kapazität von sb?
Die Länge der Reihung rc (d.h. rc.length)
9. Wie viele Typen definiert die generische Klasse ArrayList<K>?
Geben Sie drei Beispiele für solche ArrayList-Typen an.
Die Klasse ArrayList<K> definiert unendlich viele Typen, z.B. die Typen
ArrayList<String>, ArrayList<Integer>, ArrayList<ArrayList<Integer>>, ...
10. Geben Sie zwei Unterschiede zwischen Reihungen (engl. arrays) und
Sammlungen (engl. collections) an.
- Reihungen sind aus Beton, (die meisten) Sammlungen aus Gummi
- Reihungen können primitive Werte enthalten, Sammlungen nur Objekte
Beuth Hochschule, TB3-IN3
12. SU Fr 17.12.10
WS10/11, Seite 54
12. SU Fr 17.12.10
A. Wiederholung
B. Organisation: Die Vorlesung am Fr 28.01.1011 findet nicht hier im B554 statt, sondern
im Raum C113. Das ist im Haus Grashof (im Haus "mit den vielen Stockwerken").
12 Klassen erweitern (beerben) und Typgrafen
Motivation dafür, eine Klasse zu erweitern (zu beerben)
S. 278, Beispiel-01: Die Klasse Person01 ("eine alte und bewährte Klasse")
S. 278, Bild 12.1 Der Modul Person01
S. 279, Bild 12.2 Ein Person01-Objekt
S. 280, Beispiel-02: Die Klasse Person02 (eine Erweiterung von Person01)
S. 281, Bild 12.3 Der Modul Person02
S. 281, Bild 12.4 Ein Person02-Objekt
Und jetzt die volle Wahrheit:
S. 282, Bild 12.5 Der Modul Person02 (volle Wahrheit)
S. 283, Bild 12.6 Ein Person02-Objekt (volle Wahrheit)
Zur Entspannung: Christian Morgenstern (1871-1914, München-Meran): Anto-Logie
Die Evolution großer Tiere und Zahlen:
Im Anfang lebte, wie bekannt, als größter Säuger der Gig-ant.
...
12.2 Allgemeine Regeln zum Beerben und Vererben (S. 283)
Begriffe:
Direkte Oberklasse (genau eine), direkte Unterklassen (0 oder mehr)
Oberklassen, Unterklassen
S. 285, Bild 12.7 Ein Typgraf
12.3. Ein größeres Beispiel für Beerbung (S. 286)
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 55
Wiederholungsfragen, 13. SU, Fr 07.01.11
1. Zeichnen Sie (vorzugsweise mit Bleistift, auf ein separates, ausreichend großes Blatt) den Typgraf, in
dem folgende Klassen vorkommen: Object, E01Punkt, E01Rechteck, E01Quadrat,
E01Ellipse, E01Kreis, Punkt3D, Quader, Würfel, Kugel.
2. An wie viele direkte Unterklassen darf eine Klasse ihre Elemente vererben?
3. Wie viele direkte Oberklassen darf eine Java-Klasse beerben?
4. Wie viele Unterklassen kann eine Klasse haben? Und wieviele Oberklassen?
5. Welche Dinge, die in einer Klasse vereinbart werden können, werden nicht vererbt/geerbt?
6. Was bewirkt der erste Befehl im Rumpf von jedem Konstruktor (unabhängig davon, ob der Programmierer diesen Befehl ausdrücklich hinschreibt oder ob der Ausführer ihn stillschweigend hinzufügt)?
7. Zu der Regel, die in der vorigen Frage erwähnt wurde, gibt es eine einzige Ausnahme. Welche?
8. Was passiert, wenn der Programmierer eine Klasse vereinbart, darin aber
keinen Konstruktor vereinbart?
9. Wann und wo findet die Klausur statt?
Beuth Hochschule, TB3-IN3
12. SU Fr 17.12.10
WS10/11, Seite 56
Antworten zu den Wiederholungsfragen, 13. SU, Fr 07.01.11
1. Zeichnen Sie (vorzugsweise mit Bleistift, auf ein separates, ausreichend großes Blatt) den Typgraf, in
dem folgende Klassen vorkommen: Object, E01Punkt, E01Rechteck, E01Quadrat,
E01Ellipse, E01Kreis, Punkt3D, Quader, Würfel, Kugel.
Object
|
+--- E01Punkt
|
+--- E01Rechteck
|
|
|
+--- E01Quadrat
|
+--- E01Ellipse
|
|
|
+--- E01Kreis
|
+--- Punkt3D
|
+--- Quader
|
|
|
+--- Wuerfel
|
+--- Kugel
2. An wie viele direkte Unterklassen darf eine Klasse ihre Elemente vererben?
An beliebig viele (0, 1, 2, ...)
3. Wie viele direkte Oberklassen darf eine Java-Klasse beerben?
Genau eine
4. Wie viele Unterklassen kann eine Klasse haben? Und wieviele Oberklassen?
Belibig viele Unterklassen, belieb viele Oberklassen.
5. Welche Dinge, die in einer Klasse vereinbart werden können, werden nicht vererbt/geerbt?
Konstruktoren
6. Was bewirkt der erste Befehl im Rumpf von jedem Konstruktor (unabhängig davon, ob der Programmierer diesen Befehl ausdrücklich hinschreibt oder ob der Ausführer ihn stillschweigend hinzufügt)?
Er ruft einen Konstruktor der direkten Oberklasse auf.
7. Zu der Regel, die in der vorigen Frage erwähnt wurde, gibt es eine einzige Ausnahme. Welche?
Der erste Befehl im (einzigen) Konstruktor der Klasse Object ruft keinen Konstruktor der direkten Oberklasse auf, weil die Klasse Object keine direkte Oberklasse hat.
8. Was passiert, wenn der Programmierer eine Klasse vereinbart, darin aber
keinen Konstruktor vereinbart?
Der Ausführer "schenkt" der Klasse einen Standardkonstruktor
(d.h. einen Kostruktor mit 0 Parametern), dessen Rumpf leer ist.
9. Wann und wo findet die Klausur statt?
Am Mo 07.02.2011, ab 14 Uhr, im Raum B101.
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 57
13. SU Fr 07.01.11
A. Wiederholung
B. Organisation
Pakete (die nichts mit Weihnachten zu tun haben)
Motivation: Sie wollen ein großes Java-Programm entwickeln, einige der Klassen aber nicht selbst
schreiben, sondern von verschiedenen Firmen dazukaufen. Natürlich hat jede dieser Firmen mindestens
eine Klasse namens Logging und zwei namens Test vereinbart und Sie brauchen alle diese Loggingund Test-Klassen. Wie kann man in solchen Situationen Mehrdeutigkeiten verhindern?
Mit Paketen!
Def.: Ein Paket ist ein Behälter für Klassen, Schnittstellen und weitere Pakete.
D.h. man kann Pakete schachteln (packages can be nested).
Anmerkung: Ein Paket ist kein Modul, weil die Bedingung mit dem öffentlichen und dem privaten Teil
nicht vollständig erfüllt ist (geschachtelte Pakete sind immer öffentlich und können nicht als privat gekennzeichnet werden).
Fachbegriffe: Top-Paket, Name eines Pakets, voller Name eines Pakets, Wald von Paketen.
Paketregel-1: Jede Klasse gehört zu genau einem Paket. (S. 425)
S. 426, Beispiel-01
S. 426, Beispiel-02
Damit hat auch jede Klasse (nicht nur einen Namen sondern auch) einen vollen Namen:
Der volle Name des Paketes gefolgt vom (einfachen) Namen der Klasse.
Das namenlose Paket. Wird nur "beim Lernen und Ausprobieren" verwendet. "Ernsthafte Klassen" gehören alle zu einem Paket.
Erreichbarkeit von Klassen in Paketen-mit-Namen
Eine Klasse, die zu einem Paket gehört, ist entweder öffentlich (public) oder paketweit erreichbar.
Anmerkung: Eine innerhalb einer anderen Klasse vereinbarte Klasse kann
öffentlich, geschützt, paketweit erreichbar oder privat sein.
Anmerkung: Die Klassen im namenlosen Paket sind immer nur paketweit erreichbar, egal ob ihre Vereinbarung mit public beginnt oder nicht.
Grund: Klassen in einem Paket-mit-Namen können nicht auf Klassen in namenlosen Paket zugreifen,
weil
1. steht in einer Klasse K in einem Paket P z.B. der einfache Klassenname MeineTestKlasse, dann
bezeichet der ein Klasse im Paket P (sonst ist er falsch).
2. import-Befehle ohne Paket-Namen, z.B.
import MeineTestKlasse;
sind (seit Java 1.4) nicht mehr erlaubt.
Grundlegende Vorstellung: Klassen haben mit zwei Baumstrukturen zu tun:
1. Dem Baum aller Klassen mit der beerbt-Relation
2. Dem Paket-Wald, in dem jede Klasse zu einem Paket gehört
Wichtig-1: Diese beiden Strukturen sind völlig unabhängig voneinander
Beispiel: Sei K2 eine Unterklasse von K1. Dann kann man K1 und K2 in dasselbe Paket tun, oder K1 in
ein "Oberpaket" und K2 in ein "Unterpaket" tun, oder umgekehrt: K1 in ein "Unterpaket" und K2 in ein
"Oberpaket", oder K1 in ein Paket P1 und K2 in ein anderes Paket P2, wobei die Pakete P1 und P2
nichts miteinander zu tun haben.
Beuth Hochschule, TB3-IN3
13. SU Fr 07.01.11
WS10/11, Seite 58
Wichtig-2: Klassen, die sich in einem gemeinsamen Paket befinden, haben "Privilegien beim Zugriff
auf einander", denn für sie sind auch paketweit erreichbare Elemente und Konstruktoren erreichbar.
S. 434, Bild 17.1: Fünf Klassen in zwei Paketen
K10 ist hier die "Zentralklasse", die anderen stehen "in allen möglichen Verhältnissen" zu K10:
im selben Paket
wie K10
ja
ja
nein
nein
beerbt
K10
ja
nein
ja
nein
Klasse
K11
K12
K21
K22
In der Klasse K10 sind 4 Elemente vereinbart. Wie heißen diese Elemente und warum heißen sie so?
Dargestellt wird, welche dieser 4 Elemente aus K10 in den übrigen 4 Klassen erreichbar sind (z.B. ist in
K22 nur noch das Element publicE erreichbar.
Eindeutigkeit von vollen Paketnamen
Wie schafft man es, dass die vollen Namen aller Java-Klassen eindeutig sind?
Indem man Internetadressen (von Firmen) als Paketnamen verwendet (wobei man die Reihenfolge der
einzelenen Bestandteile der Adresse umdreht von klein-zuerst auf groß-zuerst), z.B. so:
de.beuth_hochschule.fb6.goethe
de.beuth_hochschule.fb6.pr2_mb2
org.junit.rules
org.junit.runners
com.sun.crypto.provider
com.sun.java.browser.plugin2.liveconnect.v1
Zur Entspannung: Wie lernt man? Ein simples Modell.
Angenommen, Sie sollen 1024 kleine Einzelteile ("Perlen der Länge 1 Millimeter") zu einer ungefähr
einen Meter langen Kette zusammenfügen. Dann können Sie folgendermaßen vorgehen:
1. Sie verbinden je zwei Einzelteile zu einem 2-er-Teil. Das sind 500 Arbeitsschritte. Sie sehen kaum
einen Fortschritt, weil ein 2-er-Teil nicht viel länger aussieht als ein Einzelteil.
2. Sie verbinden je zwei 2-er-Teile zu einem 4-er-Teil. Das sind 250 Arbeitsschritte. Immer noch ist
kaum ein Fortschritt zu sehen, denn die 4-er-Teile sind noch sehr kurz im Vergleich zum ein Meter langen Endergebnis.
3. Sie verbinden je zwei 4-er-Teile zu einem 8-er-Teil. 125 Arbeitsschritte.
...
9. Sie verbinden je zwei 256er-Teile zu einem 512er-Teil (2 Arbeitsschritte). Die Ergebnisse sind immer
noch viel kürzer als das Endergebnis.
10. Sie verbinden zwei 512er-Teile zu einem 1024er-Teil. Das ist nur ein einziger Arbeitsschritt, aber
der Fortschritt ist beeindruckend: Aus 50 Zentimeter langen Teilen wird ein 100 Zentimeter langes Ganzes.
Falls beim Lernen in unseren Gehirnen etwas (entfernt) Ähnliches abläuft, dann muss man sehr geduldig
sein: Erst ganz am Ende eines komplizierten Lernvorgangs sieht man einen "großen Fortschritt". Der
letzte Schritt eines Lernvorgangs ist manchmal ein so genanntes Aha-Erlebnis.
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 59
Wiederholungsfragen, 14. SU, Fr 14.01.11
1. Schon in der ersten Version von Java gab es Pakete (engl. packages). Welches Problem wollte man
damit lösbar machen?
2. Was kann ein Paket alles enthalten?
3. Was ist ein Top-Paket?
4. Was für eine (in der Informatik häufig vorkommende) Struktur bildet ein Top-Paket mit allem, was
darin enthalten ist?
5. Was für eine Struktur bilden alle Pakete zusammen?
6. Angenommen, Sie haben eine Firma mit der Internetadresse www.MacroHard.com. Wie sollte das
Paket heißen, in dem sich alle von Ihrer Firma entwickelten Pakete, Klassen und Schnittstellen befinden?
Zur Erinnerung: Jede Klasse, jede Schnittstelle und jedes Paket hat einen einfachen Namen (z.B.
String oder Serializable oder javax)
7. Woraus besteht der volle Name eines Top-Paketes? (Die Antwort ist ziemlich einfach)
8. Woraus besteht der volle Name eines Paketes p1, welches sich in einem Paket p2 befindet?
9. Woraus besteht der volle Name einer Klasse k1, die zu einem Paket p1 gehört?
10. Angenommen, eine öffentliche (public) Klasse k1 gehört zu einem Paket p1 und in der Klasse k1
wird ein geschütztes Element (protected member) namens otto vereinbart. Beschreiben Sie alle
Klassen, innerhalb derer man auf otto zugreifen kann.
Beuth Hochschule, TB3-IN3
13. SU Fr 07.01.11
WS10/11, Seite 60
Rückseite der Wiederholungsfragen, 14. SU, Fr 14.01.11
Klassische (d.h. veraltete) Programmstruktur mit selbsgebauter Ausnahmebehandlung
Ein paar Befehle für den Normalfall
Ein paar Befehle für Ausnahmefälle
Ein paar Befehle für den Normalfall
Ein paar Befehle für Ausnahmefälle
...
Dieses Zebramuster erschwert das Lesen und Verstehen der Befehle.
Neuere Programmstruktur mit speziellen Ausnahme-Behandlungsbefehlen
Neuere Programmiersprachen (z.B. C++, Ada, Java, C# etc.) enthalten spezielle Befehle zur Behandlung
von Ausnahmefällen.
Diese Befehle sollen es dem Programmierer möglich machen, die Befehle für den Normalfall zu trennen
von den Befehlen für die einzelnen Ausnahmefälle. Anstelle eines Zebra-Musters kann man damit (stark
vereinfacht dargestellt) etwa folgendes Muster realisieren:
Ein paar Befehle für den Normalfall
Ein paar Befehle für den Normalfall
...
Ein paar Befehle für Ausnahmefälle
Ein paar Befehle für Ausnahmefälle
...
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 61
Antworten zu den Wiederholungsfragen, 14. SU, Fr 14.01.11
1. Schon in der ersten Version von Java gab es Pakete (engl. packages). Welches Problem wollte man
damit lösbar machen?
Man will in einem Java-Programm Klassen verwenden, die von verschiedenen Firmen entwickelt
wurden und zum Teil gleich heißen (z.B. drei Klassen namens Test). Pakete machen es möglich,
dass man solche Klassen problemlos in einem Programm verwenden kann (weil die vollen Namen
der Klassen sich unterscheiden).
2. Was kann ein Paket alles enthalten?
Klassen, Schnittstellen und Pakete.
3. Was ist ein Top-Paket?
Ein Paket, welches nicht in einem anderen Paket enthalten ist.
4. Was für eine (in der Informatik häufig vorkommende) Struktur bildet ein Top-Paket mit allem, was
darin enthalten ist?
Einen Baum.
5. Was für eine Struktur bilden alle Pakete zusammen?
Einen Wald.
6. Angenommen, Sie haben eine Firma mit der Internetadresse www.MacroHard.com. Wie sollte das
Paket heißen, in dem sich alle von Ihrer Firma entwickelten Pakete, Klassen und Schnittstellen befinden?
com.macrohard
Zur Erinnerung: Jede Klasse, jede Schnittstelle und jedes Paket hat einen einfachen Namen (z.B.
String oder Serializable oder javax)
7. Woraus besteht der volle Name eines Top-Paketes? (Die Antwort ist ziemlich einfach)
(Nur) aus dem einfachen Namen des Pakets (z.B. javax).
8. Woraus besteht der volle Name eines Paketes p1, welches sich in einem Paket p2 befindet?
Aus dem vollen Namen von p2, gefolgt von einem Punkt ".", gefolgt vom einfachen Namen von p1.
9. Woraus besteht der volle Name einer Klasse k1, die zu einem Paket p1 gehört? (z.B. java.util.logging)
Aus dem vollen Namen von p1, gefolgt von einem Punkt ".", gefolgt vom einfachen Namen von k1
(z.B. java.lang.String)
10. Angenommen, eine öffentliche (public) Klasse k1 gehört zu einem Paket p1 und in der Klasse k1
wird ein geschütztes Element (protected member) namens otto vereinbart. Beschreiben Sie alle
Klassen, innerhalb derer man auf otto zugreifen kann.
Alle Klassen, die zum Paket p1 gehören, und alle Klassen, die k1 beerben.
Beuth Hochschule, TB3-IN3
14. SU Fr 14.01.11
WS10/11, Seite 62
14. SU Fr 14.01.11
A. Wiederholung
B. Organisation
Ausnahmen
Bei sehr vielen Programmen kann man zwei Arten von Befehlsfolgen unterscheiden:
Solche für den Normalfall
Solche für Ausnahmefälle
Dabei ist Ausnahmefall kein exakt definierter Begriff, kann aber durch typische Beispiele erläutert werden, siehe Buch, S. 362, unten.
Erfahrung vieler Programmierer:
1. Die Befehlesfolge für den Normalfall ist oft relativ einfach und relativ kurz.
2. Die Befehlsfolgen für die verschiedenen Ausnahmefälle sind zahlreich, relativ schwer zu schreiben
("Was soll man bloß machen, wenn ein bestimmte Ausnahmefall eintritt?") und lang.
In älteren Programmiersprachen (Fortran, Cobol, ..., bis etwa C und Pascal) gab es keine speziellen Befehle zum Behandeln von Ausnahmefällen. Programme in diesen Sprachen bilden deshalb häufig eine
Art Zebra-Muster:
Ein paar Befehle für den Normalfall
Ein paar Befehle für Ausnahmefälle
Ein paar Befehle für den Normalfall
Ein paar Befehle für Ausnahmefälle
...
Die Befehle für den Normalfall waren häufig Aufrufe von Unterprogrammen. Nach dem Aufruf eines
Unterprogramms wurde dann geprüft, ob während der Ausfühung eine Ausnahme erkannt wurde.
Diese Zebramuster erschweren das Lesen und Verstehen der Befehle. Um zu erkennen, was im Normalfall passiert, muss man bestimmte Befehle berücksichtigen und andere überspringen. Und für die Ausnahmefälle gilt das Gleiche.
Neuere Programmiersprachen (z.B. C++, Ada, Java, C# etc.) enthalten spezielle Befehle zur Behandlung
von Ausnahmefällen.
Diese Befehle sollen es dem Programmierer möglich machen, die Befehle für den Normalfall zu trennen
von den Befehlen für die einzelnen Ausnahmefälle. Anstelle eines Zebra-Musters kann man damit (stark
vereinfacht dargestellt) etwa folgendes Muster realisieren:
Ein paar Befehle für den Normalfall
Ein paar Befehle für den Normalfall
...
Ein paar Befehle für Ausnahmefälle
Ein paar Befehle für Ausnahmefälle
...
In Java gibt es zum Behandlen von Ausnahmen folgende Konstrukte:
- Ausnahmeklassen (alle Unterklassen der Klasse Throwable)
- Ausnahmeobjekte (Objekte von Ausnahmeklassen)
- den throw-Befehl (mit dem man ein Ausnahmeobjekt werfen kann)
- die throws-Klausel ("Vorsicht, Ausnahmen" etwa wie "Vorsicht, Steinschlag")
- den try-catch-Befehl (evtl. verlängert zu try-catch-finally)
Statt einer präzisen Definition: Beispiele für typische Ausnahmen: S. 362/363
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 63
S. 363, Beispiel-01: Ein gefährlicher Befehl: Die Ganzzahldivision
S. 364, Beispiel-02: Ein gefährlicher Befehl: parseInt
S. 365, Beispiel-01: Eine gefährliche Methode
S. 366, Beispiel-02: Ausnahmen fangen und behandeln (mit einem try-catch-Befehl)
Ein try-Block kann auf zwei Weisen zu Ende gehen:
Wenn keine Ausnahme auftritt: normales Ende.
Wenn eine Ausnahme auftritt: Abbruch des try-Block und ... .
Zur Entspannung:
Was ist grundsätzlich falsch an verbreiteten Betriebssystemen wie Windows und Linux?
Ältere Betriebssysteme wie Windows und Linux sind grundsätzlich unsicher, weil sie in C geschrieben
sind und im Prinzip die Installation beliebiger Programme erlauben, auch solcher, die "sehr böse Befehle enthalten". Es ist sehr aufwendig, sich vor solchen Programmen zu schützen.
Android ist teilweise in C geschrieben, erlaubt aber grundsätzlich nur die Installation von Java-Programmen. Java enthält keine "bösen Befehle". Android ist quelloffen (open source).
Moral: Zwischen die Hardware und Programme gehört eine Sofware-Schicht (HAL: Hardware Abstraction Layer, oder eine Virtuelle Maschine, oder eine Sicherheits-Schicht).
iOS ist ein Unix-Nachfolger und in C geschrieben. Das iOS wird vollständig von der Firma Apple kontrolliert. Unter iOS laufen nur Programme, die von Apple "genehmigt" wurden. Apple hat ein starkes Interesse daran, nur "sichere Programme" zu genehmigen. Diese starke Kontrolle ist zweischneidig.
Beuth Hochschule, TB3-IN3
14. SU Fr 14.01.11
WS10/11, Seite 64
Wiederholungsfragen, 15. SU, Fr 21.01.11
1. Was passiert, wenn der Java-Ausführer folgende Befehle ausführt:
1
2
double a = 17.5, b = -0.0;
double c = a / b;
2. Was passiert, wenn der Java-Ausführer folgende Befehle ausführt:
3
4
int
int
d = 17, e = 0;
f = d / e;
3. Was passiert, wenn der Java-Ausführer den folgenden Befehl ausführt:
5
pln(Integer.parseInt("-123"));
4. Was passiert, wenn der Java-Ausführer den folgenden Befehl ausführt:
6
pln(Integer.parseInt("+123"));
5. Woraus besteht ein try-catch-Befehl? Geben Sie insbesondere genau an,
wie oft die einzelnen Bestandteile vorkommen dürfen.
6. Welche Frage stellt sich der Java-Ausführer immer dann, wenn er gerade eine Ausnahme geworfen
hat? (Die Frage ist ein bisschen kompliziert, aber da der Java-Ausführer sie sich häufig stellt, sollte man
sie genau kennen)
7. Was macht der Ausführer, wenn die Antwort auf die Frage (siehe 5.) "nein" ist?
8. Was macht der Ausführer, wenn die Antwort auf die Frage (siehe 5.) "ja" ist?
9. Was passiert, wenn (während der Ausführung eines Java-Programms) eine Ausnahme geworfen, aber
nirgends gefangen wird?
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 65
Rückseite der Wiederholungsfragen, 15. SU, Fr 21.01.11
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// Datei Window01.java
/* -----------------------------------------------------------------------Dieses Grabo-Programm zeigt ein Fenster mit einem Knopf darin.
------------------------------------------------------------------------ */
import java.awt.Frame;
import java.awt.Button;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
class Window01 extends Frame {
// --------------------------------------------------------------------// Ein Listener fuer den Fenster-Schliessen-Knopf:
static class ProgTerminator extends WindowAdapter {
public void windowClosing(WindowEvent we) {
pln("Dies Programm beendet sich!");
System.exit(0);
// Programm beenden
}
} // class ProgTerminator
static ProgTerminator arnold = new ProgTerminator();
// --------------------------------------------------------------------// Ein Listener fuer den knopf:
static int nr = 1;
static class AktionsBehandler implements ActionListener {
public void actionPerformed(ActionEvent ae) {
pln("Jetzt mach ich gleich was!");
Button b = (Button) ae.getSource();
// Ereignis-Quelle?
b.setLabel("Knopf " + nr++);
// Text des Knopfes aendern
}
} // class AktionsBehandler
static AktionsBehandler alfred = new AktionsBehandler();
// --------------------------------------------------------------------public Window01(String titel) {
super(titel);
this.setBounds(400, 300, 200, 100);
// Groesse und Pos. Fenster
Button knopf = new Button("Knopf " + nr++); // Knopf erzeugen
knopf.addActionListener(alfred);
// ActionListener anmelden
this.add(knopf);
// Knopf ins Fenster
this.addWindowListener(arnold);
// WindowListener anmelden
setVisible(true);
} // Konstruktor Window01
// --------------------------------------------------------------------static public void main(String[] _) {
pln("Window01: Jetzt geht es los!");
Window01 w = new Window01("Mein Fenster"); // Ein Window01 erzeugen
pln("Window01: Das war's erstmal!");
} // main
// --------------------------------------------------------------------// Eine Methode mit einem kurzen Namen:
static void pln(Object ob) {System.out.println(ob);}
// --------------------------------------------------------------------} // class Window01
Beuth Hochschule, TB3-IN3
14. SU Fr 14.01.11
WS10/11, Seite 66
Antworten zu den Wiederholungsfragen, 15. SU, Fr 21.01.11
1. Was passiert, wenn der Java-Ausführer folgende Befehle ausführt:
1
2
double a = 17.5, b = -0.0;
double c = a / b;
Der Variablen c wird der Wert Double.NEGATIVE_INFINITY zugewiesen.
2. Was passiert, wenn der Java-Ausführer folgende Befehle ausführt:
3
4
int
int
d = 17, e = 0;
f = d / e;
Der Ausführer wirft eine Ausnahme des Typs ArithmeticException.
3. Was passiert, wenn der Java-Ausführer den folgenden Befehl ausführt:
5
pln(Integer.parseInt("-123"));
Die Zahl -123 wird zur Standardausgabe ausgegeben.
4. Was passiert, wenn der Java-Ausführer den folgenden Befehl ausführt:
6
pln(Integer.parseInt("+123"));
Der Ausführer wirft eine Ausnahme des Typs NumberFormatException.
5. Woraus besteht ein try-catch-Befehl? Geben Sie insbesondere genau an, wie oft die einzelnen Bestandteile vorkommen dürfen.
Aus einem try-Block und einem oder mehr catch-Blöcken.
6. Welche Frage stellt sich der Java-Ausführer immer dann, wenn er gerade eine Ausnahme a geworfen
hat? (Die Frage ist ein bisschen kompliziert, aber da der Java-Ausführer sie sich häufig stellt, sollte man
sie genau kennen)
Trat a in einem try-Block auf, dem ein zum Fangen von a geeigneter catch-Block folgt?
7. Was macht der Ausführer, wenn die Antwort auf die Frage (siehe 5.) "nein" ist?
Die Ausführung der aktuellen Methode (das ist die, die gerade ausgeführt wird)
wird abgebrochen,
der Ausführer kehrt an die Aufrufstelle der Methode zurück und
wirft die Ausnahme dort erneut.
8. Was macht der Ausführer, wenn die Antwort auf die Frage (siehe 5.) "ja" ist?
Der Ausführer führt den entsprechenden catch-Block aus, und damit ist dann der gesamte try-catch-Befehl fertig ausgeführt.
9. Was passiert, wenn (während der Ausführung eines Java-Programms) eine Ausnahme geworfen, aber
nirgends gefangen wird?
Die Ausführung des betreffenden Programms wird abgebrochen und eine (manchmal umfangreiche) Fehlermeldung wird ausgegeben.
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 67
15. SU Fr 21.01.11
A. Wiederholung
B. Organisation: Der nächste SU (am Fr 28.01.2011) findet nicht hier im B554 statt, sondern
im Raum D121 (im Haus Bauwesen).
Schnittstellen
Das Profil einer Methode besteht aus dem Rückgabetyp der Methode, dem Namen der Methode und
den Typen ihrer Parameter.
Eine Schnittstelle enthält 0 oder mehr Profile von öffentlichen Objektmethoden.
S. 341, Beispiel-01: Die Schnittstelle Vergroesserbar
Eine Klasse kann beliebig viele (0 oder mehr) Schnittstellen implementieren
S. 343, Beispiel-03: Die Klasse GanzZahl02 implementiert zwei Schnittstellen
Eine Schnittstelle definiert (ähnlich wie eine Klasse) einen Typ. Objekte der Klasse GanzZahl02
gehören zu den folgenden drei Typen: GanzZahl02, Vergroesserbar, Verkleinerbar
(weil die Klasse die beiden Schnittstellen implementiert).
In einer Reihung des Typs Vergroesserbar[] kann man Objekte ganz verschiedener Klassen speichern, die Klassen müssen nur die Schnittstelle Vergroesserbar implementieren.
Eine Methode mit einem Parameter des Typs Vergroesserbar kann man auf Objekte ganz
verschiedener Klassen anwenden, die Klassen müssen nur die Schnittstelle Vergroesserbar implementieren.
S. 345, Beispiel-07: Die Methode reihungVervierfachen
Grabos, ganz kurz
Eine Grabo (grafische Benutzeroberfläche) besteht aus Grabo-Objekten. Für jedes Grabo-Objekt ist eine
grafische Darstellung festgelegt (z.B. als Fenster oder als Knopf oder ...) und wenn man ein Grabo-Objekt erzeugt, wird es (mehr oder weniger automatisch) auf dem Bildschirm dargestellt.
Der Benutzer kann Aktionen ausführen. Genauer: Er kann mit den grafischen Darstellungen der GraboObjekte interagieren (z.B. die Maus über ein Fenster bewegen, einen Knopf anklicken, ...).
Solche Aktionen bewirken, dass von dem betreffenden Grabo-Objekt (dem Fenster oder dem Knopf oder
...) ein Ereignis erzeugt wird.
Ereignisse sind historisch, d.h. sie werden zu einem bestimmten Zeitpunkt von einem bestimmten Grabo-Objekt erzeugt. Ereignisse sind nicht wiederholbar. Ereignisse werden zu Arten von Ereignissen zusammengefaßt und Arten zu Oberarten (die Tabelle auf S. 547 enthält Beispiele).
Jeder Oberart von Ereignissen ist eine sog. Listener-Schnittstelle zugeordnet (z.B. WindowListener,
MouseListener, ...). Die Listener-Schnittstelle enthält für jede Ereignisart, die zu der Oberart gehört,
eine entsprechende Methode.
Wir verwenden die Namen dieser Methoden auch dazu, um die Ereignisarten zu bezeichnen.
Beispiel-A: Zur Ereignisoberart Mausbewegungsereignis gehören zwei Ereignisarten: mouseDragged
und mouseMoved. Der Ereignisoberart Mausbewegungsereignis ist die Schnittstelle MouseMotionListener zugeordnet. Sie enthält zwei Methoden namens mouseDragged und mouseMoved.
Alle Listener-Schnittstellen sind Erweiterungen der (leeren) Schnittstelle EventListener. Zur Zeit
gibt es in Java etwa 70 Listener-Schnittstellen (und somit etwa 70 Ereignisoberarten).
Beuth Hochschule, TB3-IN3
15. SU Fr 21.01.11
WS10/11, Seite 68
Eine Klasse, die eine bestimmte Listener-Schnittstelle implementiert, bezeichnet man auch als
Listener-Klasse, und ihre Objekte als Listener-Objekte.
Beispiel-B: Eine MouseMotionListener-Klasse und ein MouseMotionListener-Objekt:
1
2
3
4
5
6
7
8
9
10
11
12
class Schuhmacher implements MouseMotionListener {
public void mouseDragged(MouseEvent me) {
...
}
public void mouseMoved(MouseEvent me) {
...
}
} // class Schuhmacher
Schuhmacher michael = new Schuhmacher();
Die Methoden in einem Listener-Objekt bezeichnet man auch als Behandler-Methoden, da sie zur Behandlung von Ereignissen einer bestimmten Art dienen sollen (z.B. soll die Methode mouseDragged
zur Behandlung von Ereignissen der Art mouseDragged dienen etc.).
Jedes Grabo-Objekt enthält bestimmte Methoden, deren Namen aus "add" und
dem Namen einer Listener-Schnittstelle bestehen, z.B. so:
addWindowListener, addMouseListener, addMouseMotionListener, ...
Mit diesen Methoden kann man entsprechende Listener-Objekte bei dem Grabo-Objekt anmelden. Sei
grob irgendein Grabo-Objekt (z.B. ein Window-Objekt oder ein JFrame-Objekt oder ...):
13
grob.addMouseMotionListener(michael);
Wenn nach dieser Anmeldung das Objekt grob ein Mausbewegungsereignis erzeugt (weil der Benutzer
mit der grafischen Darstellung von grob entsprechend interagiert hat), dann wird die entsprechende
Methode michael.mouseDragged bzw. michael.mouseMoved ausgeführt.
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 69
Wiederholungsfragen, 16. SU, Fr 28.01.11
1. Betrachten Sie die folgenden drei Methodenvereinbarungen:
1
2
3
public static void main(String[] sonja)
{ ... }
int add(int a, int b)
{ ... }
static protected add(int param1, int param2) { ... }
Geben Sie von jeder dieser Methoden das Profil an.
2. Eine Schnittstelle (engl. interface) enthält Profile. Geben Sie alle Profile an, die in der Schnittstelle
ActionListener enthalten sind.
3. Zu welchen Listener-Schnittstellen gibt es keine entsprechende Adapter-Klasse?
Sie sollen das allgemeine Kriterium beschreiben und nicht nur Beispiele angeben.
4. In einer Adapter-Klasse sind bestimmte (öffentliche Objekt-) Methoden vereinbart.
Was machen diese Methoden?
5. Welche grundlegende, charakteristische Eigenschaft haben alle Ereignisse?
6. Geben Sie die Namen von zwei Ereignisarten an.
7. Geben Sie die Namen von zwei Ereignisoberarten an.
Beuth Hochschule, TB3-IN3
15. SU Fr 21.01.11
WS10/11, Seite 70
Rückseite der Wiederholungsfragen, 16. SU, Fr 28.01.11
Die Zahl π mit Hilfe von Zufallszahlen berechnen
Für viele Probleme ist es sehr aufwendig, eine exakte Lösung zu berechnen. Für einige dieser Probleme
kann man unter Verwendung von Zufallszahlen mit viel weniger Aufwand eine Näherungslösung berechnen. Beispiel: Die Berechnung der Kreiszahl π mit Hilfe von zufälligen Regentropfen:
x
Quadrat mit Fläche fq = 1.0
1.0
Viertelkreis mit Fläche fv = PI / 4.0
0.0
y
0.0
1.0
Ein Quadrat mit der Kantenlänge 1.0 hat eine Fläche fq von ... (wo ist bloß mein Taschenrechner??)
von 1.0. Ein Kreis mit dem Radius 1.0 hat eine Fläche von π, ein Viertelkreis davon hat somit eine
Fläche fv gleich π/4.0 (siehe obige Skizze). Angenommen, in das Quadrat fallen tiq ("Tropfen ins
Quadrat") viele Regentropfen und tiv viele davon landen im Viertelkrei. Dann gilt:
fv / fq = tiv / tiq
Pi / 4.0 / 1.0 = tiv / tiq
Pi
= tiv / tiq * 4.0
Die folgenden Befehle berechnen einen Näherungswert für die Zahl PI:
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Random rand = new Random(123);
int
tiq = 10*1000*1000;
double tiv = 0;
// Keim (seed) 123
// Tropfen die ins Quadrat fallen
// Tropfen die im Viertelkreis landen
for (int i=1; i<=tiq; i++) {
//
double x = rand.nextDouble(); //
double y = rand.nextDouble(); //
if (Math.sqrt(x*x + y*y) <= 1.0)
}
tiq viele Tropfen fallen lassen
Zufallszahl aus [0.0 .. 1.0)
Zufallszahl aus [0.0 .. 1.0)
tiv++; // Treffer im Viertelkreis
// Aus tiv und tiq einen Naeherungswert fuer pi berechnen und ausgeben:
pln("Hier:Pi ist gleich " + (tiv / tiq * 4.0));
// Zum Vergleich einen *guten* Naeherungswert fuer PI ausgeben:
pln("Math.PI ist gleich " + Math.PI);
Ausgabe dieser Befehlsfolge:
18
19
Hier:Pi ist gleich 3.141918
Math.PI ist gleich 3.141592653589793
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 71
Antworten zu den Wiederholungsfragen, 16. SU, Fr 28.01.11
1. Betrachten Sie die folgenden drei Methodenvereinbarungen:
1
2
3
public static void main(String[] sonja)
{ ... }
int add(int a, int b)
{ ... }
static protected add(int param1, int param2) { ... }
Geben Sie von jeder dieser Methoden das Profil an.
1
2
3
void main String[]
int add int int
int add int int
2. Eine Schnittstelle (engl. interface) enthält Profile. Geben Sie alle Profile an, die in der Schnittstelle
ActionListener enthalten sind.
Die Schnittstelle ActionListener enthält nur ein Profil:
public void actionPerformed(ActionEvent ae);
3. Zu welchen Listener-Schnittstellen gibt es keine entsprechende Adapter-Klasse?
Sie sollen das allgemeine Kriterium beschreiben und nicht nur Beispiele angeben.
Zu den Listener-Schnittstellen, die nur ein Profil enthalten.
4. In einer Adapter-Klasse sind bestimmte (öffentliche Objekt-) Methoden vereinbart.
Was machen diese Methoden?
Sie machen nichts.
5. Welche grundlegende, charakteristische Eigenschaft haben alle Ereignisse?
Ereignisse sind historisch, d.h. sie sind grundsätzlich unwiederholbar.
6. Geben Sie die Namen von zwei Ereignisarten an.
windowOpened, windowClosing, windowClosed, ..., mouseClicked, mousePressed, ...,
mouseWheelMoved, actionPerformed, ...
7. Geben Sie die Namen von zwei Ereignisoberarten an.
Fensterereignis, Mausereignis, Mausbewegungsereignis, Mausradereignis, Aktionsereignis, ...
Beuth Hochschule, TB3-IN3
16. SU Fr 28.01.11
WS10/11, Seite 72
16. SU Fr 28.01.11
A. Wiederholung
B. Organisation: Der 17. SU am Fr 04.02.11 soll vor allem dazu dienen, Fragen der TeilnehmerInnen
(die z.B. beim Wiederholen des Stoffs für die Klausur aufgetreten sind) zu behandeln.
Schnittstellen und Profile: Eine Korrektur
Beim letzten SU habe ich gesagt: Eine Schnittstelle enthält eine Menge von Profilen.
Das war nicht (ganz) richtig. Richtig ist:
Eine Schnittstelle enthält eine Menge von öffentlichen, abstrakten Objektmethoden
(und kann außerdem öffentliche, konkrete Klassenkonstanten enthalten, siehe S. 348, Beispiel-01).
Eine abstrakte Objektmethode hat (noch) keinen Rumpf (und statt des Rumpfes { ... } notiert man
nur ein Semikolon ; ).
Abstrakte Methoden sind immer Objektmethoden (es gibt keine abstrakten Klassenmethoden).
15.2 Flugregeln für Ausnahmen (S. 369)
Die Rolle des Stapels (oder: des Kellers, engl. stack) bei der Ausführung von Unterprogrammen.
15.3 Der try-catch-finally-Befehl (S. 373)
15.5 Geprüfte und ungeprüfte Ausnahmen (S. 377)
Die throws-Klausel und die throws-Anweisung
15.7 Übersicht über ein paar wichtige Ausnahmeklassen (S. 382)
Zur Entspannung: Die Kreiszahl π mit Hilfe von zufälligen Regentropfen berechnen
Siehe Rückseite der Wiederholungsfragen.
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 73
Wiederholungsfragen, 17. SU, Fr 04.02.11
1. Wie heißt (in Java) die oberste Ausnahmeklasse?
2. Wie heißen die beiden Unterklassen der obersten Ausnahmeklasse?
3. Welche von diesen beiden Unterklassen ist geprüft und welche ist ungeprüft?
Betrachten Sie die folgende Klassenvereinbarung:
1 import java.io.FileReader;
2
3 class Ausnahme02 {
4
static public void main(String[] _) {
5
FileReader fr = new FileReader("MeineDatei17");
6
} // main
7 }
Wenn man diese Vereinbarung dem Java-Ausführer von Sun übergibt,
lehnt er sie ab, und zwar mit folgender Fehlermeldung:
D:\meineDateien\Java\Ausnahme02.java:5:
unreported exception java.io.FileNotFoundException;
must be caught or declared to be thrown
FileReader fr = new FileReader("MeineDatei17");
^
4. Was ist FileReader("MeineDatei17") (in Zeile 5 und in der Fehlermeldung) für ein Ding?
Die Vereinbarung einer Methode? Ein Aufruf einer Funktion? Die Vereinbarung eines Konstruktors?
Ein Aufruf eines Konstruktors? Ein Aufruf einer Methode? Eine Anweisung?
5. Was sagt die Fehlermeldung über den Befehl FileReader("MeineDatei17") ? Warum
akzeptiert der Ausführer diesen Befehl nicht einfach so?
Die Fehlermeldung schägt Ihnen 2 Korrekturmöglichkeiten vor
("must be caught" oder "[must be] declared to be thrown").
6. Korrigieren Sie die Vereinbarung der Klasse Ausnahme02 nach der zweiten
vorgeschlagenen Korrekturmöglichkeit ("[must be] declared to be thrown").
Anmerkung: Es ist nicht verboten, vorher im Buch auf Seite 378 das Beispiel-01 anzusehen.
7. Korrigieren Sie die Vereinbarung der Klasse Ausnahme02 nach der ersten
vorgeschlagenen Korrekturmöglichkeit ("must be caught").
Beuth Hochschule, TB3-IN3
16. SU Fr 28.01.11
WS10/11, Seite 74
Antworten zu den Wiederholungsfragen, 17. SU, Fr 04.02.11
1. Wie heißt (in Java) die oberste Ausnahmeklasse?
Throwable
2. Wie heißen die beiden Unterklassen der obersten Ausnahmeklasse?
Error, Exception
3. Welche von diesen beiden Unterklassen ist geprüft und welche ist ungeprüft?
Error ist ungeprüft, Exception ist geprüft.
Betrachten Sie die folgende Klassenvereinbarung:
1 import java.io.FileReader;
2
3 class Ausnahme02 {
4
static public void main(String[] _) {
5
FileReader fr = new FileReader("MeineDatei17");
6
} // main
7 }
Wenn man diese Vereinbarung dem Java-Ausführer von Sun übergibt,
lehnt er sie ab, und zwar mit folgender Fehlermeldung:
D:\meineDateien\Java\Ausnahme02.java:5:
unreported exception java.io.FileNotFoundException;
must be caught or declared to be thrown
FileReader fr = new FileReader("MeineDatei17");
^
4. Was ist FileReader("MeineDatei17") (in Zeile 5 und in der Fehlermeldung) für ein Ding?
Die Vereinbarung einer Methode? Ein Aufruf einer Funktion? Die Vereinbarung eines Konstruktors?
Ein Aufruf eines Konstruktors? Ein Aufruf einer Methode? Eine Anweisung?
5. Was sagt die Fehlermeldung über den Befehl FileReader("MeineDatei17") ? Warum
akzeptiert der Ausführer diesen Befehl nicht einfach so?
Weil dieser Konstruktoraufruf evtl. eine Ausnahme (vom Typ FileNotFoundException) wirft.
Die Fehlermeldung schägt Ihnen 2 Korrekturmöglichkeiten vor
("must be caught" oder "[must be] declared to be thrown").
6. Korrigieren Sie die Vereinbarung der Klasse Ausnahme02 nach der zweiten
vorgeschlagenen Korrekturmöglichkeit ("[must be] declared to be thrown").
3 class Ausnahme02 throws java.io.FileNotFoundException { ... wie oben ... }
Anmerkung: Es ist nicht verboten, vorher im Buch auf Seite 378 das Beispiel-01 anzusehen.
7. Korrigieren Sie die Vereinbarung der Klasse Ausnahme02 nach der ersten
vorgeschlagenen Korrekturmöglichkeit ("must be caught").
3 class Ausnahme02 {
4
static public void main(String[] _) {
5
try {
6
FileReader fr = new FileReader("MeineDatei17");
7
} catch (java.io.FileNotFoundException ex) {
8
pln("Ausnahme: " + ex);
9
}
10
} // main
11 }
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 75
17. SU Fr 04.02.11
A. Wiederholung
B. Organisation: Wer bis heute weniger als 9 Tests bestanden hat (mit 5 oder mehr Punkten) ist nicht
zur Klausur (und nicht zur Nachklausur) zugelassen. Von dieser Regel gibt es eine Ausnahme.
Wer bis heute nur 9 Tests bestanden hat, kann heute in der Übung einen (von mir ausgewählten) Zusatztest schreiben und hat damit eine Chance, auf 10 bestandene Tests zu kommen.
Wer bis heute 10 oder mehr Tests bestanden hat, ist zur Klausur (und Nachklausur) zugelassen.
Wer nicht sicher ist, wie viele Tests er bestanden hat, kann das heute klären (indem er mit mir in meine
Punkte-und-Noten-Liste schaut).
Zur Organisation der Klausur
Als Unterlagen darf jeder mitbringen: 5 Blätter, max. DIN A 4, Beschriftung beliebig
Bringen Sie zusätzlich ausreichend viele (z.B. 20) leere Blätter Papier mit (für ihre Lösungen).
Sehr gut geeignet ist kariertes, ganz weißes, "radierfestes" Papier, kein graues Umweltpapier!
Sie können schon zu Hause einige der leeren Blätter (z.B. rechts oben) mit ihrem Nachnamen kennzeichnen (weitere Angaben wie Vorname, Kragenweite, Matrikelnr, Schuhgröße etc. sind erlaubt, aber
nicht nötig).
Am Ende der Klausur sollte jedes Blatt, das sie abgeben, mit ihrem Nachnamen gekennzeichnet sein.
Während der Klausur:
Schreiben Sie zuerst ihren Vor- und Nachnamen auf das ausgeteilte Blatt mit den Klausuraufgaben und
machen Sie hinter "Diese Klausur ist mein letzter Prüfungsversuch!" an der richtigen Stelle (bei Ja
bzw. Nein) ein Kreuzchen.
Schreiben Sie jede Lösung einer Aufgabe auf ein neues Blatt (nicht mehrere Lösungen auf dasselbe
Blatt).
Beschreiben Sie von ihren Blättern nur die Vorderseiten und lassen sie die Rückseiten leer.
Es gibt 6 Aufgaben. Normalerweise sollte jede Lösung einer Aufgabe auf eine Seite passen. Aber wenn
sie mehr Platz benötigen, dann schreiben Sie die Lösung auf die Vorderseiten von mehreren Blättern.
Ziel: Es soll möglich sein, ihre Lösungen so auf einen Tisch zu legen, dass man sie alle und vollständig
sehen kann, ohne Blätter rumdrehen zu müssen.
Tip: Überfliegen Sie erstmal alle Aufgaben, damit Sie ein Gefühl dafür bekommen, welche sie leichter
und welche sie schwerer finden. Lösen Sie dann die Aufgaben in aufsteigender Reihenfolge ihrer
Schwierigkeit (erst die einfachste, dann die zweiteinfachste etc.).
Bevor sie daran gehen, eine bestimmte Aufgabe zu lösen, sollten sie den Text der Aufgabe vollständig
durchlesen (bis zum letzten Punkt!). Möglicherweise müssen sie bestimmte Stellen des Textes mehrmals
lesen, um sie zu verstehen.
Prüfen Sie dann, ob sie die Aufgabe unzweifelhaft verstanden haben. Wenn sie unsicher sind, wie die
Aufgabe "gemeint ist" oder "verstanden werden sollte", dann heben sie ihren linken Arm. Ich komme
dann zu ihnen und sie können Fragen der Art "Ist das hier so gemeint?" stellen.
Insgesamt haben sie 90 Minuten für 6 Augaben. Das sind etwa 15 Minuten pro Aufgabe.
Rückgabe der Klausur: Fr 11.02.2011, 10 Uhr im SWE-Labor
Gibt es Fragen zum Stoff dieses Semester?
Beuth Hochschule, TB3-IN3
17. SU Fr 04.02.11
WS10/11, Seite 76
Ein paar Bemerkungen zur Klausur:
Es gibt 6 Aufgaben und insgesamt 100 Punkte.
Für die ersten beiden Aufgaben gibt es je 20 Punkte, für die übrigen je 15 Punkte.
Die Aufgaben 1 und 2 haben den gleichen Text:
"Schreiben Sie eine Methode, die der folgenden Spezifikation entspricht: "
Es schadet wahrscheinlich nicht, folgende Stoffgebiete gut zu beherrschen:
Die Wiederholungsfragen (die im Laufe des Semesters gestellt wurden)
Zahlensysteme (Fachbegriffe: Basiszahl, Ziffer, Stelle oder Position einer Ziffer, Wert einer Ziffer, Stellenwert einer Ziffer) und wie man mit Zahlen in Java umgehen kann.
Reihungen (arrays) und Sammlungen (collections)
Umgang mit den Standardklassen und Standardschnittstellen, die wir
zum Lösen der Aufgaben benutzt haben
(String, StringBuilder, ArrayList, JFrame, JCheckbox, WindowListener,
WindowAdapter, ...)
Literale
(Sie sollten wissen, zu welchen Typen es in Java Literale gibt und
sollten jedem Literal ansehen, zu welchem Typ es gehört).
Grundlagen der Grabo-Programmierung
Alle zusammengesetzten Anweisungen (if, switch, Schleifen, insbesondere foreach-Schleifen)
Sie sollten (nicht zu lange) Befehlsfolgen mit Papier und Bleistift ausführen können.
Sie sollten das Typensystem von Java kennen (primitive Typen, Referenztypen etc.) und sollten Variablen aller Typen als Bojen darstellen können.
Zur Entspannung: Christian Morgenstern (1871-1914)
Das Butterbrotpapier: Ein Butterbrotpapier im Wald / da es beschneit wird, fühlt sich kalt. ...
Objektorientierte Programmierung, ein Nachtrag
S. 295, Beispiel-01
Druckfehler korrigieren: statt pr[...] muss es überalle tab[...] heissen.
Von welchem Typ ist die Variable tab (vereinbart in Zeile 2)? (Vom Typ Reihung von E01Punkt)
Von welchen Typen sind die Objekte, die in der Reihung tab gespeichert werden (siehe Zeile 3 bis 8)?
(Von den Typen E01Ellipse, E01Quadrat, E01Rechteck, E01Punkt)
Das ist erlaubt, weil die Typen der Komponenten Untertypen von E01Punkt sind, d.h. weil
jedes E01Ellipse-Objekt auch ein E01Punkt-Objekt ist und
jedes E01Quadrat-Objekt auch ein E01Punkt-Objekt ist und ... .
S. 296, Beispiel-02: Die Methode reihungAusgeben02(E01Punkt[], ...
Üben Sie, beim Anblick dieser Methode (oder einer ähnlichen Methode) sofort Pickel zu bekommen
(oder zumindest eine deutlich erkennbare Gänsehaut). So darf man in einer objektorientierten Sprache
auf keinen Fall programmieren (obwohl die Methode in einem bestimmten Sinn korrekt ist und erstmal
das macht, was sie machen soll)
S. 298, Beispiel-03: Die Methode reihungAusgeben(E01Punkt[], ...
So löst man das Problem objektorientiert!
Objektorientierung dient (u.a.) dazu, Fallunterscheidungen wie im Beispiel-02
(Methode reihungAusgeben02) zu beseittigen bzw. zu vermeiden.
Beuth Hochschule, TB3-IN3
Stichworte
WS10/11, Seite 77
20 Steurfäden (threads of control)
Die Java-Programme, die wir bisher geschrieben haben, waren sequentielle-Programme.
Ein sequentielles-Programm wird von einem einzigen Java-Ausführer ausgeführt, und
die einzelnen Befehle werden in einer genau festgelegten Reihenfolge ausgeführt.
Es gibt Probleme, die man mit einem sequentiellen Problem nicht (wirklich, gut, elegant) lösen kann,
z.B. das Problem, von zwei Tastaturen Zahlen einzulesen und zu verarbeiten.
Einem Java-Ausführer A1 kann man den Befehl geben, einen weiteren Java-Ausführer A11 zu erzeugen
und den eine bestimmte Methode m ausführen zu lassen.
Das geht auch mehrfach: Der Ausführer A1 kann Ausführer A11, A12, A13, ... erzeugen.
Und entsprechendes gilt für alle Ausführer.
Z.B. kann der Ausführer A13 weitere Ausführer A131, A132, A133, ... erzeugen etc.
All diese Ausführer arbeiten nebenläufig (engl. concurrently) zueinander, d.h. zeitlich unabhängig voneinander. Konkret: Wie schnell die einzelnen Ausführer relativ zueinander arbeiten ist nicht festgelegt
und kann, wenn man ein bestimmtes Programm mehrmals ausführen läßt, von Ausführun zu Ausführung
sehr verschieden sein.
Wenn es nur um die Ausführung von Programmen geht
(und nicht um das Prüfen, Akzeptieren bzw. Ablehnen von Programmen),
spricht man üblicherweise nicht von Ausführern, sondern von Fäden (engl. threads).
Fäden arbeiten nebenläufig zueinander.
Ein sequentielles Java-Programm wird von nur einem Faden ausgeführt, und der heißt Faden main
(weil es seine Aufgabe ist, die main-Methode auszuführen), oder Hauptfaden.
Weitere Fäden heißen dann Thread-1, Thread-2, Thread-3, ... wenn der Programmierer ihnen
nicht ausdrücklich einen anderen Namen gibt.
S. 509: Zwei Ausgaben des Programms Faden05Tst
Dies Programm wird (ausser vom Hauptfaden main) von zwei Fäden namens A und B ausgeführt. Jeder
dieser beiden Fäden soll ein StringBuilder-Objekt namens text "mit seinem Namen" (A bzw. B)
füllen.
An den beiden Ausgaben kann man erkennen: Die beiden Fäden haben sich "beim Füllen von text"
gegenseitig mehrmals unterbrochen (sonst stünden in jeder Zeile nur lauter As oder nur lauter Bs).
Außerdem unterscheiden sich die beiden Ausgaben voneinander.
Problem: Wenn ein Programm Fadenfehler enthält, dann kann es passieren, dass die bei einigen Ausführungen auftreten, aber bei anderen Ausführungen des selben Programm nicht auftreten. Deshalb sind
sie im Allgemeinen viel schwerer zu finden, als Fehler in einem sequentiellen Programm.
Wer Lust hat, kann weitere Einzelheiten selbst nachlesen.
Merke: Das Programmieren von Fäden ist erstaunlich schwierig und wird häufig falsch gemacht (z.B.
habe ich ein Radio, welches vermutlich Fadenfehler enthält).
Herunterladen