TB3-IN3 - Beuth Hochschule für Technik Berlin

Werbung
BHT, TB3-IN3
Stichworte
WS11/12, Seite 1
Stichworte
zur Lehrveranstaltung Informatik 3 (TB3-IN3)
im Studiengang Technische Informatik Bachelor
im Wintersemester 2011/12 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 seminaristischen Unterricht (nach jeder Vorlesung) 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 http://public.beuth-hochschule.de/~grude/AufgabIN3_11WS.pdf.
BHT, TB3-IN3
1. SU Mo 26.09.2011
WS11/12, Seite 2
1. SU Mo 26.09.2011
im Raum B325, 3. Block (12.15 - 13.45 Uhr)
1. Begrüßung
Namensschilder
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.
Übungstermin: 2a. Mo 4. Block,
Falls nötig Verlosung von 20 Plätzen für die Übungsgruppe.
Hinweis auf parallele LV für Zug 1, bei Herrn Goethe: Di 3. Block SU, 4. bzw. 5. Block: Ü
Grundlage der LV: Das Buch "Java ist eine Sprache" (in der BHT-Bibliothek oder
im Buchhandel, 40 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: Vermutlich am Mo 30.01.2012, 12.15 Uhr, B325 (wird noch bestätigt oder geändert)
Fragen zu Organisation dieser Lehrveranstaltung?
Wie fanden Sie es, in C zu programmieren?
Was war leicht? Was war schwer?
Ist die Sprache C standardisiert?
Wann und wozu benutzt man in einem C-Programm eine Funktionsdeklaration wie z.B.:
int add(int, int); ?
Wie viele Werte gehören (in C) zum Typ int?
Wenn jemand Lust hat, 4 verschiedene C-Compiler (gcc, lcc, bcc32, tcc, unter Windows) auszuprobieren
oder den C-Standard (ca. 550 Seiten) auswendig zu lernen, siehe:
http://public.beuth-hochschule.de/~grude/TB1-IN1-SWD.zip
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 (Hardware, 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.
BHT, TB3-IN3
•
•
•
•
Stichworte
WS11/12, Seite 3
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.
1.1 Programmieren als ein Rollenspiel
Rolle
Tätigkeiten (die meisten beziehen sich auf Programme)
Programmierer
schreibt, übergibt (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:
BHT, TB3-IN3
1. SU Mo 26.09.2011
WS11/12, Seite 4
1.4 Die vier wichtigsten Grundkonzepte der Programmierung
Variable
Typ
(Wertebehälter, Inhalt beliebig oft veränderbar)
(Bauplan für Variablen)
... wird nächstes Mal fortgesetzt
Zur Entspannung: Was kostet ein Studium an der Beuth Hochschule?
Haushalt der Beuth Hochschule ca. 60 Millionen [Euro pro Jahr].
An der Beuth Hochschule studieren ca. 10 Tausend StudentInnen.
Also kostet das Studieren an der Beuth Hochschule ca. 6000 [Euro pro StudentIn und Jahr].
Ein Bachelor-Studium (6 Semester, 3 Jahre) kostet also ca. 18 Tausend [Euros pro StudentIn].
Wichtiger Punkt für die letzten 10 Minuten (anderem Stoff vorziehen):
Zahlensysteme (Dezimalsystem, Binärsystem, Hexadezimalsystem, ...). Wie viele gibt es?
Einfachere Namen: 2-er-System, 3-er-System, ..., 8-er-System, ..., 10-er-System, ..., 16-er-System, ...
All diese Zahlensysteme funktionieren nach demselben System, sie unterscheiden sich nur durch eine
einzige Zahl voneinander: Die Basis.
Wenn man die Basis-Zahl b eines Zahlensystems kennt, kann man alles andere daraus ableiten.
Wie viele Ziffern gibt es im 137-er-System?
Die Begriffe Position (oder: Stelle) und Stellenwert (b ist die Basis des Systems):
Positionen
...
3
2
1
0
-1
-2
-3
...
Stellenwerte
...
b3
b2
b1
b0
b-1
b-2
b-3
...
Zifferern
einer Zahl
...
...
BHT, TB3-IN3
Stichworte
WS11/12, Seite 5
1. Übung: Mo 26.09.2012, 4. Block, Raum DE 16a
1. Falls mehr als 22 StudentInnen an dieser Übungsgruppe teilnehmen möchten, 22 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 und den folgenden Tip
ausführen: 6. 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).
BHT, TB3-IN3
2. SU Mo 10.10.11
WS11/12, Seite 6
2. SU Mo 10.10.11
Heute in der Übung: Test 1
1.4 Die vier wichtigsten Grundkonzepte der Programmierung (Fortsetzung)
Variable
Typ
(Wertebehälter, Inhalt beliebig oft veränderbar)
(Bauplan für Variablen)
hatten wir schon
hatten wir schon
Was ist eine Variable (in den meisten Programmiersprachen)?
Unterschied einer solchen Variablen mit Variablen in der Mathematik?
Was ist ein Typ?
Unterprogramm (Befehlsfolge mit Namen, der Name ist "ein neuer Befehl". Evtl. Parameter)
Eng verwandte Begriffe: Funktion, Prozedur, Methode
Def.: Eine Methode ist ein Unterprogramm, das innerhalb einer Klasse vereinbart wurde.
Def.: Ein Attribut ist eine Variable, die innerhalb einer Klasse vereinbart wurde.
In Java sind alle Unterprogramme Methoden (d.h. in Klassen vereinbart).
In C++ gibt es Methoden und andere Unterprogramme (die ausserhalb von Klassen vereinbart wurden)
Modul
(Behälter für Variablen, Unterprogramme, Typen, ... etc. der aus mind. 2 Teilen
besteht, einem öffentlichen Teil und einem privaten Teil)
Vorteil von Modulen?
1. Änderungen im privaten Bereich eines Moduls (z.B. ein Unterprogramm entfernen, oder seinen Namen oder seine Parameter ändern, etc.) können den Rest des Programms nicht "durcheinander bringen"
2. Beim Testen muss man bestimmte Fehler nur in einem Modul suchen, statt in allen Modulen.
Nebenbei: Gibt es in C Module?
Zum Abschluss: Das 5. der 4 wichtigsten Grundkonzepte der Programmierung:
Klasse
Eine Klasse ist ein Modul und ...
Die Definition einer Klasse wird später vervollständigt und genauer behandelt
1.5 Drei Arten von Befehlen (und wie man sie ins Deutsche übersetzen kann)
Vereinbarung declaration "Erzeuge ..." (eine Variable, ein Unterprogramm, einen Typ, ...)
Ausdruck
expression
"Berechne den Wert des Ausdrucks ..."
Anweisung statement
"Tue die Werte ... in die Wertebehälter ..."
Def.: Ein Wertebehälter ist entweder eine Variable oder ein Ein-/Ausgabegerät, z.B. ein Bildschirm, ein
Drucker, eine Tastatur, eine Festplatte, ... .
Regel: Ein normaler Ausdruck bewirkt nur, dass ein Wert berechnet wird. Er bewirkt nicht, dass der Inhalte irgendeines Wertebehälters verändert wird. Es gibt aber Ausnahmen zu dieser Regel (Ausdrücke
mit Seiteneffekt)
Wenn man von einem Befehl nur weiß, zu welcher Art er gehört, weiß man schon sehr viel über ihn.
BHT, TB3-IN3
Stichworte
WS11/12, Seite 7
Beispiele für Java-Befehle und ihre Übersetzug ins Deutsche:
Befehl
Art
Übersetzung ins Deutsche
int otto;
Ver.
Erzeuge eine Variable namens otto vom Typ int
("baue eine Variable otto nach dem Bauplan int")
int anna = 17;
Ver.
Erzeuge eine Variable namens anna vom Typ int mit dem
Anfangswert 17
anna + 3
Aus.
Berechne den Wert des Ausdrucks anna + 3
5 * (otto+anna) - 17
Aus.
Berechne den Wert des Ausdrucks 5 * (otto+anna) - 17
otto = anna + 1;
Anw.
Berechne den Wert des Ausdrucks anna + 1 und tue ihn
in die Variable otto.
System.out.print("Hallo");
Anw.
Berechne den Wert des Ausdrucks "Hallo" und tue ihn
in die Standardausgabe (das ist meistens der Bildschirm).
Zur Erinnerung: Wer gibt diese Befehle? Wem werden sie gegeben?
(Der Programmierer gibt sie dem Ausführer).
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:
S.103, Bild 5.1
S.104, Bild 5.2
Wie viele Elemente enthalten die Zahlen-Mengen N, Z, Q, R und C?
(unendlich viele)
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 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.
BHT, TB3-IN3
2. SU Mo 10.10.11
WS11/12, Seite 8
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
5 Typen byte, char, short, int, long), dann gelten ganz andere Regeln, als wenn er
mit Gleitpunktzahlen rechnet (d.h. mit Zahlen der 2 Typen float, double).
Grundsätzlich gilt:
Wenn der Ausführer mit Ganzzahlen rechnet, ist das Ergebnis seiner Rechnung immer eine Ganzzahl,
keine Bruchzahl. Z.B. ist int-7 / int-2 gleich int-3 (und nicht etwa 3.5).
Nur wenn der Ausführer mit Bruchzahlen rechnet, kann das Ergebnis eine Bruckzahl sein. Z.B. ist
double-7 / double-2 gleich double-3.5 .
Was passiert, wenn ein Rechenergebnis "zu groß" ist?
S. 112, Bild 5.3 Die Struktur eines Java-Ganzzahltyps
Zum Typ double gehören zwei unendliche Werte: Double.POSITIVE_INFINITY und
Double.NEGATIVE_INFINITY (Für den Typ float ganz entsprechend). Diese Werte repräsentieren alle "zu großen Zahlen". Sie müssen mit diesen Werten rechnen lerenen (im Kopf, weil Ihr Taschenrechner diese Werte nicht kennt und nicht mit ihnen rechnen kann).
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 Double.POSITIVE_INFINITY
gleich Double.NEGATIVE_INFINITY
gleich Double.NaN
gleich 0.0
gleich -0.0
gleich Double.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.
BHT, TB3-IN3
Stichworte
WS11/12, Seite 9
3. SU Mo 17.10.11
Heute in der Übung: Test 2
Rechnen mit Ganzzahlen und mit Bruchzahlen, kleine Ergänzung
Betrachten Sie folgende Java-Befehle:
1
2
3
4
5
6
7
8
9
int otto = 1;
while (true) {
otto = 2 * otto;
}
double emil = 1.0;
while (true) {
emil = 2.0 * emil;
}
Wie verändert sich der Wert der Variablen otto? Und wie verändert sich emil?
S. 107, Tabellen für die Multiplikation und Divison von Gleitpunktzahlen, kurz besprechen.
Drei Arten von Befehlen, kleine Ergänzung
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?
Typen und Variablen
Def.: Ein Typ ist ein Bauplan für Variablen
Eine Variablen-Vereinbarung beginnt deshalb immer mit einem Typ.
10
11
12
13
14
15
16
// 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
Hallo04.pln(...)
Math.sin(...)
Integer.MAX_VALUE
Math.PI
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
Mit dieser Notation ist es also ganz leicht, innerhalb eines Moduls M1 auf Methoden und Atrribute
in einem anderen Modul M2 zuzugreifen. 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).
4 Anweisungen, einfache und zusammengesetzte (S. 46)
(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.
BHT, TB3-IN3
3. SU Mo 17.10.11
WS11/12, Seite 10
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).
Wieso ist return eine Anweisung? Welchen Wertebehälter verändert sie?
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).
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
Ausdrücke, einfache und zusammengesetzte
Einfache: Literale und Variablen-Namen. Zusammengesetzte Ausdrücke 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 fanny, 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
fanny || gerd && heinz
fanny
||
gerd && heinz
fanny && gerd || heinz
fanny && gerd
||
heinz
!
heinz
!heinz
BHT, TB3-IN3
Stichworte
WS11/12, Seite 11
4. SU Mo 24.10.11
Heute in der Übung: Test 3
Zusammengesetzte Ausdrücke: Fortsetzung
Die Tabelle besprechen, die im 3. SU verteilt und teilweise ausgefüllt wurde:
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
fanny || gerd && heinz
fanny
||
gerd && heinz
fanny && gerd || heinz
fanny && gerd
||
heinz
!
heinz
!heinz
Noch ein Problem mit zusammengesetzten Ausdrücken:
Seien b1 bis b4 boolean-Variablen. Wie ist dann der folgende Ausdruck zu lesen? Welche "impliziten
Klammern" muss man sich dazudenken? Welche Regeln gelten dafür?
! b1
||
b2
==
b3
&&
b4
( ( ! b1 ) || ( ( b2
==
b3 ) &&
b4 ) )
4 1
1
3 2
2
3 4
Im Buch, S. 144, findet man eine Tabelle mit allen Operatoren und ihre Bindungsstärken. Man klammert
zuerst die Operatoren mit den höchsten Bindungsstärken, dann abwärts weiter:
! == && ||
5 Typen
In Java unterscheidet man 2 Arten von Typen:
Primitive Typen (genau 8 Stück:
byte, char, short, int, long, float, double, boolean)
Referenztypen (mehr als 4000 Stück:
String, StringBuilder, Integer, int[], String[][], Collection<K>, ...)
5.7 Variablen als Bojen darstellen
Variablen sind das wichtigste Grundkonzept in den meisten Programmiersprachen (es gibt aber auch
Programmiersprachen ohne Variablen). Darum brauchen wir ein "genaueres Modell" von Variablen, eine
Darstellung von Variablen, die die Anzahl und Art ihrer Bestandteile ganz deutlich macht.
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 Referenztyps (Referenzvariablen) bestehen aus
höchstens 4 Teilen (Name, Referenz, Wert, Zielwert)
BHT, TB3-IN3
4. SU Mo 24.10.11
WS11/12, Seite 12
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 <, <=, ==, !=, >=, >).
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.
Hüllklassen (S. 91)
Zu jedem primitiven Typ (z.B. int) gibt es eine entsprechende Hüllklasse (z.B. Integer). Die Werte
des primitiven Typs kann man in Objekte der Hüllklasse "einhüllen" (später mehr dazu).
BHT, TB3-IN3
Stichworte
WS11/12, Seite 13
5. SU Mo 31.10.11
Heute in der Übung: Test 4
Wiederholung
Stellen Sie die folgenden Variablen als Bojen dar:
double dora1 = 1.5;
double dora2 = 2.5;
String sonja1 = new String("ABC");
String sonja2 = new String("123");
Welche Teile der Variablen werden durch dora1 == dora2 verglichen?
Welche Teile der Variablen werden durch sonja1 != sonja2 verglichen?
Wie kann man die Zielwerte von sonja1 und sonja2 vergleichen?
sonja1.equals(sonja2)
Wichtige Regeln:
In Java sind die Zielwerte von Variablen immer Objekte.
Ein Objekt ist ein Modul.
In Java enthält jedes Objekt eine Methode namens equals (mit einem Parameter).
Was die equals-Methode macht, hängt vom Typ des Objekts ab.
Beispiele:
Die equals-Methode von String-Objekten vergleicht Zielwerte.
Die equals-Methoden von StringBuilder-Objekten vergleicht Werte.
Die Übung "Einfach boolean" austeilen und bearbeiten
Sinn der Aufgabe 4 (Dreiseits) und dieser Übung: Häufig ist es viel einfacher, mit boolean-Werten zu
rechnen (ähnlich wie mit int-Werten), statt umständliche if-Befehle zu programmieren.
Zur Entspannung: Nicht-transitive Würfel
Viele "Vergleichs-Relationen" wie istSchneller, istHöher, istGrößer etc. sind transitiv, d.h.
wenn A schneller ist als B und B schneller ist als C dann gilt auch: A ist schneller als C.
Betrachten wir noch eine andere istBesser-Relation: Zwei Personen würfeln mehrmals mit zwei Würfeln
W1 und W2 gegeneinander. Wer die höhere Augenzahl würfelt, hat den Wurf gewonnen und bekommt
einen Punkt. Die Würfel W1 und W2 können unterschiedliche Zahlen auf ihren sechs Seiten haben und
somit besser oder schlechter sein. Z.B. ist ein Würfel, der auf allen sechs Seiten eine 6 hat offensichtlich besser als einer, der auf allen sechs Seiten eine 1 hat. Aber was ist mit den folgenden 4 Würfeln?
W1: 0 0 4 4 4 4
W2: 3 3 3 3 3 3
W3: 2 2 2 2 6 6
W4: 1 1 1 5 5 5
In einem Kampf W1 gegen W2 wird W1 im Durchschnitt
2/3 aller Würfe gewinnen (mit 4 zu 3) und
1/3 aller Würfe verlieren (mit 0 zu 3).
W1 ist also (ca. 33 %) besser als W2.
Aus ganz ähnlichen Gründen gilt auch:
W2 ist besser als W3.
W3 ist besser als W4.
Und erstaunlicherweise auch: W4 ist besser als W1.
Quelle: Martin Gardner, "The Colossal Book of Mathematics",
W. W. Norton & Company, ca. 700 Seiten, 35,- US$
BHT, TB3-IN3
5. SU Mo 31.10.11
8.2 Prozeduren und Funktionen
Auf S. 193 die Tabelle ansehen und besprechen.
3 Programme selbst ausführen (S. 41)
Die Übung Schleifen (ausführen) 1 austeilen und bearbeiten.
WS11/12, Seite 14
BHT, TB3-IN3
Stichworte
WS11/12, Seite 15
6. SU Mo 07.11.11
Heute kein Test
Prozeduren und Funktionen, Ergänzung
Programmiersprachen, in denen es (beliebig oft veränderbare) Variablen gibt, bezeichnet man auch als
prozedurale Sprachen (weil es in diesen Sprachen außer Funktionen auch Prozeduren gibt).
Beispiele: Fortran, Cobol, Algol60, Pascal, C/C++, Java, C#, Perl, Python, ...
Programmiersprachen, in denen es keine (beliebig oft veränderbare) Variablen gibt, bezeichnet man auch
als funktionale Sprachen (weil es in diesen Sprachen nur Funktionen, keine Prozeduren gibt).
Beispiele: Lisp, Opal, Scheme, Haskell, Gentle, SQL, XSLT, ...
Beispiele für Programme, die man besonders leicht und elegant in einer funktionalen Sprache schreiben
kann: Compiler.
Für Programme, in denen große Datenstrukturen (z.B. große Reihungen, engl. arrays) häufig verändert
werden müssen, sind in der Regel prozedurale Sprachen besser geeignet.
Fallunterscheidungs-Anweisungen
if-Anweisungen (mit oder ohne else)
Aus wie vielen Teilen und was für Teilen besteht eine if-Anweisung ohne else?
(sie besteht aus 1 boolean-Ausdruck und 1 Anweisung)
Ebenso für eine if-Anweisung mit else?
(sie besteht aus 1 boolean-Ausdruck und 2 Anweisungen)
Bezeichnungen für die Teile: Bedingung, then-Rumpf, else-Rumpf.
switch-Anweisungen
Sie fahren auf eine kleine Insel und dürfen nur if-Anweisungen oder nur switch-Anweisungen
mitnehmen. Welche würden Sie wählen?
Merke: switch-Anweisungen sind "elegante Abkürzungen für bestimmte if-Anweisungen", aber notfalls geht es auch ohne switch, nur mit if.
S. 65, Aufgabe-01: char-Variable c, Meldung, je nachdem ob '(', ')', '[', ']' oder anderes Zeichen
S. 65, Beispiel-01: Lösung mit if
S. 65, Beispiel-02: Lösung mit switch
Was darf in C in den runden Klammern nach dem Schlüsselwort "switch" stehen?
(ein Ausdruck eines beliebigen Ganzzahltyps wie short, int, long, char, ...)
In Java darf dort ein Ausdruck eines "kleinen Ganzzahltyps" stehen (d.h. der Typ long ist verboten).
Seit Java 7 darf dort auch ein String-Ausdruck stehen.
Was darf nach dem Schlüsselwort "case" stehen?
(Ein konstanter Ausdruck, d.h. ein Ausdruck, dessen Wert man schon beim Lesen des Programm-Textes
berechnen kann, nicht erst dann, wenn das Programm ausgeführt wird).
S. 67, Beispiel-05: Eine switch-Anweisung mit "komplizierteren konstanen Ausdrücken nach case"
BHT, TB3-IN3
6. SU Mo 07.11.11
WS11/12, Seite 16
Reihungen (engl. : arrays)
S. 150, Beispiel-01
S. 150, Beispiel-02
S. 151, Beispiel-03
S. 151, Beispiel-04
S. 152, Beispiel-05
Übung Schleifen (programmieren) 2 austeilen und bearbeiten.
Zur Entspannung: 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. Wichtige Programmiersprachen:
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
Ada
Erste höhere Programmiersprachen
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
Plattformunabhängigkeit
Klassen
Sehr gut: Er hat immer wieder von vorn angefangen.
Schlecht: Er hat immer wieder von vorn angefangen.
(von Wirth)
(von Wirth)
(von Wirth)
(von Wirth)
(von Wirth)
BHT, TB3-IN3
Stichworte
WS11/12, Seite 17
7. SU Mo 14.11.11
Heute in der Übung: Test 5
for-i- und for-each-Schleifen
Aus wie vielen Teilen besteht eine for-Schleife und wie heissen diese Teile?
S. 75, Bild 4-1
Speziell zum Bearbeiten von Reihungen (engl.: arrays) und Sammlungen (engl.: collections)
gibt es (seit Java 5) auch for-each-Schleifen:
S. 153, Beispiel-06
Regel: Wenn eine for-each-Schleife möglich ist, sollten Sie sie nehmen
(sonst erfolgt möglicherweise ein Punktabzug!).
Referenzvariablen und der Wert null
Der Wert einer Referenzvariablen R kann die Referenz eines Objeks Z sein.
In diesem Fall bezeichnen wir Z auch als den Zielwert von R.
Der Wert einer Referenzvariablen R kann aber auch gleich null sein.
In diesem Fall hat die Variable R keinen Zielwert.
Statt null fände ich die Bezeichnung NaR (wie "not a reference") besser, um die Ähnlichkeit zu den
NaN-Werten bei Gleitpunkttypen deutlich zu machen.
7.1 Reihungen vereinbaren und als Bojen darstellen
Jede Reihung hat einen Typ (z.B. Reihung-von-long-Variablen) und
einen Komponententyp (im Beispiel: long).
Reihungen mit einem primitiven Komponententyp sehen ein bisschen anders aus als
Reihungen mit einem Referenztyp als Komponententyp.
Merke: Alle Reihungstypen sind Referenztypen (keine primitiven Typen)
S. 155, Beispiel-01: Vereinbarung einer Reihung mit einem
primitiven Komponententyp (long)
Von welchem Typ ist die Variable lr01? (Vom Typ Reihgung-von-long-Variablen)
S. 156, Bild 7.1 Die Reihung lr01 in ausführlicher Bojendarstellung
S. 157, Bild 7.2 Die Reihung lr01 in vereinfachter Bojendarstellung
In der vereinfachten Darstellung darf man die (unveränderbare) length-Variable und
die Referenzen der Komponenten-Variablen (im Beispiel sind das die Referenzen <35> bis <39>) weglassen (aber nicht die Referenz der Reihungsvariablen, im Beispiel ist das <45>).
S. 157, Beispiel-02: Vereinbarung einer Reihung mit einem
Referenztyp als Komponententyp (StringBuilder)
Von welchem Typ ist die Reihung sr01? (Vom Typ Reihung-von-String-Variablen)
Die Komponenten dieser Reihung sind Referenzvariablen (genauer: String-Variablen) ohne Namen.
Anstelle eines Namens hat jede Komponente einen Index.
Merke:
Die Referenzen und Werte der Komponenten liegen innerhalb der Reihung.
Die Zielwerte der Komponenten liegen ausserhalb der Reihung!
Daraus folgt: Ein Zielwert kann gleichzeitig zu mehreren Reihungen und
mehrmals zur selben Reihung gehören.
BHT, TB3-IN3
7. SU Mo 14.11.11
WS11/12, Seite 18
Zur Erinnerung: Eine Referenzvariable (eine Variable eines Referenztyps) kann
den Wert null haben (dann hat sie keinen Zielwert) oder
einen anderen Wert (dann hat sie einen Zielwert).
In Java sind die Zielwerte von Referenzvariablen immer Objekte.
Beispiel: Ein StringBuilder-Objekt welches gleichzeitig in zwei Reihungen enthalten ist
(und in einer Reihung sogar zweimal):
1
2
3
4
5
6
7
8
9
10
StringBuilder[] sbrA = {
new StringBuilder("ABC"),
new StringBuilder("DE"),
};
StringBuilder[] sbrB = {
sbrA[0],
new StringBuilder("FGHI"),
sbrA[0],
}
Die Reihungen sbrA und sbrB als Bojen dargestellt:
sbrA
sbrB
110
120
210
220
0
310
410
"ABC"
1
320
420
"DE"
"FGHI"
410
330
0
430
340
1
410
350
2
Hier sieht man 2 Reihungsobjekte (fett umrandet) und
3 StringBuilder-Objekte (["ABC"], ["DE"] und ["FGHI"]).
1. Wie viele Variablen werden hier insgesamt dargestellt?
2. Wie viele dieser Variablen haben einen (einfachen) Namen?
3. Geben Sie von jeder Variablen an, zu welchem Typ sie gehört ("nach welchem Bauplan sie gebaut
wurde").
4. Mehrere Variablen haben gleiche Werte. Wie viele Variablen sind das?
5. Was kann man über die Zielwerte dieser Variablen (die gleiche Werte haben) sagen?
Anmerkung: Die StringBuilder-Objekte sind hier nur angedeutet und nicht realistisch dargestellt.
Jedes StringBuilder-Objekt ist ein Modul, der unter anderem folgendes enthält:
60 öffentliche Methoden
4 private Methoden
2 "halb private" Variable, davon eine names value vom Typ char[] (in dieser Reihung stehen die
Zeichen des StringBuilder-Objekts, aber man kann von außen nicht direkt darauf zugreifen).
BHT, TB3-IN3
Stichworte
WS11/12, Seite 19
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 hundert 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.
Was bezeichnet der Name einer Variablen?
Aus wie vielen und welchen Teilen besteht eine Variable mindestens? (2, Referenz, Wert)
Aus wie vielen und welchen Teilen besteht eine Variable höchstens? (4, plus Name, Zielwert)
Welcher Teil der Variablen ist gemeint, wen wir ihren Namen in den Befehlen eines Java-Programms erwähnen?
11
12
13
14
15
16
17
18
String st1 = new String("Hallo!);
String st2 = null;
// Welchen Teil von st1 bezeichnet der Name "st1"?
... st1.equals("Sonja") ... // Den Zielwert
... st1 == st2 ...
// Den Wert
st1 = "Sonja";
// Die Referenz
pln(st1);
// Den Wert
// Den Zielwert (sonst)
7.2. Die Erzeugung einer Reihung in 3 Schritten (S. 161)
BHT, TB3-IN3
8. SU Mo 21.11.11
WS11/12, Seite 20
8. SU Mo 21.11.11
Heute in der Übung: Test 6
Klassen und Objekte (Beginn eines größeren Kapitels)
Zur Erinnerung: Was ist ein Modul? (Ein Behälter für ..., mind. 2 Teile: öffentlich, privat)
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 350 Zeichen als Ziffern (d.h.
isDigit(c) liefert true). Einige davon werden im Folgenden dargestellt (aber für einige enthält der
Font Arial Unicode MS offenbar keine passende Darstellung):
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 (es
sind 13 öffentliche Methoden und 0 Variablen).
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).
Diese Seite ausdrucken und während der Vorlesung austeilen!
BHT, TB3-IN3
Stichworte
WS11/12, Seite 21
Jetzt das Gleiche nochmal, aber mit mehr Details:
Vergleich: Eine Klasse (in Java) ist eine Art Kombiwerkzeug, ähnlich wie ein Schraubenzieher, der
gleichzeitig ein Kugelschreiber ist. Eine Klasse ist gleichzeitig ein Modul und ein Bauplan für Module.
Def.: Eine Methode ist ein Unterprogramm, welches in einer Klasse vereinbart wurde.
Def.: Ein Attribut (engl. field) ist eine Variable, die in einer Klasse vereinbart wurde.
9 Klassen (S. 201)
S. 203, Beispiel-01: Die Klasse Zaehler01
Wie viele Dinge gehören zum Modulaspekt der Klasse Zaehler01 und wie heißen diese Dinge?
Wie viele Dinge gehören zum Bauplanaspekt der Klasse Zaehler01 und wie heißen diese Dinge?
Wie erkennt man beim Lesen einer Klasse einer Konstruktor?
Die Vereinbarung sieht aus wie die einer Methode, aber ohne Ergebnis-Typ.
Konstruktoren heißen genau wie die Klasse, zu der sie gehören.
Wenn man mit new ein neues Objekt erzeugen läßt, muss man unmittelbar hinter new immer einen Konstruktor aufrufen, z.B. so:
... new Zaehler(123L) ...
S. 204, Bild 9.1 Der Modulaspekt der Klasse Zaehler01
S. 205, Beispiel-02: Drei Zaehler01-Variablen und drei Zaehler01-Objekte werden erzeugt
S. 205, Bild 9.2: Die Variablen zafer ud zelia als Bojen
Den Befehl in Zeile 26 schrittweise ausführen
Was für eine Art von Befehl ist das? (Eine Vereinbarung, genauer: eine Variablen-Vereinbarung)
Der new-Befehl baut ein neues Objekt und initialisiert alle Attribute (Variablen) standardmäßig.
S. 206, Bild 9.3
Dann wir der Konstruktor ausgeführt und kann die Initialwerte der Variablen noch ändern.
S. 206, Bild 9.4
Der new-Befehl liefert eine Referenz, die auf das neu erzeugte Objekt zeigt.
Zur Entspannung: Selbstzutreffende ("autologische") Worte
Es gibt Worte, die offenbar auf sich selbst zutreffen, z. B. Hauptwort (ist ein Hauptwort), deutsch (ist
ein deutsches Wort), English (ist ein englisches Wort), kurz (ist ein ziemlich kurzes Wort) und dreisilbig (ist dreisilbig). Solche Worte bezeichnen wir hier als selbstzutreffend.
Worte, die nicht auf sich selbst zutreffen, bezeichnen wir als selbstunzutreffend, z. B. zweisilbig (ist
dreisilbig), Tätigkeitswort (ist ein Hauptwort) und englisch (ist ein deutsches Wort).
Frage: Ist jedes Wort entweder selbstzutreffend oder selbstunzutreffend? Was ist mit dem Wort
selbstunzutreffend? Ist es selbstzutreffend oder selbstunzutreffend?
Wenn noch Zeit ist:
9.2 Eine Klasse mit Attributen eines Referenztyps (S. 211)
S. 211, Beispiel-04: Ein Bauplan für etwas kompliziertere Objekte
Wie viele Konstruktoren werden in der Klasse Person00 vereinbart?
Elemente sind alle Dinge, die in einer Klasse vereinbart wurden, ausser den Konstruktoren.
Wie viele Elemente werden in der Klasse Person00 vereinbart und wie heißen sie?
BHT, TB3-IN3
9. SU Mo 28.11.11
WS11/12, Seite 22
9. SU Mo 28.11.11
Heute in der Übung: Test 7
Klausur: Mi 01.02.2012, 18-20 Uhr, Beuth-Saal
In der 10. Übung am 05.12.2011: Nach dem Test kommt ein Mensch, der sich auf eine Prof-Stelle an der
Beuth-Hochschule bewirbt, und hält im Raum D17 eine Probevorlesung (Thema: "Generische Datentypen in Java", sehr wichtig für die Klausur!). Nach der Vorlesung werden Sie nach Ihrem Eindruck gefragt (soll der Bewerber eingestellt werden oder nicht?). Damit hat Ihre Meinung einen wichtigen Einfluß auf die Zukunft der Beuth-Hochschule.
10.2 Objekte mit Hilfe von Bojen genauer verstehen (S. 228)
Druckfehler: Im Beispiel-01, Zeile 1, sollte es "Guten Morgen!" heissen (statt "Guten Tag!")
S. 228, Bild 10.1 Zwei Bojen für dieselbe Variable s01 besprechen
S. 230, Beispiel-02: String-Variablen ohne und mit new initialisieren
Haben wir letztes Mal schon kurz besprochen, hier noch mal ein vollständiges Beispiel
10.3 Die Klasse StringBuilder
Ein StringBuilder-Objekt enthält eine Zeichenkette und viele Methoden, mit der man die Zeichenkette verändern kann.
Die Zeichenkette steht in einer privaten Variablen vom Typ char[]. Die Länge dieser Reihung bezeichnet man als die Kapazität (engl: capacity) des Objekts. Die Anzahl der (mit char-Werten) belegten
Komponenten bezeichnet man als Länge (engl: length) des Objekts.
Die schnellsten Änderungsmethoden sind die append-Methoden. Methoden wie insert, replace
und delete müssen evtl. viele Komponenten der char[]-Reihung verschieben.
10.4 Die Klasse ArrayList
Die Objekte dieser Klasse haben Ähnlichkeit mit Reihungen, enthalten aber (anders als Reihungen) viele
"komfortable Methoden" zum Einfügen, Suchen und Löschen von Komponenten.
Wichtigster Unterschied zwischen Reihungen und ArrayList-Objekten:
"Reihungen sind aus Beton", aber "ArrayList-Objekte sind aus Gummi".
Die Klasse ArrayList gehört zu den sog. Sammlungsklassen (engl: collection classes) und
die Objekte der Klasse ArrayList werden auch als Sammlungen (engl: collections) bezeichnet.
Aus einer Sammlung einer bestimmten Klasse (z.B. ArrayList) läßt sich ganz leicht eine Sammlung einer
anderen Sammlungsklasse (z.B. TreeSet oder HashSet etc.) mit denselben Komponenten erzeugen.
10.6 Die Klassen BigInteger und BigDecimal
Mit einem Objekt der Klasse BigInteger kann man eine praktisch beliebig große Ganzzahl darstellen
(Zahlen mit 10 Millionen Ziffern sind kein Problem).
Mit einem Objekt der Klasse BigDecimal kann man einen praktisch beliebig großen und genauen Dezimalbruch darstellen (Dezimalbrüche mit 10 Millionen Ziffern vor und 10 Millionen Ziffern nach dem
Punkt sind kein Problem).
Kommerzielle Berechnungen (wo es um Geldbeträge geht) sollte man auf keinen Fall mit Gleitpunktzahlen (vom Typ float oder double) durchführen, sondern mit Objekten der Klassen BigInteger
bzw. BigDecimal.
BHT, TB3-IN3
Stichworte
WS11/12, Seite 23
10.7 Die Klasse Formatter und die printf-Methode
Die Funktion printf in C/C++ ist sehr nützlich und leistungsfähig, hat aber auch ein paar Schwächen
(z.B. können falsche printf-Befehle zu einem Programmabsturz führen und
man kann mit der printf-Funktion kein Daten von selbst definierten Typen formatieren, d.h. man
kann printf nicht "erweitern").
Die Methode format (alias printf) in Java ist ähnlich nützlich und leistungsfähig wie die C/C++Funktion, und hat nicht deren Schwächen.
Auf meiner Netzseite gibt es 2 Applets (eTeachMePrintf und PrintfApplet), mit denen man
den Java-Befehl printf ausprobieren und erforschen kann.
12 Klassen erweitern (beerben)
Motivation: Wir haben eine "alte und bewährte" Klasse K1 und brauchen eine Variante K2 davon.
Was tun?
K1 ändern?
(Auf keinen Fall)
K1 kopieren und die Kopie ändern?) (Auf keinen Fall)
K1 zu K2 erweitern?
(Auf jeden Fall!)
S. 278, Beispiel-01: Die ("alte und bewährte") Klasse Person01
S. 278, Bild 21.1: Der Modulaspekt der Klasse Person01
S. 279, Bild 12.2: Ein Person01-Objekt
S. 280, Beispiel.02: Die Klasse Person02, eine Erweiterung der Klasse Person01
S. 281, Bild 12.3: Der Modulaspekt der Klasse Person02
S. 281, Bild 12.4: Ein Person02-Objekt (als "Zwiebel" dargestellt)
Zur Entspannung: Charles Babbage (1791-1871)
Forschte auf verschiedenen Gebieten. Unternahm mehrere Versuche, mechanische Rechenmaschinen zu
bauen. Keine davon wurde funktionstüchtig, aber seine Pläne und Überlegungen dazu waren wichtige
Stationen auf dem Weg zu Computern.
1823 Difference Engine no. 1 (in die Entwicklung floßen 17000 Pfund, was etwa dem Preis von zwei
Schlachtschiffen entsprach)
1833 Analytical Engine (die sollte sogar schon programmierbar werden)
1847 Difference Engine no. 2 (wurde ab 1985 im Science Museum in London genau nach den Plänen
von Babbage gebaut und funktioniert)
Ada Byron, Lady Lovelace (1815-1852), Tochter des berühmten Dichters Lord Byron, arbeitete mit an
der Analytical Engine und gilt seitdem als erste Programmiererin. Nach ihr ist die Sprache Ada benannt
(ANSI/MIL-STD-1815, nach ihrem Geburtsjahr).
Weitere Erfindungen von Charles Babbage: Kuhfänger (für Lokomotiven, z. B. im Wilden Westen). Er
knackte als erster eine Vignére-Verschlüsselung (die vorher als sicher galt). Schrieb das Buch Economy
of machinery and manufactures, eine Analyse des Frühkapitalismus und wichtige Quelle für Karl Marx.
BHT, TB3-IN3
10. SU Mo 05.12.11
WS11/12, Seite 24
10. SU Mo 05.12.11
Heute in der Übung: Test 8
Danach: Probevorlesung eines Bewerbers auf eine Prof-Stelle an der Beuth Hochschule, im Raum D17
12.2 Allgemeine Regeln zum Beerben und Vererben (S. 283)
S. 285, Bild 12.7: Ein Typgraf mit vielen Typen (und noch mehr Auslassungen)
Erbregel-1 bis -6 besprechen
Aus diesen Regeln folgt: Alle Java-Klassen bilden einen Baum mit der Klasse Object an der Wurzel.
Hinweis: Der Graf im Bild 12.7 heißt Typgraf (und nicht Klassengraf) weil es in Java ausser Klassen
auch noch andere (Referenz-) Typen gibt, nämlich
Reihungstypen (wie int[] oder String[] oder StringBuilder[][][] etc.)
Generische Typen (wie ArrayList<Integer> oder ArrayList<String> etc.)
Schnittstellentypen (wie Serialzable, Cloneable, Comparable etc.)
Diese "anderen Typen" sind auch Untertypen von Object und können in einen Typgrafen eingezeichnet werden.
Die 8 primitiven Typen sind nicht Untertypen von Object und haben keinen Platz in einem Typgrafen.
S. 286, Def. Typgraf
Die 4 Begriffe direkte Unterklasse, Unterklasse, direkte Oberklasse, Oberklasse
Noch eine Motivation dafür, Unterklassen zu vereinbaren
Angenommen wir haben vor, mehrere Klassen ("... Baupläne für Objekte") zu schreiben, die "sich überlappen", d.h. bestimmte Elemente kommen in jeder von diesen Klassen vor. Statt diese "gemeinsamen
Elemente" in jeder Klasse erneut zu vereinbaren, vereinbaren wir eine Oberklasse, die nur die gemeinsamen Elemente enthält, und erweitern diese Oberklasse dann mehrmals.
12. 3 Ein größeres Beispiel für Beerbung (S. 286)
S. 286, Bild 12.8 Ein Typgraf mit 6 Typen
5 dieser Typen sind Klassen, deren Programmierung wir jetzt "nachvollziehen" wollen.
Mit den Objekten der 5 Klassen soll man geometrische Figuren wie Rechtecke, Quadrate, Ellipsen, Kreise etc. darstellen können (z.B. in einem grafischen Editor). Jede dieser Figuren hat einen Mittelpunkt.
Also vereinbaren wir zuerst eine Klasse E01Punkt (S. 287)
Wie viele Elemente gehören zum Modulaspekt der Klasse E01Punkt? (0)
Wie viele und was für Attribute werden in jedes E01Punkt-Objekt eingebaut? (2, x, y)
Wie viele und was für Methoden werden in jedes E01Punkt-Objekt eingebaut? (4, urAbstand, ...)
Wie viele Konstruktoren werden in der Klasse E01Punkt vereinbart? (einer)
Wie viele Parameter hat der Konstruktor? (2) Wie heißen die Parameter? (x, y)
Was ist merkwürdig an diesen Namen? (Sie stimmen mit den Namen der Attribute x, y überein)
Jedes Objekt enthält eine Variable namens this, die auf das Objekt selbst zeigt.
Im Kontruktor bezeichnet this.x das Attribut x und x (ohne this davor) bezeichnet den Parameter x.
Was macht der Konstruktor mit seinen Parametern x und y? (Er initialisiert damit die Attribute x und y)
Zur Entspannung: Christian Morgenstern (1871 - 1914)
Der Werwolf Ein Werwolf eines Nachts entwich / von Weib und Kind und sich begab
BHT, TB3-IN3
Stichworte
WS11/12, Seite 25
S. 288, die Klasse E01Rechteck
Was besagt oder bewirkt die Zeile 32 (class E01Rechteck extends E01Punkt)?
Wie viele Attribute werden in der Klasse E01Rechteck vereinbart und wie heißen sie?
(2, seiteX, seiteY)
Wie viele Attribute werden in jedes E01Rechteck-Objekt eingebaut und wie heißen sie?
(4, x, y, seiteX, seiteY)
Ebenso wie für Attribute auch für Methoden.
Aufgabe: Vereinbaren Sie eine Klasse namens E01Quadrat als Erweiterung
der Klasse E01Rechteck.
BHT, TB3-IN3
11. SU Mo 12.12.11
WS11/12, Seite 26
11. SU Mo 12.12.11
Heute in der Übung: Test 9
Die Probevorlesung von Prof. Funk in der Übung am 05.12.11
Wie fanden Sie diese Vorlesung? Gute Seiten? Weniger gute Seiten?
Hier eine kleines Ergänzung zum Thema Generizität:
1. Zuerst gab es ungetypte Programmiersprachen (z.B. Assemblersprachen).
Vorteil: Der Programmierer durfte alles, der Compiler/Assembler hat (fast) nichts verboten.
Nachteil: Der Compiler/Assembler hat (fast) keine Flüchtigkeitsfehler des Programmierers entdeckt.
2. Dann hat man getypte Programmiersprachen erfunden
Vorteil: Der Compiler konnte viele Flüchtigkeitsfehler des Programmierers entdecken.
Nachteil: Bestimmte Konstrukte musste man mehrmals hinschreiben, weil sie "nur für einen bestimmten
Typ funktionierten", z.B.
ein Unterprogramm zum Suchen in einer Reihung mit String-Komponenten und
ein Unterprogramm zum Suchen in einer Reihung von int-Komponenten etc.
3. Da hat man generische Konstrukte erfunden, in denen anstelle von festen Typnamen wie String und
int etc. auch Variablen für Typen vorkommen dürfen.
Beispiel für ein solches generisches Konstrukt:
ein Unterprogramm zum Suchen in einer Reihung von T-Komponenten (wobei T eine Typvariable ist).
Dieses Unterprogramm darf man
auf Reihungen von String-Komponenten und
auf Reihungen von int-Komponenten etc. anwenden.
Generische Konstrukte dienen also dazu, "unangenehme Härten" eines Typsystems "ein bisschen aufzuweichen" und so Vorteile von ungetypten und von getypten Sprachen zu kombinieren.
Ein wichtiger Unterschied zwischen generischen Klassen in Java und in C++?
Wenn man in einem C++-Programm die Typen
Vector<String>, Vector<Punkt> und Vector<Person> verwendet, dann
baut einem der Compiler drei Kopien der Klasse Vector<T> in das Maschinenprogramm ein.
Wenn man in einem Java-Programm die Typen
ArrayList<String>, ArrayList<Punkt> und ArrayList<Person> verwendet, dann
baut einem der Compiler nur eine Kopie der Klasse ArrayList<T> in das Maschinenprogramm ein.
Generische Klassen in C++ sind sehr mächtig und kompliziert zu handhaben.
Generische Klassen in Java sind weniger mächtig und viel einfacher zu handhaben.
Noch eine Motivation dafür, Unterklassen zu vereinbaren
Sei OK eine Oberklasse von UK (und somit UK eine Unterklasse von OK). Dann gilt:
Überall in einem Java-Programm, wo ein OK-Objekt verlangt wird (z.B. als Parameter einer Methode)
darf man auch ein UK-Objekt angeben.
Begründung:
Da die Klasse UK alle Elemente der Klasse OK geerbt hat,
hat ein UK-Objekt alle Elemente eines OK-Objekts (und evtl. noch ein paar mehr).
Also "kann ein UK-Objekt alles, was ein OK-Objekt kann".
Wichtiges Beispiel: Was für Objekte kann man in folgender Reihung aufbewahren? (S. 295)
E01Punkt[] otto = new E01Punkt[150];
String-Objekte? (Nein!) Double-Objekte? (Nein?) E01Punkt-Objekte (Ja, natürlich)
Was noch? (E01Rechteck-Objekt, E01Ellipse-Objekte, E01Kreis-Objekte)
BHT, TB3-IN3
Stichworte
WS11/12, Seite 27
Objekte in Zwiebeldarstellung
Zur Erinnerung: Object <- E01Punkt <- E01Rechteck <- E01Quadrat
Ein Objekt einer Klasse wie E01Quadrat kann man sich als eine "Zwiebel mit mehreren Schichten"
vorstellen (S. 291, Bild 12.9)
In jeder "Schicht" können Attribute vereinbart sein. Das ist der Grund für folgende allgemeine
Regel für Konstruktoren: Der erste Befehl in jedem (!) Konstruktor K ruft einen Konstruktor der direkten Oberklasse auf (damit der die Attribute der "tiefer innen liegenden Zwiebelschichten" initialisieren
kann). Danach kann K dann die Attribute "seiner Schicht" initialisieren.
Konkret: Was macht der erste Befehl in jedem E01Quadrat-Konstruktor?
(er ruft einen Konstruktor der Klasse E01Rechteck auf)
Was macht der erste Befehl in diesem E01Rechteck-Konstruktor?
(er ruft einen Konstruktor der Klasse E01Punkt auf)
Was macht der ertste Befehl in diesem E01Punkt-Konstruktor?
(er ruft einen Konstruktor der Object auf)
Was macht der erste Befehl in diesem Object-Konstrukor?
(nichts, weil Object keine Oberklasse und keine Attribute hat)
Wenn man einen Konstruktor programmiert, kann man obige Regel selbst "erfüllen", indem man als ersten Befehl im Rumpf einen Konstruktor der direkten Oberklasse aufruft, z.B. so:
super(17, "ABC", true)
Wann wird dieser Befehl vom Ausführer akzeptiert bzw. abgelehnt?
(akzeptiert, wenn es in der direkten Oberklasse einen Konstruktor mit 3 Parametern der Typen int,
String und boolean gibt, sonst abgelehnt)
Wenn man obige Regel nicht selbst "erfüllt", erfüllt der Ausführer sie, indem er als ersten Befehl des
Konstruktors folgenden Befehl einfügt:
super();
Wann wird dieser Befehl vom Ausführer akzeptiert bzw. abgelehnt?
(akzeptiert, wenn es in der direkten Oberklasse einen Standardkonstruktor gibt, sonst abgelehnt)
Zur Erinnerung: Die Hartz-4 Regel für Klassen?
(Wenn der Programmierer in einer Klasse keinen einzigen Konstruktor vereinbart, bekommt die Klasse
vom Ausführer einen Standardkonstruktor mit leerem Rumpf "geschenkt")
12.5 Kleinere und größere Klassen und Objekte (S. 300)
Was ist größer: Eine Oberklasse OK oder eine Unterklasse UK?
Korrekte Antwort: Tja!
Erläuterung anhand von S. 301, Bild 12.10
Wozu Untertypen gut sind
S. 296, Beispiel-02: Eine Reihung mit E01Punkt-Objekten ausgeben ("die Horror-Version")
Für diese Methode spricht nur: "Sie läuft aber und produziert die richtigen Ergebnisse".
Das reicht aber bei weitem nicht aus!!
S. 298, Beispiel-03: Eine Reihung mit E01Punkt-Objekten ausgeben (so muss man es machen)
BHT, TB3-IN3
11. SU Mo 12.12.11
WS11/12, Seite 28
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.
BHT, TB3-IN3
Stichworte
WS11/12, Seite 29
12. SU Mo 19.12.11
Heute in der Übung: Test 10
12.7 Der Typ und der Zieltyp einer Referenz-Variablen (S. 303)
S. 304, Beispiel-01, Zeile 1:
Von welchem Typ ist die Variable p01? (E01Punkt)
Von welchem Typ ist ihr Zielwert (das Objekt, auf das sie zeigt)? (E01Punkt)
Zeile 5, ebenso.
Zeile 7 bis 11, ebenso.
Merke: Der Typ einer Variablen ist unveränderbar (das gilt auch für Referenzvariablen).
Der Zieltyp einer Referenzvariablen kann verändert werden (durch eine Zuweisung).
14 Abstrakte Klassen und Schnittstellen (S. 335)
Wiederholung: Eine Reihung, die Objekte verschiedener Typen enthalten kann:
E01Punkt[] pr = new E01Punkt[150];
Was für Objekte können Komponenten dieser Reihung sein?
(Objekte der Typen E01Punkt, E01Rechteck, E01Quadrat, E01Ellipse, E01Kreis)
Auf welche Elemente einer Komponenten pr[i] können wir zugreifen?
(Nur auf die in der Klasse E01Punkt vereinbarten Elemente)
Auf welche Methoden, die in allen Unterklassen von E01Punkt vereinbart sind, können wir
nicht zugreifen? (Auf die Methoden getUmfang und getFläche)
Daraus folgt: E01Punkt ist keine gute Wurzelklasse unserer kleinen Klassenhierarchie
(die z.B. auf S. 301, Bild 12.10 abgebildet ist).
Eine bessere Wurzelklasse: S. 336, Beispiel-01: Die abstrakte Klasse E02GeoFigur
Die zwei wichtigsten Eigenschaften einer abstrakten Klasse wie E02GeoFigur:
1. Ein Befehl wie new E02GeoFigur(1.5, 2.5) ist nicht erlaubt (obwohl die Klasse einen entsprechenden Konstruktor enthält!)
2. Eine abstrakte Klasse darf (ausser Konstruktoren und "konkreten Elementen" auch) abstrakte Objektmethoden enthalten.
Wie viele abstrakte Objektmethoden enthält die Klassewie E02GeoFigur und wie heißen sie?
(2, getFlaeche, getUmfang)
Merke: Nur Objektmethoden können abstrakt sein, es gibt keine abstrakten Klassenmethode;
"abstrakte Methode" ist also immer eine Abkürzung für "abstrakte Objektmethode".
Regel: Jede konkrete Klasse, die eine abstrakte Methode erbt, muss sie durch eine konkrete Methode
überschreiben.
S. 337, die Klasse E02Rechteck (zum Vergleich: S. 288, die Klasse E01Rechteck)
Wo in der Klasse E02Rechteck werden die von E02GeoFigur geerbten abstrakten Methoden überschrieben? (In den Zeilen 51 und 52)
S. 339, Bild 14.1 Eine bessere Klassenhierarchie
Was ist an folgender Reihung gr besser als bei pr?
E02GeoFigur[] gr = E02GeoFigur[150];
Der Java-Ausführer ist jetzt sicher, dass jede Komponente gr[i] auch Methoden getUmfang und
getFläche hat. Deshalb dürfen wir auf diese Methoden zugreifen.
BHT, TB3-IN3
12. SU Mo 19.12.11
WS11/12, Seite 30
14.2 Schnittstellen (interfaces) (S. 341)
Eine Schnittstelle hat Ähnlichkeit mit einer Klasse und definiert (wie eine Klasse) einen Typ. Eine
Schnittstelle darf aber (etwas vereinfacht gesagt) nur abstrakte Methoden enthalten.
S. 341, Beispiel-01: Die Schnittstelle Vergroesserbar
Wie viele abstrakte Methoden enthält diese Schnittstelle? (2, verdopple und verdreifache)
S. 342: Schnittstellenregel-1: Eine Klasse darf beliebig viele (0, 1, 2, 3, ...) Schnittstellen
implementieren
S. 342, Beispiel-02: Die Klasse GanzZahl01 implementiert die Schnittstelle Vergroesserbar
Folge: Die Objekte dieser Klasse gehören jetzt außer zum Typ GanzZahl01 auch
zum Typ Vergroesserbar.
Eine Methode mit einem Vergroesserbar-Parameter:
1 static public void versechsfache(Vergroesserbar v) {
2
v.verdopple();
3
v.verdreifache();
4 }
Vokabeln und Bezeichnungen:
Eine Vergroesserbar-Klasse ist eine Klasse, die
die Schnittstelle Vergroesserbar implementiert.
Ein Vergroesserbar-Objekt ist ein Objekt einer Vergroesserbar-Klasse.
Allgemein: Sei S irgendeine Schnittstelle. Dann gilt:
Eine S-Klasse ist eine Klasse, die die Schnittstelle S implementiert (und nicht etwa ein Mercedes!)
Ein S-Objekt ist ein Objekt einer S-Klasse.
Zur Entsapannung: Ein bewiesenermaßen unlösbares Problem
Beispiel für eine D-Gleichung:
+7*x1 - 3*x2 + 5*y4 - 2*z5 = 0
Das Polynom auf der linken Seite der Gleichung darf Potenzen von beliebig vielen Variablen x, y,
z, x1, x2, ... aber nur ganzzahlige Koeffizienten (im Beispiel: +7, -3, +5, -2) enthalten.
Bei D-Gleichungen interessiert man sich nur für ganzzahlige Lösungen.
Beispiele: D-Gleichungen mit und ohne Lösungen
5
6
7
8
9
10
x2
x2
x1
x2
x2
x4
+
+
+
-
2y2
4
5y1 - 8
y2 - z2
5
y4 - z4
=
=
=
=
=
=
0
0
0
0
0
0
//
//
//
//
//
//
Genau eine Lösung:
x= 0, y=0
Genau zwei Lösungen:
x= 2 und x=-2
unendlich viele Lösungen, z.B. x= 3, y=1
unendlich viele Lösungen, z.B. x=-5, y=4, z=3
keine Lösung (leicht zu sehen)
keine Lösung ausser der trivialen(schwer zu beweisen)
Schön wäre ein Programm, welches von jeder D-Gleichung feststellen kann, ob sie lösbar ist (d.h. mindestens eine Lösung hat) oder nicht. Leider wurde folgender Satz bereits bewiesen:
Satz: Es gibt keinen Algorithmus, der von jeder D-Gleichung korrekt feststellen kann,
ob sie lösbar ist oder nicht.
"D-Gleichungen" werden üblicherweise als "diophantische Gleichungen" bezeichnet, nach dem
griechischen Mathematiker Diophant von Alexandrien, der irgendwann zwischen 100 v.Chr. und 350
n.Chr. (vermutlich um 250 n.Chr.) lebte und 13 Bücher über Arithmetik veröffentlichte, von denen 10
bis heute erhalten geblieben sind.
BHT, TB3-IN3
Stichworte
WS11/12, Seite 31
13. SU Mo 02.01.12
Heute in der Übung Test 11
Wiederholung und Fortsetzung: Abstrakte Klassen und Schnittstellen
Was für Dinge darf man innerhalb einer Schnittstelle vereinbaren? (Abstrakte Objektmethoden)
Angenommen, wir vereinbaren eine Klasse UK ("unsere Klasse") wie folgt:
class UK extends AK implements I1, I2 {
...
}
Dabei soll AK eine abstrakte Klasse sein. Was müssen wir innerhalb von UK machen?
(Wir müssen alle abstrakten Methoden aus AK, I1 und I2 durch konkrete Methoden überschreiben)
Das Beispiel-01 (auf der nächsten Seite 32) austeilen und besprechen. Dann soll jeder in der Klasse
Schnittstelle01 eine geeignete hatWert-Methode ergänzen.
S. 341, Schnittstellenregel-01
S. 343, Schnittstellenregel-02
S. 346, Schnittstellenregel-03
9.4 Klassische Fachbegriffe
Was darf man innerhalb einer Klasse vereinbaren? Wie heißen die Dinge, die man innerhalb einer Klasse
vereinbaren darf? (Konstruktoren und Elemente)
Die Elemente, die in einer Klasse vereinbart werden (engl. the members declared in a class),
kann man nach drei Kriterien in (unterschiedlich viele) Gruppen einteilen:
Kriterium
Gruppen
Anzahl der Gruppen
nach Art
Attribut, Methode, Klasse, Schnittstelle
4
nach Aspektzugehörigkeit
Klassenelement (static member),
Objektelement (non-static member)
2
nach Erreichbarkeit öffentlich, geschützt, paketweit-erreichbar, privat
Man unterscheidet somit z.B.:
Öffentliche Klassenattribute,
geschützte Objektmethoden,
paketweit-erreichbare Klassen-Klassen (oder: paketweit-erreichbare statische Klassen)
private Objekt-Schnittstellen (oder: private nicht-statische Schnittstellen),
... etc.
Alle möglichen Kombinationen der Gruppeneigenschaften können vorkommen.
4
BHT, TB3-IN3
13. SU Mo 02.01.12
WS11/12, Seite 32
Arbeitsblatt, zum Austeilen im 13. SU
Beispiel-01: Eine Methode bearbeitet eine Reihung von Schnittstellen-Variablen
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
56
57
58
------------------------------------------------------------------// Datei HatWert.java
interface HatWert {
int wert(); // Diese Methode ist automatisch abstract und public
}
------------------------------------------------------------------// Datei K17.java
public class K17 implements HatWert {
int x;
int y;
public int wert() {
return 2*x + y;
}
K17(int x, int y) {
this.x = x;
this.y = y;
}
}
------------------------------------------------------------------// Datei K18.java
public class K18 implements HatWert {
int a;
public int wert() {
return a*a + a;
}
K18(int a) {
this.a = a;
}
}
------------------------------------------------------------------// Datei Schnittstelle04.java
public class Schnittstelle04 {
static public void main(String[] _) {
K17[] rk17 = {new K17(2, 5), new K17(3, 1), new K17(4, 0)};
K18[] rk18 = {new K18(3),
new K18(-4),
new K18(2)};
pln("Der maximale Wert in rk17: " + maxWert(rk17));
pln("Der maximale Wert in rk18: " + maxWert(rk18));
}
static int maxWert(K17[] r) {
int max = Integer.MIN_VALUE;
for (K17 ob : r) {
int w = ob.wert();
if (w > max) max = w;
}
return max;
}
...
// Eine Methode mit einem kurzen Namen:
static void pln(Object ob) {System.out.println(ob);}
}
Die Methode maxWert (ab Zeile 45) kann nur Parameter des Typs K17[] bearbeiten. Damit der Aufruf maxWert(rk18) (in Zeile 42) korrekt wird, könnten wir eine weitere maxWert-Methode mit einem Parameter vom Typ K18[] schreiben. Was wäre eine bessere Lösung?
BHT, TB3-IN3
Stichworte
WS11/12, Seite 33
9.5 Objektorientierte Programmierung
Angenommen, wir wollen 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.1. Wir fragen: Was sind die relevanten Daten einer StudentIn?
Mögliche Antwort: Name, Matrikel-Nr, Noten, ...
3.1. Wir fragen: Was sind die relevanten Aktionen mit Bezug auf eine StudentIn?
Mögliche Antworten: Einschreiben, belegen, eine-Note-bekommen, ...
2.2. Wir fragen: Was sind die relevanten Daten eines Hörsaals? ...
3.2. Wir fragen: Was sind die relevanten Tätigkeiten mit Bezug auf einen Hörsaal? ...
...
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.
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.
BHT, TB3-IN3
13. SU Mo 02.01.12
WS11/12, Seite 34
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: Aus einem Paket-mit-Namen kann man nicht auf Klassen im namenlosen Paket zugreifen,weil:
1. Wenn in einer Klasse K in einem Paket P z.B. der einfache Klassenname MeineKlasse steht, dann
bezeichet der eine Klasse im Paket P (sonst ist er falsch).
2. import-Befehle ohne Paket-Namen, z.B. import MeineKlasse;
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.
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:
K11
K12
K21
K22
im selben Paket wie K10
ja
ja
nein
nein
beerbt K10
ja
nein
ja
nein
Klasse
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.
BHT, TB3-IN3
Stichworte
WS11/12, Seite 35
14. SU Mo 09.01.12
Heute in der Übung Test12
Eine Schwäche der Sprache Java
Mit Hilfe von Paketen kann man innerhalb eines Programms mehrere Klassen verwenden, die den gleichen einfachen Namen haben(z.B. Test). Man muss nur dafür sorgen, dass die vollen Namen der Klassen sich unterscheiden (z.B. de.beuth-hochschule.Java.Test und de.tu-berlin.Klassen.Test). Bei Schnittstellen klappt das leider nicht immer.
Zur Erinnerung: Zum Profil einer Methode gehören der Rückgabetyp, der Methodenname und die Typen der Parameter. Nicht zum Profil gehören die Namen der Parameter und der Rumpf der Methode.
Eine konkrete Klasse K kann zwei abstrakte Methoden mit dem gleichen Profil P erben, z.B. so:
class K implements vonfirma01.test01, vonfirma02.test02 { ... }
Beide Schnittstellen test01 und test02 können z.B. eine abstrakte Methode
String codeword() mit dem Profil P gleich String codeword enthalten.
Die Klasse K kann aber nur eine konkrete Methode mit dem Profil P vereinbaren. Dass ist inhaltlich
nicht angemessen, wenn die Firma01 "etwas ganz anderes von der Methode codeword erwartet" als die
Firma02. Siehe dazu auch
http://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Java#Explicit_interface_implementation
Grabos (graphische Benutzeroberflächen, engl. GUI, graphical user interface)
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.
Konsolen-Programme und Grabo-Programme
Unterscheiden sich grundlegend voneinander. Charakteristische Eigenschaften:
Konsolen-Programm
Grabo-Programm
Ausführung
Ein Programm, wird sequentiell ausgeführt Mehrere Programmteile, die nebenläufig
zueinander ausgeführt werden
Steuerung
Das Programm steuert den Benutzer
(befiehlt ihm z.B., Daten einzugeben)
Der Benutzer steuert das Programm (z.B.
gibt er Daten ein, "wenn er Lust hat")
Bildschirm
zeichenorientiert (z.B. 25x80 Zeichen)
graphisch (z.B. 1280x1024 Pixel)
S. 531, Beispiel-01: Zwei JFrame-Objekte
S. 531, Bild 22.1
Der Programmierer kann Grabo-Klassen als Unterklassen von vorhandenen Grabo-Klassen vereinbaren.
S. 533, Beispiel-02: Die Klasse Grabo01 erweitert die Klasse JFrame
S. 534, Beispiel-03: Das Programm Grabo01Tst
S. 535, Bild. 22.2 (Druckfehler korrigieren: "Grabo01-Objekte" statt "JFrame-Objekte")
Plan: Wir wollen eine Fenster-Klasse Grabo02 mit folgender Eigenschaft schreiben:
Wenn der Benutzer beim Fenster eines Grabo02-Objekts den Fenster-Schließen-Knopf ("den mit dem
X darin") anklickt, soll eine von uns geschriebene Methode ausgeführt werden (und eine Meldung zur
Standardausgabe ausgeben)
Der Name der Methode, die beim Anklicken des Fenster-Schließen-Knopfes ausgeführt wird, ist von der
Sprache Java festgelegt: windowClosing.
BHT, TB3-IN3
14. SU Mo 09.01.12
WS11/12, Seite 36
S. 536, Beispiel-04: Die Klasse Grabo02
Innerhalb dieser Klasse müssen wir
1. Eine Klasse vereinbaren, die die Klasse WindowAdapter erweitert
und darin eine Methode namens windowClosing vereinbaren
2. Ein Objekt dieser Klasse erzeugen und
3. bei dem Grabo02-Objekt anmelden.
Zur Entspannung: Englische Vokabeln: boot, bootstrap
Ein boot ist ein hoher Schuh oder Schnürstiefel, ein bootstrap ein Schnürsenkel für einen Schnürstiefel.
Ein bootstrap gilt als simples Werkzeug, welches immer zur Hand ist und mit dem man sich andere
Werkzeuge "heranziehen kann", z. B. so: Eine Gruppe von Pfadfindern (natürlich alle in Schnürstiefeln)
will ein schweres Stahlkabel über einer Felsspalte anbringen. Dazu knüpfen sie zuerst ihre bootstraps
zusammen und ziehen damit ein dünnes Seil über die Felsspalte. Mit dem dünnen Seil ziehen sie ein dickeres Seil über die Felsspalte und mit dem dickeren Seil schliesslich das Stahlkabel.
Beim Booten eines Rechners liest der Prozessor zuerst von einem bestimmten Gerät einen einzigen Datenblock (z. B. 512 Byte) und springt dann zum ersten Byte dieses Blocks. Der Block sollte ein kleines
Ladeprogramm, enthalten, welches ein größeres Ladeprogramm (z. B. ein paar Tausend Bytes) von einer bestimmten Platte liest und zum Anfang dieses Ladeprogramms springt. Das größere Ladeprogramm
lädt dann wichtige Teile des Betriebssystems (ein paar Megabyte) und springt an eine Stelle in diesem
Betriebssystem.
BHT, TB3-IN3
Stichworte
WS11/12, Seite 37
15. SU Mo 16.01.12
Heute in der Übung Test13 (der letzte!)
Arbeitsblatt Anonyme Objekte und anonyme Klassen austeile und besprechen.
Fragen zu einigen Zeilen (des Arbeitsblattes) und Antworten dazu:
1
2
3
4
Was wird ausgegeben?
Hallo
Was wird ausgegeben?
Punkt(1.0, 2.0, 3.0)
Welchen Zielwert bekommt die Variable s? [10, 20, 30]
Ein Objekt von welchem Typ wird hier angemeldet? Bei welchem Objekt wird es angemeldet?
Anmerkung: Dieser Befehl steht in einem Konstruktor der Klasse Grabo02.
Angemeldet wird ein ProgTerminator-Objekt, beim aktuellen Objekt this, welches vom Konstruktor gerade initialisiert wird
5 Nach welchem Bauplan wird das Objekt, welches hier mit new erzeugt wird, gebaut?
Wodurch unterscheidet sich dieses Objekt von einem Punkt3D-Objekt?
Nach einem Bauplan, der einer (anonymen) Unterklasse von Punkt3D entspricht.
Das Objekt hat eine andere toString-Methode als ein Punkt3D-Objekt.
11 Nach welchem Bauplan wird das Objekt, welches hier nit new erzeugt wird, gebaut?
Wodurch unterscheidet sich dieses Objekt von einem WindowAdapter-Objekt?
Nach einem Bauplan, der einer (anonymen) Unterklasse von WindowAdapter entspricht.
Das Objekt hat eine andere windowClosing-Methode als ein WindowAdapter-Objekt.
18 Was ist ungewöhnlich am new-Befehl in dieser Zeile?
Der Befehl hinter new sieht aus wie der Aufruf eines Konstruktors der Schnittstelle ActionListener, obwohl Schnittstellen keine Konstruktoren haben.
24 Was wird ausgegeben? Was hat diese Ausgabe mit der Variablen pEn (siehe Zeile 5) zu tun?
Ausgegeben wird Point(10, 20, 30). Das anonyme Objekt, welches als Parameter von pln erzeugt
wird, stimmt genau mit dem Objekt pEn überein ("wie ein Zwilling").
Plan
Am Mo 23.01.2012 wird im SU die Klausur vorbereitet. In der Übung kann man sich schon auf die
Klausur vorbereiten.
Am Mo 30.01.2012 findet nur dann etwas statt (SU und/oder Ü), wenn ich spätestens 3 Tage vorher eine
Email bekommen habe, in der mindestens 3 Teilnehmer fest zusagen, zu kommen.
Am Mi 01.02.2012 schreiben wir (ab 18 Uhr, im Beuth-Saal) die Klausur.
Rückgabe der Klausur: Mo 06.02.2012, im 3. Block, Raum B345 ("wie immer")
BHT, TB3-IN3
15. SU Mo 16.01.12
WS11/12, Seite 38
22.4 Aktionen, Ereignisse, ...
Der Benutzer eines Grabo-Programms kann Aktionen ausführen (z.B. die Maus über einem Fenster bewegen, auf einen Knopf klicken, auf eine Taste der Tastatur drücken etc.)
Eine solche Aktion bewirkt, dass das betreffende Grabo-Objekt
(z.B. das JFrame-Objekt oder das JCheckBox-Objekt, mit dem der Benutzer gerade interagiert hat)
ein Ereignis-Objekt erzeugt
(z.B. ein WindowEvent-Objekt oder ein ActionEvent-Objekt)
und, mit diesem Ereignis-Objekt als Parameter, bestimmte Behandler-Methoden aufruft.
Die Behandler-Methoden müssen sich in Listener-Objekten befinden
(z.B. in WindowListener-Objekten oder in ActionListener-Objekten)
welche vorher bei dem betreffenden Grabo-Objekt angemeldet wurden.
Wie kann man herausfinden, was für Ereignisse die Objekte einer Grabo-Klasse GK erzeugen können?
1. Wir ermitteln alle addXXXListener-Methoden der Klasse GK.
Beispiele: Für GK gleich JFrame, JButton und JLabel sind das die folgenden Methoden:
Klasse JFrame
Klasse JButton
Klasse JLabel
addComponentListener
addFocusListener
addHierarchyBoundsListener
addHierarchyListener
addInputMethodListener
addKeyListener
addMouseListener
addMouseMotionListener
addMouseWheelListener
addComponentListener
addFocusListener
addHierarchyBoundsListener
addHierarchyListener
addInputMethodListener
addKeyListener
addMouseListener
addMouseMotionListener
addMouseWheelListener
addComponentListener
addFocusListener
addHierarchyBoundsListener
addHierarchyListener
addInputMethodListener
addKeyListener
addMouseListener
addMouseMotionListener
addMouseWheelListener
addContainerListener
addContainerListener
addPropertyChangeListener
addPropertyChangeListener
addContainerListener
addPropertyChangeListener
addPropertyChangeListener
addAncestorListener
addVetoableChangeListener
addAncestorListener
addVetoableChangeListener
addPropertyChangeListener
addPropertyChangeListener
addWindowFocusListener
addWindowListener
addWindowStateListener
addActionListener
addChangeListener
addItemListener
2. Wenn man vom Namen einer solchen Methode den Anfang add wegläßt, erhält man
den Namen einer sog. Listener-Schnittstelle (z.B. wird aus dem Methoden-Namen
addComponentListener der Schnittstellen-Name ComponentListener)
Jede solche Listener-Schnittstelle entspricht einer Oberart von Ereignissen,
die von GK-Objekten erzeugt werden können
3. Jede Methode in einer solchen Listener-Schnittstelle entspricht einer Art von Ereignissen,
die von GK-Objekten erzeugt werden können.
S. 546, Def.: Ereignis
S. 547, Arten von Ereignissen und Oberarten von Ereignissen
BHT, TB3-IN3
Stichworte
WS11/12, Seite 39
Arbeitsblatt für den 15. SU
Anonyme Objekte und anonyme Klassen
Beispiele für anonyme Objekte:
1
2
3
4
pln(new String("Hallo"));
pln(new Punkt3D(1.0, 2.0, 3.0));
String s = Arrays.toString(new int[]{10, 20, 30});
this.addWindowListener(new ProgTerminator()); // siehe Buch S. 536, Z. 63
Beispiele für benannte Objekte anonymer Klassen:
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Punkt3D pEn = new Punkt3D(1.0, 2.0, 3.0){ // pEn wie "Punkt auf Englisch"
public String toString() {
return super.toString().replace("Punkt", "Point");
}
};
static WindowAdapter arnold = new WindowAdapter() {
public void windowClosing(WindowEvent we) {
pln("Feierabend!")
System.exit(0);
}
};
static ActionListener alfred = new ActionListener() {
public void actionPerformed(ActionEvent ae) {
pln("Hab grad keine Lust!");
}
}
Beispiel für ein anonymes Objekt einer anonymen Klasse:
24
25
26
27
28
pln(new Punkt3D(1.0, 2.0, 3.0){
public String toString() {
return super.toString().replace("Punkt", "Point");
}
});
Fragen zu einigen Zeilen:
1
2
3
4
Was wird ausgegeben?
Was wird ausgegeben?
Welchen Zielwert bekommt die Variable s?
Ein Objekt von welchem Typ wird hier angemeldet? Bei welchem Objekt wird es angemeldet?
5 Nach welchem Bauplan wird das Objekt, welches hier mit new erzeugt wird, gebaut?
Wodurch unterscheidet sich dieses Objekt von einem Punkt3D-Objekt?
11 Nach welchem Bauplan wird das Objekt, welches hier nit new erzeugt wird, gebaut?
Wodurch unterscheidet sich dieses Objekt von einem WindowAdapter-Objekt?
18 Was ist ungewöhnlich am new-Befehl in dieser Zeile?
24 Was wird ausgegeben? Was hat diese Ausgabe mit der Variablen pEn (siehe Zeile 5) zu tun?
Anmerkung:
In einem Java-Quellprogramm ist die Zeichenfolge }); ist ein typisches Kennzeichen für
die Benutzung eines anonymen Objekts einer anonyomen Klasse.
BHT, TB3-IN3
15. SU Mo 16.01.12
WS11/12, Seite 40
Zur Entspannung: Kurt Gödel (1906-1978, Österreich-Ungarn, Princeton, USA)
Studierte Physik und Mathe in Wien, frühe Begabung für Mathe.
1931: "Über formal unentscheidbare Sätze der Principia Mathematica und verwandte Sätze". Die Principia Mathematika (3 Bände, erschienen 1910-1913) war ein philosophisch-mathematisch wichtiges Werk
von Bertrand Russell (1872-1970) und Alfred North Whitehead (1861-1947).
Mit diesem Papier zerstöre Gödel die Hoffnung des Mathematikers David Hilbert (1862-1943), alle mathematischen Sätze rein formal aus einer Basis von Axiomen abzuleiten.
1932: Habilitation in Wien.
1933: Hitler kam an die Macht.
1934: Vorlesungen in Princeton.
1938: "Anschluss" Österreichs an Deutschland.
1940: Auswanderung in die USA, bis 1978 in Princeton, Freund von Einstein. "Consistency of the Axiom of Choice and the Generalized Continuum Hypothesis with the Axioms of Set Theory".
Einer der bedeutendsten Mathematiker des 20. Jahrhunderts. Starb in einer Nervenheilanstalt an Unterernährung, weil er Angst vor einer Vergiftung hatte.
BHT, TB3-IN3
Stichworte
WS11/12, Seite 41
16. SU Mo 23.01.12
Heute kein Test.
Vorbereitung auf die Klausur (am Mi 01.02.2012, ab 18 Uhr, im Beuth-Saal)
1. Erlaubte Unterlagen: 5 Blätter (max. Größe: DIN A 4). Ob oder wie die Blätter beschriftet sind, können Sie frei wählen.
2. Tip: Während der Klausur erstmal alle Aufgaben "überfliegen", dann die leichteste Aufgabe bearbeiten, danach die zweitleichteste, ..., zuletzt die schwerste.
3. Schreiben Sie jede Ihrer Lösungen auf die Vorderseite eines neuen Blattes. Lassen Sie die Rückseite
Ihrer Lösungsblätter grundsätzlich leer.
4. Sie dürfen mit Bleistift schreiben.
Jetzt noch ein paar Bemerkungen zum Inhalt der Klausur
1. Sie sollten Ganzzahlen in jedes beliebige Zahlensystem umwandeln können (wie in Aufgabe 1) und
mit Java-Befehlen auf die einzelnen Ziffern einer Zahl zugreifen können (wie in den Aufgaben 2 und 5).
2. Beim Schreiben von Funktionen sollten Sie, wenn es möglich ist, die Regel "Einfache Fälle zuerst"
anwenden können und anwenden.
Beispiel-01:
1 public static boolean istPrim(int n) {
2
// Verlaesst sich darauf, dass n nicht negativ ist.
3
// Liefert true genau dann wenn n eine Primzahl ist.
4
5
// Einfache Fälle:
6
if (n <= 1) return false;
7
if (n == 2) return true;
8
if (n%2 == 0) return false;
9
10
// Kompliziertere Fälle:
11
...
Beispiel-02:
12 public static int hoch(int b, int exp) {
13
// Verlaesst sich darauf, dass b und exp nicht negativ sind.
14
// Liefert den Wert von "b hoch exp".
15
16
// Einfache Fälle:
17
if (b
<= 1) return b;
18
if (exp == 0) return 1;
19
if (exp == 1) return b;
20
21
// Kompliziertere Fälle:
22
...
3. Beim Schreiben von if-Befehlen sollten ebenfalls immer die Regel "Einfache Fälle zuerst" anwenden
können und anwenden.
Beispiel-03: Ein schlechter if-Befehl (wie man es nicht machen soll):
1
2
3
4
5
6
7
8
if (r >= 0) {
for (int i=0; i<r.length; i++) {
if (r17[i] == n) return true;
}
return false;
} else {
return true;
}
BHT, TB3-IN3
16. SU Mo 23.01.12
WS11/12, Seite 42
Beispiel-04: Eine bessere Variante (wie man es machen soll):
1
2
3
4
5
if (r < 0) return false;
for (int m : r) {
if (m == n) return true;
}
return false;
4 Wie kann man (in einem Java-Programm) feststellen, ob
ein String s11 kleiner bzw. größer als ein String s12 ist?
S. 227, Beispiel-03
5. Ein String-Literal verhält sich wie ein Name für ein String-Objekt
S. 229, Bild 10.2
S. 230, Beispiel-02
6. Objekte einer Klasse als Bojen darstellen und sie dadurch verstehen
1 class ZweiTupel {
2
static int anz = 0;
3
int x;
4
int y;
5
6
public ZweiTupel(int x, int y) {
7
this.x = x;
8
this.y = y;
9
anz++;
10
}
11
static public void main(String[] _) {
12
ZweiTupel anna = new ZweiTupel(10, 20);
13
ZweiTupel bert = new ZweiTupel(30, 40);
14
ZweiTupel carl = new ZweiTupel(50, 60);
15
...
16 }
6.1 Stellen Sie die Variablen anna und bert als Bojen dar.
6.2. Wie viele Module gibt es, wenn der Ausführer die Zeile 12 fertig ausgeführt hat?
6.3. Wie viele int-Variablen gibt es in diesem Moment und
wie heißen diese int-Variablen mit vollen Namen?
6.4. Wie viele Module gibt es, wenn der Ausführer die Zeile 14 fertig ausgeführt hat?
6.5. Wie viele int-Variablen gibt es in diesem Moment
und wie heißen diese int-Variablen mit vollen Namen?
Einfache und volle Namen von Variablen:
Einfacher Name
Voller Name
anz
ZweiTupel.anz
x
anna.x, bert.x, carl.x
y
anna.y, bert.y, carl.y
anna
anna
bert
bert
carl
carl
7. Sie sollten kurze Folgen von Java-Befehlen mit Papier und Bleistift ausführen können (siehe Kapitel 3
im Buch). Dabei sollten Sie insbesondere wissen, wann und wie man Variablen erzeugt und wann man
sie wieder zerstört. Beispiel für entsprechende Aufgaben (mit Lösungen) findet man in fast allen früheren Klausuren.
BHT, TB3-IN3
Stichworte
WS11/12, Seite 43
8. Sie sollten Fragen zum Stoff der Lehrveranstaltung TB3-IN3 (z.B. solche, die in den Tests vorkamen
und ähnliche) beantworten können. Ihre Antworten sollten möglichst kurz sein und die richtigen Fachbegriffe enthalten.
Beispiele für Fragen (und Antworten):
8.1. Was ist eine Klasse? (Ein Modul und ein Bauplan für Module)
8.2. Was macht (oder: bewirkt, leistet) eine Prozedur? (Sie verändert den Inhalt von Wertebehältern)
8.3. Was macht (oder: bewirkt, leistet) eine Funktion? (Sie berechnet und liefert einen Wert)
8.4. Objekte welcher Klassen stellen Zeichenketten dar? (String, StringBuilder)
8.5. Was ist eine Variable? (Ein Wertebehälter, dessen Inhalt man beliebig oft verändern kann)
8.6. Was ist ein Programm? (Eine Folge von Befehlen, die von einem Programmierer geschrieben wurde
und von einem Ausführer ausgeführt werden kann)
8.7. Was ist ein Modul? (Ein Behälter für Variablen, Unterprogramme, Typen etc., der aus mind. 2 Teilen besteht, einem öffentlichen und einem privaten Teil).
Zur Entspannung: Gottfried Wilhelm Leibniz (1646-1716, Leipzig-Hannover)
Philosoph, Politiker, Forscher. Erfand (zeitgleich und unabhängig von Isaac Newton, 1643-1727) die
Differentialrechnung. Konzipierte einen Logikkalkül und betrieb Wahrscheinlichkeitsrechnung (mit Anwendung z. B. auf Würfelspiele).
Führte 1673 der Royal Society in London eine Rechenmaschine vor. Heute ist nicht ganz klar, was diese
Maschine praktisch konnte und was nicht. 1894 wurde die Maschine von Leibniz an der TU Dresden restauriert. 19?? fand ein Prof. Lehmann an der TU Dresden heraus, dass die Restaurierungsarbeiten auf
einem Denkfehler beruhten und das Funktionieren der Maschine verhinderten. Prof. Lehmann baute
dann nach den Plänen von Leibniz eine funktionierende Maschine.
Leibniz beschrieb als erster das binäre Zahlensystem.
Nächster Termin: Am kommenden Mo 30.01.12 wird (wie gewohnt) eine Vorlesung stattfinden (im 3.
Block, im gewohnten Raum B345). Dabei werden vor allem Fragen der TeilnehmerInnen behandelt und
von ihnen gewünschte Themen wiederholt.
Das wars wohl für dieses Semester. Viel Erfolg bei der Vorbereitung auf die Klausur.
Herunterladen