Balzert, Helmut

Lehrbuch Grundlagen der Informatik
Konzepte und Methoden in Java, C++ und UML, Algorithmik und Software-Technik

1999, 960 S., inkl. CD-ROM, Geb. DM 148,- /öS 1081,- /sFr 131,ISBN 3-8274-0358-8 Lehrbuch

Inhalt In diesem durchgehend zweifarbigen Lehrbuch werden in innovativer Weise die Grundlagen der Informatik vermittelt. Ausgangspunkt sind die Konzepte der objektorientierten Programmierung, die in den Notationen UML (unified modeling language), Java und C++ dargestellt werden. Neben dem »Programmieren im Kleinen« werden die Grundlagen der Algorithmik und Software-Technik behandelt. Anhand von kaufmännischen, technischen, grafischen und multimedialen Anwendungsbeispielen wird die praktische Anwendung der Kenntnisse gezeigt. Ein Medienverbund aus klassischem Buch, elektronischem Buch, multimedialem Computer Based Training (CBT) und Software-Werkzeugen ermöglicht einen optimalen Einstieg in die Grundlagen der Informatik. Umfangreiche grafische Darstellungen einschließlich multimedialer Animationen (auf der CD-ROM) verdeutlichen die Zusammenhänge und dynamischen Abläufe. Durch moderne Didaktik kann das Buch zur Vorlesungsbegleitung, zum Selbststudium und zum Nachschlagen verwendet werden. Das Buch richtet sich an Studierende der Informatik im Haupt- und Nebenfach an Universitäten und Fachhochschulen sowie an Software-Ingenieure und Programmierer in der Praxis.

Lehrbücher der Informatik
Herausgegeben von Prof. Dr.-Ing. habil. Helmut Balzert Helmut Balzert Lehrbuch der Software-Technik
Software-Entwicklung

Helmut Balzert Lehrbuch der Software-Technik
Software-Management Software-Qualitätssicherung Unternehmensmodellierung

Heide Balzert Lehrbuch der Objektmodellierung
Analyse und Entwurf

Zu diesen Bänden sind jeweils CD-ROMs mit den Inhalten der Bücher als PowerPoint-Präsentationen zum Einsatz in Vorlesungen, Schulungen und Seminaren erhältlich. Weitere Informationen finden Sie unter http://www.spektrum-verlag.com und http://www.software-technik.de
II

Helmut Balzert

Lehrbuch Grundlagen der Informatik
Konzepte und Notationen in UML, Java und C++ Algorithmik und Software-Technik Anwendungen mit 2 CD-ROMs

Spektrum Akademischer Verlag Heidelberg · Berlin III

Autor: Prof. Dr.-Ing. habil. Helmut Balzert Lehrstuhl für Software-Technik Ruhr-Universität Bochum e-mail: hb@swt.ruhr-uni-bochum.de http://www.swt.ruhr-uni-bochum.de

Die Deutsche Bibliothek – CIP-Einheitsaufnahme Lehrbuch Grundlagen der Informatik [Medienkombination] Konzepte, Notationen in UML, Java, C++, Algorithmik und SoftwareTechnik ; mit CD-ROM / Helmut Balzert. - Heidelberg ; Berlin Spektrum, Akad. Verl. (Lehrbücher der Informatik) ISBN 3-8274-0358-8 Buch. 1999 CD-ROMs. 1999

Titelbild: Gerd Struwe: »Temporary Tenderness« (1999) Diesem Buch sind zwei CD-ROMs mit Informationen, Demonstrationen, Animationen, begrenzten Vollversionen und Vollversionen von SoftwareProdukten beigefügt. Der Verlag und der Autor haben alle Sorgfalt walten lassen, um vollständige und akkurate Informationen in diesem Buch und den beiliegenden CD-ROMs zu publizieren. Der Verlag übernimmt weder Garantie noch die juristische Verantwortung oder irgendeine Haftung für die Nutzung dieser Informationen, für deren Wirtschaftlichkeit oder fehlerfreie Funktion für einen bestimmten Zweck. Ferner kann der Verlag für Schäden, die auf einer Fehlfunktion von Programmen oder ähnliches zurückzuführen sind, nicht haftbar gemacht werden. Auch nicht für die Verletzung von Patent- und anderen Rechten Dritter, die daraus resultieren. Eine telefonische oder schriftliche Beratung durch den Verlag über den Einsatz der Programme ist nicht möglich. Der Verlag übernimmt keine Gewähr dafür, daß die beschriebenen Verfahren, Programme usw. frei von Schutzrechten Dritter sind. Die Wiedergabe von Gebrauchsnamen, Handelsnamen, Warenbezeichnungen usw. in diesem Buch berechtigt auch ohne besondere Kennzeichnung nicht zu der Annahme, daß solche Namen im Sinne der Warenzeichen- und MarkenschutzGesetzgebung als frei zu betrachten wären und daher von jedermann benutzt werden dürften. © 1999 Spektrum Akademischer Verlag GmbH Heidelberg · Berlin

Alle Rechte, insbesondere die der Übersetzung in fremde Sprachen, sind vorbehalten. Kein Teil des Buches darf ohne schriftliche Genehmigung des Verlages photokopiert oder in irgendeiner anderen Form reproduziert oder in eine von Maschinen verwendbare Form übertragen oder übersetzt werden. Es konnten nicht sämtliche Rechteinhaber von Abbildungen ermittelt werden. Sollte dem Verlag gegenüber der Nachweis der Rechtsinhaberschaft geführt werden, wird das branchenübliche Honorar nachträglich gezahlt. Lektorat: Dr. Georg W. Botz / Bianca Alton (Ass.) Herstellung: Katrin Frohberg Gesamtgestaltung: Gorbach Büro für Gestaltung und Realisierung, Buchendorf Satz: Hagedorn Kommunikation, Viernheim Druck und Verarbeitung: Franz Spiegel Buch GmbH, Ulm IV

Vorwort

Vorwort

Parallel zur stürmischen Entwicklung der Computer- und SoftwareTechnik entstand die Wissenschaftsdisziplin Informatik. Sie ist heute eine Strukturwissenschaft, ähnlich wie die Mathematik. Die breite Durchdringung unzähliger Anwendungsbereiche und fast aller Wissenschaftsdisziplinen durch die Informatik führt dazu, daß die Grundlagen der Informatik von immer mehr Menschen beherrscht werden müssen. Um Ihnen, liebe Leserin, lieber Leser, einen optimalen Einstieg in die Grundlagen der Informatik zu ermöglichen, habe ich dieses Lehr- und Lernbuch geschrieben. Schwerpunktmäßig werden Konzepte, Notationen und Methoden des »Programmierens im Kleinen« Grundlagen der Algorithmik und Software-Technik sowie Anwendungen behandelt. Besonderer Wert wird auf die Trennung von Konzepten und Notationen gelegt. Konzepte stellen die Theorie, Notationen die praktische Umsetzung der Theorie dar. Als Notationen werden die UML (unified modeling language) und die Programmiersprachen Java und C++ behandelt. Die Grundlagen der Programmierung werden anhand der Sprache Java vermittelt. Es werden die wichtigsten Sprachkonzepte von Java ausführlich dargestellt. Daher ist dieser Teil des Buches auch ein Programmierbuch für die Sprache Java. Es gibt jedoch einige Besonderheiten, die es von anderen Programmierbüchern unterscheidet: – Die Didaktik orientiert sich an den Konzepten der objektorientierten Programmierung und nicht an der Syntax von Java. – Umfangreiche grafische Darstellungen einschließlich multimedialer Animationen (auf der CD-ROM 1) veranschaulichen die Zusammenhänge und dynamischen Abläufe. – Die Einführung in die Java-Programmierung erfolgt objektorientiert und nicht wie in vielen Programmierbüchern prozedural. – Es werden von Anfang an grafische Benutzungsoberflächen erstellt, und es wird auf eine strikte Trennung zwischen Oberfläche und Fachkonzept geachtet. Das Buch gliedert sich in fünf Teile: s Einführung (2 Lehreinheiten) s Grundlagen der Programmierung (10 Lehreinheiten) s Algorithmik und Software-Technik (6 Lehreinheiten) s Anwendungen (4 Lehreinheiten) s Ausblicke (2 Lehreinheiten)
V

Schwerpunkte

Konzepte, Notationen: UML, Java, C++

Programmierbuch für Java

behandelte Gebiete

Vorwort
Einführungsvorlesung

Voraussetzungen

methodischdidaktische Elemente

Vom Umfang und Inhalt bietet dieses Buch meiner Meinung nach den Stoff für eine zweisemestrige Einführungsvorlesung in die »Grundlagen der Informatik« (2 Vorlesungs- und 1 Übungsstunde pro Woche). Für dieses Einführungsbuch in die Informatik werden fast keine Voraussetzungen verlangt. Alle wichtigen Begriffe und grundlegendes Wissen werden in der Einführung behandelt. Der Leser sollte jedoch über folgendes Wissen und folgende Fähigkeiten verfügen: – Einen PC mit Tastatur und Maus bedienen können. – Das Betriebssystem Windows (95/98/NT) in den Grundzügen bedienen können. – Ordner und Dateien anlegen, löschen, verschieben und wiederfinden können. – Mit einem Textsystem Texte erfassen und ändern können. – Bilder mit einem Scanner einlesen, bearbeiten und speichern können. Um Ihnen, liebe Leserin, lieber Leser, das Lernen optimal zu erleichtern, werden folgende methodisch-didaktischen Elemente benutzt: s Dieses Buch stellt einen Medienverbund aus klassischem Buch, elektronischem Buch, multimedialem Computer Based Training (CBT) und Software-Werkzeugen dar. s Dieses Buch ist in 24 Lehreinheiten (für jeweils eine Vorlesungsdoppelstunde) gegliedert. s Jede Lehreinheit ist unterteilt in Lernziele, Voraussetzungen, Inhaltsverzeichnis, Text, Glossar, Zusammenhänge, Literatur und Aufgaben. s Zusätzlich sind die Themen nach fachlichen Gesichtspunkten in Kapitel gegliedert. s Knapp 300 Begriffe sind im Glossar definiert. s Mehr als 175 Literaturangaben verweisen auf weiterführende Literatur. s Zur Lernkontrolle stehen über 300 Aufgaben zur Verfügung, die in Muß-, Kann- und Klausur-Aufgaben gegliedert sind. s Klausuraufgaben gehen davon aus, daß als Hilfsmittel nur ein handbeschriebenes DIN-A4-Blatt und kein Computersystem verwendet wird. Die Lösungen befinden sich nur auf der separat erhältlichen Dozenten-CD-ROM »Präsentationen zu Grundlagen der Informatik«. s Zu jeder Aufgabe gibt es eine Zeitangabe, die hilft, das eigene Zeitbudget zu planen. Zur Lösung aller Aufgaben werden rund 150 Stunden benötigt. s Es wurde eine neue Typographie mit Marginalienspalte und Piktogrammen entwickelt. s Als Schrift wurde Lucida ausgewählt, die für dieses Lehrbuch besonders gut geeignet ist, da sie über verschiedene Schriftschnitte
VI

Vorwort

verfügt, um Text (mit Serifen), Abbildungsbeschriftungen (ohne Serifen) und Programme (Monospace) gut unterscheiden zu können. s Das Buch ist durchgehend zweifarbig gestaltet. s Zur Veranschaulichung enthält es mehr als 500 Grafiken und Tabellen. s Wichtige Inhalte sind zum Nachschlagen in Boxen angeordnet. Durch diese moderne Didaktik kann das Buch zur Vorlesungsbegleitung, zum Selbststudium und zum Nachschlagen verwendet werden. Auf der beigefügten CD-ROM 1 befinden sich: s auf über 500 Seiten die vollständigen Lösungen zu den Muß- und Kann-Aufgaben, s alle im Buch behandelten Programme, s über 200 lauffähige Programme, s das alphabetisch sortierte Gesamtglossar mit knapp 300 Begriffen, s die Multimedia-Präsentationen »Farbgestaltung« und »Fit am Computer«, s eine eingeschränkte Version des multimedialen Lehr- und Lernsystems Object LabWeb, s über 20 Software-Werkzeuge, Programmierumgebungen und Compiler verschiedener CASE-Hersteller (von Demonstrationsversionen bis zu Vollversionen). Auf der beigefügten CD-ROM 2 befinden sich einige ausgewählte Werkzeuge und Compiler, die eine integrierte Entwicklung von einem Analysemodell bis zum lauffähigen Programm ermöglichen. Im Band 1 meines »Lehrbuchs der Software-Technik« sind in der ersten Lehreinheit der Aufbau und die Struktur von Lehrbüchern dieser Buchreihe ausführlich beschrieben. Für den interessierten Leser befindet sich die Lehreinheit 1 des Buches »Lehrbuch der Software-Technik« auf der beigefügten CD-ROM 1. Dieses Buch ist für folgende Zielgruppen geschrieben: s Studenten im Haupt- und Nebenfach der Informatik an Universitäten, Fachhochschulen und Berufsakademien. s Software-Ingenieure und Programmierer in der Praxis. Zur Vermittlung der Lerninhalte werden Beispiele und Fallstudien verwendet. Um dem Leser diese unmittelbar kenntlich zu machen, sind sie in blauer Schrift gesetzt. Ein Lehrbuch darf nicht zu »trocken« geschrieben sein. Auf der anderen Seite darf es aber auch nicht aus lauter Anekdoten und Gags bestehen, so daß das Wesentliche und der »rote Faden« kaum noch sichtbar sind. In diesem Buch stehen die »Konzepte der Programmierung« im Mittelpunkt und, die durch viele Beispiele anschaulich vermittelt werden.
VII

Lehreinheit 1 vom »Lehrbuch der Software-Technik (Band 1)« befindet sich auf beigefügter CD-ROM 1. Zielgruppen

Beispiele, Fallstudien, Szenarien blaue Schrift

roter Faden

Vorwort
Kurzbiographien Unter der Lupe

Visualisierung Begriffe, Glossar halbfett, blau

Zusammenhänge

Aufgaben

Lösungen auf CD-ROM 1

Zusätzlich werden innovative Forscher und Praktiker durch Kurzbiographien mit Bild in der Marginalienspalte vorgestellt. Für den Leser, der in die Tiefe eindringen möchte, werden ab und zu noch Informationen angeboten, die mit dem Piktogramm »Unter der Lupe« gekennzeichnet sind. Diese Abschnitte können beim ersten Lesen übersprungen werden. Ihr Inhalt wird im weiteren Verlauf nicht als bekannt vorausgesetzt. Da ein Bild oft mehr aussagt als 1000 Worte, wurden möglichst viele Sachverhalte veranschaulicht. In diesem Lehrbuch wurde sorgfältig überlegt, welche Begriffe eingeführt und definiert werden. Ziel ist es, die Anzahl der Begriffe möglichst gering zu halten. Alle wichtigen Begriffe sind im Text halbfett und blau gesetzt. Die so markierten Begriffe sind am Ende einer Lehreinheit in einem Glossar alphabetisch angeordnet und definiert. Dabei wurde oft versucht, die Definition etwas anders abzufassen, als es im Text der Fall war, um dem Lernenden noch eine andere Sichtweise zu vermitteln. Alle Glossareinträge dieses Buches befinden sich alphabetisch sortiert zusätzlich auf der beiliegenden CD-ROM 1. Begriffe, die in sachlogisch vorangehenden Lehreinheiten behandelt wurden, werden nicht wiederholt, sondern können dort nachgelesen werden. Damit sich der Lernende eine Zusammenfassung der jeweiligen Lehreinheit ansehen kann, werden nach dem Glossar nochmals die Zusammenhänge verdeutlicht. Jeder definierte Begriff des Glossars taucht in den Zusammenhängen nochmals auf. Es wird auch hier versucht, eine etwas andere Perspektive darzustellen. Der Lernende kann nur durch das eigenständige Lösen von Aufgaben überprüfen, ob er die Lernziele erreicht hat. In diesem Buch wird versucht, alle Lernziele durch geeignete Aufgaben abzudekken. Vor jeder Aufgabe wird das Lernziel zusammen mit der Zeit, die zur Lösung dieser Aufgabe benötigt werden sollte, angegeben. Das ermöglicht es dem Lernenden, seine Zeit einzuteilen. Außerdem zeigt ihm ein massives Überschreiten dieser Zeit an, daß er die Lehrinhalte nicht voll verstanden hat. Viele der Zeitangaben wurden mit Studenten evaluiert. Es wurde die Zeit ausgewählt, in der etwa 80 Prozent aller Studenten die Aufgabe gelöst haben. Aufgaben, die unbedingt bearbeitet werden sollen (klausurrelevant), sind als Muß-Aufgaben gekennzeichnet. Weiterführende Aufgaben sind als Kann-Aufgaben markiert. Zur Unterstützung des selbständigen Lernens müssen auch die Lösungen verfügbar sein. Um auf der einen Seite ausführliche Lösungen bereitstellen zu können, auf der anderen Seite aber ein vorschnelles Nachsehen etwas zu erschweren, sind die Lösungen zu den Muß- und Kann-Aufgaben dieses Buches auf der beigefügten CD-ROM 1 enthalten.
VIII

Vorwort

Die Aufgaben zu jeder Lehreinheit sind in Wissens- und Verstehensaufgaben (WV-Aufgaben) sowie analytische und konstruktive Aufgaben (AK-Aufgaben) gegliedert. Die Wissens- und Verstehensaufgaben befinden sich vollständig auf der beigefügten CDROM 1 (Object LabWeb). Diese Aufgaben sollten zumindest zufriedenstellend gelöst werden, bevor die analytischen und konstruktiven Aufgaben bearbeitet werden, die sich am Ende jeder Lehreinheit befinden. Die Grundlagen der Informatik muß man sowohl theoretisch verstehen als auch praktisch begreifen. Praxis erhält man nur durch die Arbeit mit einem Computersystem, indem man vorhandene Programme analysiert, modifiziert und erweitert. Beim Durcharbeiten oder Nacharbeiten einer Lehreinheit sollten daher parallel am Computersystem die behandelten Beispielprogramme ausgeführt und analysiert werden. Beim Lösen der konstruktiven Aufgaben sollten diese Beispielprogramme als Ausgangspunkt verwendet werden. Es soll nicht alles neu gemacht, sondern Vorhandenes modifiziert und erweitert werden. Das Lernen soll durch diese Beispiele, durch Analogieschlüsse und durch aktives Arbeiten mit dem Computersystem erfolgen. Um sicherzustellen, daß Studenten genügend Erfahrungen mit Computersystemen sammeln, ist in meine Vorlesung »Grundlagen der Informatik« ein Praktikum integriert. In insgesamt fünf Vorlesungswochen (verteilt auf zwei Semester) findet keine Vorlesung statt, sondern jeder Student muß ein Praktikum am Computer absolvieren. Für das Praktikum müssen Aufgaben vorbereitet werden, die dann im Praktikum fertiggestellt werden. Die Aufgaben für die Praktika sind im Anhang C dieses Buches aufgeführt. Durch eine gute Buchgestaltung und Buch-»Ergonomie« soll die Didaktik unterstützt werden. Aufbau und Struktur einer Lehreinheit sind in Abb. 1 dargestellt. Zur visuellen Orientierung befinden sich auf der inneren Buchseite kleine Piktogramme mit folgenden Bedeutungen: – Lernziele der Lehreinheit – Voraussetzungen, die erfüllt sein sollten, um die Lehreinheit erfolgreich durchzuarbeiten – Detaillierte Inhaltsangabe der Lehreinheit. – Unter der Lupe: Detaillierte Darstellung eines Sachverhalts für den interessierten Leser. – Zu dem beschriebenen Sachverhalt gibt es zusätzliche Informationen auf den dem Buch beigefügten CD-ROMs. – Zu dem beschriebenen Sachverhalt gibt es zusätzliche Informationen im Internet. In der Marginalienspalte sind Internet-Adressen angegeben. Durch die dynamische Entwicklung des Internets werden immer wieder Adressen verändert und auch Seiten stillgelegt.
IX

Aufgabengliederung

learning by example learning by analogy learning by doing

Praktikum

Buchgestaltung

Piktogramme

Vorwort

Piktogramme

Marginalienspalte

Überschrift der Lehreinheit
Marginalie

Kapitelüberschrift

Lernziele geordnet nach Wissen Verstehen Anwenden Beurteilen Voraussetzungen zum Lesen der Lehreinheit

Text

Biographien

Hervorhebungsbox

Inhaltsverzeichnis der Lehreinheit

2 Seitennummer

Inhaltliche und formale Marginalien LE 1 Kapitel-Nr. Kapitelüberschrift
Marginalie

Abschnitts-Nr. Abschn.überschr. LE 1 Liste der Literatur mit zusätzlichen Anmerkungen Liste der zitierten Literatur Aufgaben mit Lernzielangaben Zeitangaben Aufgabenstellung

Text

Kolumnenzeile mit Angabe der Lehreinheit (LE)

Marginalie

Glossar: Definition aller wichtigen Begriffe der Lehreinheit

Darstellung der Zusammenhänge dieser Lehreinheit

10

11

Abb. 1: Aufbau und Struktur einer Lehreinheit

X

Vorwort

Zum Finden weiterer Seiten im Internet kann der Leser Suchmaschinen benutzen oder aktuelle Verweis-Listen unter http://www.software-technik.de finden. – Glossar aller Begriffe der jeweiligen Lehreinheit. – Zusammenhänge der in der jeweiligen Lehreinheit verwendeten und im Glossar definierten Begriffe. – Liste der für die Lehreinheit wichtigen und der in der Lehreinheit zitierten Literatur. – Aufgaben zur Lehreinheit. – Verweise auf andere Teile des Buchs. Um in einem Buch deutlich zu machen, daß Männer und Frauen gemeint sind, gibt es verschiedene Möglichkeiten für den Autor: 1 Man formuliert Bezeichnungen in der 3. Person Singular in ihrer männlichen Form. In jüngeren Veröffentlichungen verweist man in den Vorbemerkungen dann häufig darauf, daß das weibliche Geschlecht mitgemeint ist, auch wenn es nicht im Schriftbild erscheint. 2 Man redet beide Geschlechter direkt an, z.B. Leserinnen und Leser, man/frau. 3 Man kombiniert die beiden Geschlechter in einem Wort, z.B. StudentInnen. 4 Man wechselt das Geschlecht von Kapitel zu Kapitel. Aus Gründen der Lesbarkeit und Lesegewohnheit habe ich mich für die 1. Variante entschieden. Die Variante 4 ist mir an und für sich sehr sympathisch, jedoch steigt der Aufwand für den Autor beträchtlich, da man beim Schreiben noch nicht die genaue Reihenfolge der Kapitel kennt. Bücher können als Begleitunterlage zu einer Vorlesung oder zum Selbststudium ausgelegt sein. In diesem Buch versuche ich einen Mittelweg einzuschlagen. Ich selbst verwende das Buch als begleitende und ergänzende Unterlage zu meiner Vorlesung. Viele Lernziele dieses Buches können aber auch im Selbststudium erreicht werden. Ein Problem für ein Informatikbuch stellt die Verwendung englischer Begriffe dar. Da die Wissenschaftssprache der Informatik Englisch ist, gibt es für viele Begriffe – insbesondere in Spezialgebieten – keine oder noch keine geeigneten oder üblichen deutschen Fachbegriffe. Auf der anderen Seite gibt es jedoch für viele Bereiche der Informatik sowohl übliche als auch sinnvolle deutsche Bezeichnungen, z.B. Entwurf für Design. Da mit einem Lehrbuch auch die Begriffswelt beeinflußt wird, bemühe ich mich in diesem Buch, sinnvolle und übliche deutsche Begriffe zu verwenden. Ist anhand des deutschen Begriffs nicht unmittelbar einsehbar oder allgemein bekannt, wie der englische Begriff lautet, dann wird in Klammern und kursiv der englische Begriff hinter dem deutschen Begriff aufgeführt. Dadurch wird auch das Lesen der englischsprachigen Literatur erleichtert.
XI

weibliche Anrede vs. männliche Anrede

als Begleitunterlage und zum Selbststudium

englische Begriffe vs. deutsche Begriffe

Vorwort
englische Begriffe kursiv gesetzt fachliche Gliederung

Lesen des Buches: sequentiell

Rudolf Paulus Gorbach *1939, nach der Schulzeit Buchdrucker und Musiker, dann Buchdruckmeister; Studium Drucktechnik und Typographie in Berlin; Hersteller und Herstellungsleiter in Buchverlagen, seit 1971 eigenes Büro in München; Lehraufträge an den Universitäten Ulm, Osnabrück und an der FH München; Software-Marketing-Preis 1991

Gibt es noch keinen eingebürgerten deutschen Begriff, dann wird der englische Originalbegriff verwendet. Englische Bezeichnungen sind immer kursiv gesetzt, so daß sie sofort ins Auge fallen. Das »Lehrbuch Grundlagen der Informatik« ist sachlogisch folgendermaßen gegliedert: s Hauptkapitel 1 s Kapitel 1.1 s Abschnitte 1.1.1 s Unterabschnitte 1.1.1.1 Alle Abbildungen und Tabellen sind nach Hauptkapiteln oder Kapiteln numeriert, z.B. Abb. 1.1-3. Neben der sachlogischen Kapitelgliederung ist das gesamte Buch in Lehreinheiten gegliedert. Die Nummer der jeweiligen Lehreinheit ist auf jeder Seite in der Kolumnenzeile aufgeführt. Alle Beispiele sind innerhalb einer Lehreinheit numeriert. Ziel der Buchgestaltung war es, Ihnen als Leser viele Möglichkeiten zu eröffnen, dieses Buch nutzbringend für Ihre eigene Arbeit einzusetzen. Sie können dieses Buch sequentiell von vorne nach hinten lesen. Die Reihenfolge der Lehreinheiten ist so gewählt, daß die Voraussetzungen für eine Lehreinheit jeweils erfüllt sind, wenn man das Buch sequentiell liest. Außerdem kann das Buch themenbezogen gelesen werden. Möchte man sich in die Programmiersprache Java einarbeiten, dann kann man zuerst nur die dafür relevanten Lehreinheiten durcharbeiten. Will man sich auf die Algorithmik konzentrieren, dann kann man auch nur die betreffenden Einheiten lesen. Durch das Buchkonzept ist es natürlich auch möglich, punktuell einzelne Lehreinheiten durchzulesen, um Wissen zu erwerben, aufzufrischen oder abzurunden. Durch ein ausführliches Sach- und Personenregister, durch Glossare und Zusammenhänge sowie Hervorhebungsboxen kann dieses Buch auch gut zum Nachschlagen verwendet werden. Das Konzipieren und Schreiben dieses Buches war aufwendig. Ich habe über zwei Jahre dazu gebraucht. Die Inhalte und die Didaktik habe ich in zwei Vorlesungen und einem Industrietraining ausprobiert und optimiert. Ich habe versucht, ein innovatives wissenschaftliches Lehrbuch zu den Grundlagen der Informatik zu schreiben. Ob mir dies gelungen ist, müssen Sie als Leser selbst entscheiden. Dieses Lehrbuch vermittelt die Grundlagen der Informatik. Wer dadurch Spaß an der Informatik gefunden hat und wissen möchte, wie eine professionelle Software-Entwicklung abläuft, dem bietet mein zweibändiges »Lehrbuch der Software-Technik« die entsprechenden Informationen. Wer sich auf die objektorientierte SoftwareEntwicklung konzentrieren will, der findet die geeignete FortfühXII

Vorwort

rung zu diesem Buch in dem »Lehrbuch der Objektmodellierung – Analyse und Entwurf« von Prof. Dr. Heide Balzert. Ein Buch soll nicht nur vom Inhalt her gut sein, sondern Form und Inhalt sollten übereinstimmen. Daher wurde auch versucht, die Form anspruchsvoll zu gestalten. Ich freue mich darüber, daß der bekannte Buchgestalter und Typograph Rudolf Gorbach aus München die Aufgabe übernommen hat, diese Lehrbuchreihe zu gestalten. Da ich ein Buch als »Gesamtkunstwerk« betrachte, ist auf der Buchtitelseite ein Bildschirmfoto aus der Serie »Temporary Tenderness (Automatic Sketch Artist)« des Künstlers Gerd Struwe abgedruckt. Er setzt den Computer ein, um seine künstlerischen Vorstellungen zu vermitteln. Das Kunstwerk »Temporary Tenderness« selbst befindet sich auf der beigefügten CD-ROM 1 (Demo-Version). Ein so aufwendiges Werk ist ohne die Mithilfe von vielen Personen nicht realisierbar. An erster Stelle gebührt mein Dank meiner Frau Prof. Dr. Heide Balzert, die mir bei vielen Fragen mit Rat und Tat zur Seite stand. Ein besonderer Dank gilt allen Kollegen, Mitarbeitern und Studenten, die das Skript zu diesem Buch durchgearbeitet haben und deren Anregungen und Hinweise dazu beigetragen haben, die jetzige Qualität des Buches zu erreichen. Mein Dank gilt insbesondere Prof. Dr. Harald Reiterer, Lehrstuhl Informationssysteme, Universität Konstanz, Prof. Dr. Ulrich Eisenecker, Fachbereich Informatik, Fachhochschule Heidelberg, und Prof. Dr. Karl-Heinz Rau, Fachbereich Betriebsorganisation und Wirtschaftsinformatik, Fachhochschule Pforzheim. Meinen wissenschaftlichen Mitarbeitern Dipl.-Ing. Christian Knobloch, Dipl.-Ing. Carsten Mielke, Dipl.-Ing. Christian Weidauer, Dipl.-Inform. Peter Ziesche und Dipl.-Math. Olaf Zwintzscher danke ich für die Ausarbeitung der Aufgaben und Lösungen, wobei Herr Mielke zusätzlich die CD-ROMs zusammen mit stud.-ing. Carsten Schu vorbereitet und fertiggestellt hat. Die beigefügte Version von ObjectLabweb wurde von Herrn Weidauer und Frau Dipl.-Inform. (FH) Anja Kiefer-Kaufmann erstellt. Die Texterfassung und -bearbeitung erledigte meine Sekretärin Anne Müller, die Grafiken erstellten Anja Schartl und Oliver Dewald. Danke! Dem Spektrum Akademischer Verlag, Heidelberg, danke ich für die sehr gute Zusammenarbeit. Alle Probleme auf dem Weg vom Skript zum fertigen Buch lösten die Herstellungsleiterin, Dipl.-Wirt.Ing. (FH) Myriam Nothacker, und Frau Bianca Alton. Für seine unternehmerische Innovationsfreude gebührt mein besonderer Dank dem Verleger Dr. Michael Weller. Trotz der Unterstützung vieler Personen bei der Erstellung dieses Buches enthält ein so aufwendiges Werk sicher immer noch Fehler und Verbesserungsmöglichkeiten: »nobody is perfect«. Kritik und Anregungen sind daher jederzeit willkommen. Informationen rund
XIII

Gerd Struwe * 1956 in Braunschweig, Studium der Kunst- und Werkpädagogik für das höhere Lehramt an der Hochschule für Bildende Künste Braunschweig. Seit 1989 Fachbereichsleiter für künstlerischmusische Praxis an der VHS Leverkusen. Initiator und Kurator der Ausstellungsreihe »Junge Digitale Bilderkunst« im Forum Leverkusen. Aufsätze zur Medienkunst und Kunstpädagogik. Beteiligungen an nationalen und internationalen Kunstausstellungen. Goldener Plotter Computerkunst 1996 (Gladbeck), 2. Preis Computeranimation Computerart 1994 (SCGA Zürich), 1. Preis Computergrafik Pixel Art Expo 1993 (Rom). Künstlerischer Arbeitsschwerpunkt: Programmentwicklungen für dynamische Computerbilder.

Vorwort

um die Software-Technik sowie eine aktuelle Liste mit Korrekturen zu diesem Buch und den beigefügten CD-ROMs finden Sie unter
http://www.software-technik.de
Mailing-Liste

Über diese Web-Seite können Sie sich auf eine Mailing-Liste setzen, wenn Sie regelmäßig über Neuerungen zu diesem Buch sowie neuen Werkzeugen informiert werden möchten. Über zwei Jahre Arbeit stecken in diesem Lehrbuch. Ihnen, liebe Leserin, lieber Leser, erlaubt es, die Grundlagen der Informatik in wesentlich kürzerer Zeit zu erlernen. Ich wünsche Ihnen viel Spaß beim Lesen. Möge Ihnen dieses Buch und die Arbeit mit der Software am Computersystem ein wenig von der Faszination und Vielfalt der Informatik vermitteln. Ihr

XIV

Inhalt

Inhalt

LE 1 1 1 1.1 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.2 1.3 LE 2 1 1.4 1.4.1 1.4.2 1.4.3 1.5 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.6 1.6.1 1.6.2 1.7 1.7.1 1.7.2 1.7.3 1.8 1.9

Einführung – Computersysteme und Informatik 1 Einführung 2 Aufbau und Funktionsweise eines Computersystems 3 Die Zentraleinheit 5 Bildschirm, Tastatur und Maus 8 Weitere Ein- und Ausgabegeräte 12 Externe Speicher 13 Vernetzung 15 Das Betriebssystem 17 Fallstudie: Die Firma ProfiSoft 18 Die Informatik 19 Gliederung und Aufbau dieses Buches 26 Einführung – Internet, WWW und HTML 35 Das Internet 36 Der Aufbau des Internet 36 Der Anschluß an das Internet 38 Die Adressierung im Internet 39 Dienste im Internet 40 Elektronische Post im Internet (e-mail) 41 Nachrichtengruppen im Internet (newsgroups) 45 Plaudern im Internet (chat) 48 Dateien übertragen im Internet (ftp) 49 Computersysteme fernbedienen über das Internet (Telnet) 50 Das World Wide Web (WWW) 50 WWW-Browser 52 Suchen und Finden im Internet 54 Die Sprache HTML 57 Medien einbinden 60 Erweiterungen von WWW-Browsern (plug ins) 62 Erstellen von HTML-Seiten und Bereitstellen auf Web-Servern 64 Die Bedeutung des Internet 66 Die Firma ProfiSoft im Internet 67

XV

Inhalt

LE 3 2 2 2.1 2.2 2.3 2.4 2.4.1 2.4.2 2.4.3 2.4.4 LE 4 2 2.5 2.5.1 2.5.2 2.5.3 2.6 2.6.1 2.6.2 2.6.3 2.6.4 2.6.5 2.6.6 LE 5 2 2.6 2.6.7 2.6.8 2.6.9 2.6.10 2.7 2.7.1 2.7.2 2.8 2.8.1 2.8.2 2.8.3 2.8.4
XVI

Grundlagen der Programmierung – Einführung 73 Grundlagen der Programmierung 74 Programm, Programmieren, Programmiersprachen 74 Java-applets und ihre Einbindung in HTML 81 Compiler, Interpreter und Programmierumgebungen 85 Das erste Java-Programm: »Hello World« 89 Die erste Java-Anwendung: »Hello World« 89 Notationen für die Syntax einer Programmiersprache 91 Aufbau eines Java-Programms 94 Das erste Java-applet: »Hello World« 95 Grundlagen der Programmierung – Objekte und Klassen (Teil 1) 103 Zuerst die Theorie: Objekte und Klassen 104 Intuitive Einführung 104 Objekte 106 Klassen 113 Dann die Praxis: Objekte und Klassen in Java 117 Deklaration von Klassen 118 GUI-Klassen 123 Erzeugen und Referenzieren von Objekten 124 Senden von Botschaften und Ausführen von Operationen 131 Löschen von Objekten 136 Visualisierung von Objekten 136 Grundlagen der Programmierung – Objekte und Klassen (Teil 2) 145 Dann die Praxis: Objekte und Klassen in Java 146 Aufbau und Start eines applets 146 Klassenattribute 148 Klassenoperationen 149 Aufbau und Start einer Java-Anwendung 151 Assoziationen und Kardinalitäten 154 Zuerst die Theorie: Assoziationen und ihre Kardinalitäten 154 Dann die Praxis: Assoziationen in Java 157 Zur Software-Technik: Integrierte Dokumentation, Verbalisierung, Schreibtischtest, CASE 163 Prinzip der integrierten Dokumentation 164 Prinzip der Verbalisierung 166 Schreibtischtest und debugging 170 Einsatz eines CASE-Werkzeugs 172

Inhalt

LE 6 2 2.9 2.9.1 2.9.2 2.10 2.10.1 2.10.2 2.10.3 2.10.4 2.10.5 2.10.6 2.10.7 LE 7 2 2.11 2.11.1 2.11.2 2.11.3 2.11.4 2.11.5 2.11.6 2.11.7 2.11.8 2.11.9 2.11.10 2.11.11 2.12 2.12.1 2.12.2

Grundlagen der Programmierung – Ereignisse und Attribute 181 Einführung in die Ereignisverarbeitung 182 Zuerst die Theorie: Das Delegations-Ereignis-Modell 182 Dann die Praxis: Ereignisse und ihre Verarbeitung in Java 185 Attribute und ihre Typen 196 Zuerst die Theorie: Eigenschaften und Verhalten von Attributen 196 Dann die Praxis: Attribute in Java 201 Die Zuweisung 202 Einfache Typen, ihre Werte und Operationen 204 Ausdrücke 208 Typumwandlungen 212 Referenztypen 213 Grundlagen der Programmierung – Operationen 221 Operationen und ihre Parameter 222 Zuerst die Theorie: Operationen, Prozeduren und Funktionen 222 Dann die Praxis: Parameterlose Prozeduren in Java 228 Dann die Praxis: Prozeduren mit Eingabeparametern in Java 229 Dann die Praxis: Objekte als Eingabeparameter in Java 232 Dann die Praxis: Prozeduren mit Ausgabeparametern 234 Dann die Praxis: Funktionen in Java 235 Dann die Praxis: Objekte als Ergebnisparameter in Java 236 Überladen von Operationen 239 Dann die Praxis: Konstruktoren in Java 240 Objekte als Eingabeparameter in Konstruktoren 242 Rekursion 243 Einführung in die Grafik-Programmierung in Java 247 Zeichnen von Objekten 247 Bilder laden und anzeigen 252

XVII

Inhalt

LE 8 2 2.13 2.13.1 2.13.2 2.13.3 2.13.4 2.13.5 2.13.6 2.13.7 2.13.8 2.13.9 LE 9 2 2.14 2.14.1 2.14.2 2.14.3 2.14.4 2.15 2.15.1 2.15.2 2.15.3 2.15.4 LE 10 2 2.16 2.16.1

Grundlagen der Programmierung – Kontrollstrukturen 263 Kontrollstrukturen 264 Die Sequenz 265 Die Auswahl 265 Die Wiederholung 272 Der Aufruf 282 Geschachtelte Kontrollstrukturen 282 Anordnung von Auswahlanweisungen 287 Auswahl von Kontrollstrukturen 290 Strukturierte Programmierung 290 Behandlung von Ausnahmen 294 Grundlagen der Programmierung – Vererbung und Polymorphismus 307 Zuerst die Theorie: Vererbung 308 Intuitive Einführung 308 Einfach- und Mehrfachvererbung 309 Überschreiben und Verbergen 314 Polymorphismus 315 Dann die Praxis: Vererbung in Java 318 Die Java-Syntax und -Semantik der Vererbung 318 Java-Beispiel für die Vererbung 320 Java-Beispiel für das Überschreiben und Verbergen 330 Sonderfälle 334 Grundlagen der Programmierung – Schnittstellen, Pakete, Ereignisse 341

Schnittstellen 342 Zuerst die Theorie: Schnittstellen in der Software-Entwicklung 342 2.16.2 Dann die Praxis: Das Java-Schnittstellenkonzept 342 2.16.3 Dann die Praxis: Die Java-Syntax und -Semantik für Schnittstellen 345 2.16.4 Schnittstellen und Polymorphismus 346 2.16.5 Konstanten in Schnittstellen 349 2.16.6 Leere Implementierung von Schnittstellen 349 2.16.7 Schnittstellen und Vererbung 351 2.17 Pakete 352 2.17.1 Zuerst die Theorie: Pakete in der Software-Entwicklung 352 2.17.2 Dann die Praxis: Pakete in Java 353 2.17.2.1 Import von Paketen 354
XVIII

19.18.7 LE 11 2 2.3 2.5.1 2.4 2.3 2.18.5.19.20.2.4 2.18.1 2.19.19.19.7 LE 12 2 2.2 2.18.2 2.3.18.19.6 2.19.2 2.18.3.20.19.3 2.5.1.19.19 2.1 2.2 2.6 2.1 2.1 2.4.19.2 2.19.19.4 2.20.3 2.19.1 2.20 2.19.18.1.20.20.20.5 2.2 2.3 2.1.20.4 2.5 2.19.6 Zugriffsrechte und Sichtbarkeit 357 Die Java-Ereignisverarbeitung im Detail 359 Ereignistypen 359 Ereignisabhörer 360 Adapterklassen 361 Registrierung 363 Vorgehensweise 363 Beispiel: Ein einfacher UML-Editor 366 Anonyme Klassen 375 Grundlagen der Programmierung – Datenstrukturen 381 Datenstrukturen 382 Felder 382 Erzeugen und Benutzen von Feldern 383 Die Java-Syntax und -Semantik für Felder 384 Felder als Container 389 Das Singleton-Muster 393 Die Klasse Vector 395 Iteratoren 400 Zuerst die Theorie: Das Iterator-Muster 400 Dann die Praxis: Enumeratoren in Java 401 Die Hüllklassen für einfache Typen 405 Die String-Klassen von Java 407 Die Klasse String 407 Die Klasse StringBuffer 410 Die Klasse StringTokenizer 411 Die Klasse Stack 414 Die Klasse Hashtable 418 Grundlagen der Programmierung – Persistenz 429 Persistenz und Datenhaltung 430 Persistenz und Datenhaltung in Java 430 Dateiströme 434 Filterströme 438 Eine einfache Indexverwaltung 439 Zuerst die Theorie: Dateiorganisation 439 Dann die Praxis: Direktzugriffsspeicher in Java 441 Drei-Schichten-Architektur 446 Die Serialisierung von Objekten 454 XIX .2 2.1.1 2.20.5 2.2 2.Inhalt 2.17.18 2.19.4.

3.und Strukturtest 524 Testen von Klassen und ihren Unterklassen 526 Algorithmik und Software-Technik – Überprüfung von Dokumenten und Verbesserung des Prozesses 539 Überprüfung von Dokumenten 540 Walkthrough 542 Inspektion 544 Verbesserung des Entwicklungsprozesses 553 Zur Psychologie des Programmierens 554 Selbstkontrolliertes Programmieren 558 Verbesserung des persönlichen Entwicklungsprozesses 561 Algorithmik und Software-Technik – Aufwand von Algorithmen 571 Aufwand von Algorithmen 572 Einführung und Überblick 572 3.5 3.2 3.3 3.2.1 3.2.6.3.2.4.2 3.3.6 3.3.2.5.2 3.1 3.10 LE 15 3 Algorithmik und Software-Technik – Algorithmen und ihre Verifikation 467 Algorithmik und Software-Technik 468 Algorithmen und ihre Eigenschaften 469 Verifikation 474 Intuitive Einführung 474 Zusicherungen 477 Spezifizieren mit Anfangs.2 3.6 3.2 3.3 3.1 3.2.3.5.4.8 3.6 3.2.3.1 3.5.1 XX .3.4 3.5 3.7 LE 14 3 3.4 3.3.3.3 LE 16 3 3.9 3.3 3.4 3.7 3.und Endebedingung 479 Anfangs-/Endebedingungen und Zusicherungen in Java 481 Verifikationsregeln 484 Termination von Schleifen 489 Entwickeln von Schleifen 492 Algorithmik und Software-Technik – Testen von Programmen 501 Testen von Programmen 502 Einführung und Überblick 502 Klassifikation von Testverfahren 509 Das Zweigüberdeckungstestverfahren 510 Die Bedingungsüberdeckungstestverfahren 512 Funktionale Testverfahren 515 Funktionale Äquivalenzklassenbildung 516 Grenzwertanalyse 520 Test spezieller Werte 523 Kombinierter Funktions.1 3.Inhalt LE 13 3 3 3.3.2.5 3.

1 4.8.2.und Bewertungskriterien für den Dialog 664 Dann die Praxis: Dialog-Programmierung in Java 664 Java-Fenster 667 XXI .3 3.6.2 3.9.2.7 3.2 3.9 3.3 3.1 3.3 3.4 3.2 3.9.8.9.8.2 3.10.6.1 Beispiel einer Aufwandsberechnung: Mischen 573 Beispiel einer Aufwandsberechnung mit Aufruf von Operationen: Mischsortieren 581 Beispiel einer Aufwandsberechnung bei rekursiven Programmen: Türme von Hanoi 589 Beispiel einer Aufwandsabschätzung: Berechnung von π 593 Algorithmik und Software-Technik – Listen und Bäume 599 Listen 600 Zuerst die Theorie: Attribute und Operationen einer verketteten Liste 601 Dann die Praxis: Verkettete Listen in Java 603 Beispiel: Verwaltung eines Lexikons 609 Klassifikation von Listen 613 Bäume 616 Zuerst die Theorie: Strukturelle Eigenschaften und Begriffe binärer Bäume 616 Zuerst die Theorie: Attribute und Operationen eines binären Suchbaums 618 Dann die Praxis: Binäre Suchbäume in Java 623 Ausblick: Allgemeine Bäume und gerichtete Graphen 627 Algorithmik und Software-Technik – Suchen und Sortieren 635 Suchen 636 Elementare Suchverfahren 636 Schlüssel-Transformationen 639 Suchen in Texten 640 Sortieren 641 Schnelle Sortierverfahren 643 Klassifikation von Sortierverfahren 647 Anwendungen – Dialoggestaltung 653 Anwendungen 654 Zuerst die Theorie: Software-Ergonomie 655 Zuerst die Theorie: Zur Dialoggestaltung 656 Fenster 658 Menüs 661 Gestaltungs.6.3.4 3.2 4.2.1 4.10 3.7.2 LE 19 4 4 4.8.10.6.4 LE 18 3 3.1 3.7.7.3 3.2 4.1 3.3 4.7.1 3.3 4.Inhalt 3.5 LE 17 3 3.8 3.

6.1 4.1 LE 22 4 4.7.5.9.6.7 4.1 4.4 4.3.1 4.7.8 4.3 XXII Java-Menüs 681 Dann die Praxis: Entwicklung der Dialog-Schnittstelle 687 Von der Skizze zum Prototyp 687 Anbindung des Fachkonzepts: Das MVC-Muster 692 Anwendungen – E/A-Gestaltung 703 Zuerst die Theorie: Zur E/A-Gestaltung 704 Interaktionselemente 704 Gestaltung von Fenstern 711 Dann die Praxis: E/A-Programmierung in Java 717 Java-Interaktionselemente 718 Das MVC-Muster am Beispiel einer Java-Tabelle 725 Layout-Manager 731 Anwendungen – kaufmännisch/technisch 741 Kaufmännisch/administrative Anwendungen 742 Vom OOA-Modell zur Benutzungsoberfläche 742 Anbindung der Benutzungsoberfläche an das Fachkonzept 749 Fallbeispiel: Artikel.4.1 4.5 4.8.4.10.9 4.2 4.6.2 4.9.7.2 4.1 4.4 4.5 4.2 LE 20 4 4.7.und Lieferantenverwaltung 755 Das JANUS-System: Automatisierte Generierung von Benutzungsoberflächen 757 Das JANUS-System: Automatisierte Generierung von Anwendungen 766 Technische Anwendungen 769 Fallbeispiel: Wetterstation 769 Anwendungen – Grafik/Multimedia 777 Grafik-Anwendungen 778 Zuerst die Theorie: Geometrische Formen und ihre affinen Transformationen 778 Dann die Praxis: Affine Transformationen in Java 783 Doppelpufferung 789 Fallbeispiel: Roboteranimation 791 Multimedia-Anwendungen 799 Zuerst die Theorie: Nebenläufigkeit durch threads 799 Dann die Praxis: Threads in Java 801 Fallbeispiel: Pool-Billard 805 .10.5.Inhalt 4.1 4.10 4.6 4.4 4.2 4.2 4.9.3 LE 21 4 4.9.10.7.2 4.3 4.3 4.

Teil) 849 Die Standardbibliothek STL 850 Die Klasse queue 850 Die Klasse string 852 Die Stromklassen 856 Dateizugriff 857 GUI-Programmierung in C++ 861 Aufbau und Struktur der GUI-Bibliothek MFC 862 Erstellen einer Benutzungsoberfläche mit MFC 865 Das JANUS-System: Einfügen eigener Operationen 871 Die Grundelemente einer generierten Anwendung 871 Fallbeispiel: Artikel.10 5.3 5.2 5.3 5.1 5.4 5.11 5.9.9 5.10.11.1 5.8 LE 24 5 5.4 5.1 5.5 5.9.Inhalt LE 23 5 5 5.2 5.2 Anhang A Ausblicke – Einführung in C++ 817 Ausblicke 818 Einführung in C++ 819 Klassen in C++ 821 Trennung Schnittstelle – Implementierung 822 Dynamische und statische Objekte 825 Vererbung und Polymorphismus 830 Klassenattribute und Klassenoperationen 835 Parametrisierte Klassen (templates) 837 Programmierumgebungen und CASE-Werkzeuge 842 Ausblicke – Einführung in C++ (2.7 5.11. Erstellungsregeln 889 Für alle Produkte 890 A-1 Richtlinie zur Versionskennzeichnung 890 A-2 Bezeichner-Richtlinien 890 A-3 Checkliste Klassen 892 A-4 Checkliste Attribute 893 A-5 Checkliste Operationen 894 A-6 Checkliste Vererbung 896 A-7 Checkliste Assoziationen 897 Für die Definitions. Richtlinien.6 5.10.9.2 5.und Lieferantenverwaltung 879 Checklisten.1 5.und Entwurfsphase 898 A-8 Checkliste OOA-Modell 898 A-9 Checkliste OOD-Modell 898 XXIII .9.

und Organisationsindex 917 Sachindex 919 XXIV .Inhalt Für die Implementierungsphase 899 A-10 Checkliste Programmierfehler 899 A-11 Java-Formatierungs-Richtlinien 900 A-12 Java-Dokumentations-Richtlinien 901 Erstellungsregeln A-13 Von UML-Klassen zu Java-Klassen 901 A-14 Java-Dokumentations-Richtlinien 902 A-15 Von UML-Klassen zu Java-Klassen 903 Anhang B Prozeßverbesserung und ihre Formulare 904 Inspektion 905 B-1 Beispiel eines Inspektionsprotokolls 905 B-2 Formular zur Erfassung von Inspektionsdaten 906 Formulare zum Entwicklungsprozeß 907 B-3 Formular für ein Fehlerbuch 907 B-4 Formular zur Zeiterfassung 908 B-5 Formular zur Defekterfassung 909 B-6 Formular für eine PSP0-Zusammenfassung 910 Anhang C Praktika 912 Praktikum Praktikum Praktikum Praktikum 1 2 3 4 (nach (nach (nach (nach der der der der Lehreinheit Lehreinheit Lehreinheit Lehreinheit 3) 912 8) 912 12) 913 15) 913 Verzeichnis der Hervorhebungsboxen 915 Verzeichnis der Programme 916 Namens.

und Organisationindex Anhang Software von anderen technischen ftware in den letzten zehn Jahren n können. Das Inhaltsverzeichnis führt direkt zu einem Kapitel bzw. die sich stellt. Die erste Frage. Video formale Anforderungen inhaltliche Anforderungen Warum es so schwierig ist. Darstellen können. ein Lehrbuch zu konzipieren und zu schreiben 2 Warum es so schwierig ist. Warum es so schwierig ist. ein Lehrbuch zu konzipieren und zu schreiben 2 Warum es so schwierig ist. betrifft die Bezeichnung des Fachgebiets. Für das vorgesehene Fachgebiet gab es drei Möglichkeiten: s Software-Engineering s Software-Technologie s Software-Technik Der Begriff Software-Engineering ist der international gebräuchliche. Zusammenhänge • Lehreinheiten zunehmende Anforderungen (jeweils additiv) Wissenschaftliches Lehrbuch Warum es so schwierig ist. Ziel war es jedoch. . ein Lehrbuch zu konzipieren und zu schreiben 2 s Warum es so schwierig ist. Fachbuch • Zielgruppenorientierung Lehrbuch • Visualisierung • Lernziele/Lernstufen • Glossar. daß Änderungen während der Entwicklung und hohe Portabilitätsanforderungen die Software-Erstellung zusätzlich erschweren. so kommen noch einige weitere Schwierigkeiten aus dem Fachgebiet der Software-Technik hinzu. s Die Disziplin Software-Technik mit ihren Begriffen beschreiben können. worin sich Software von anderen technischen Produkten unterscheidet. ein SWT-Lehrbuch zu schreiben LE 1 Abb. beschreiben können. Die Veränderungen. ein wissenschaftliches Lehrbuch der Software-Technik zu schreiben Erscheint es schon schwierig genug. Unterkapitel einer LE. ein Lehrbuch für deutsch15 Die Gliederung zu Beginn jeder LE führt zum entsprechenden Abschnitt innerhalb der LE. rungen während der Entwicklung derungen die Software-Erstellung ik mit ihren Begriffen beschreiben LE 3 – 4 4 Personal LE 5 5 Leitung LE 6 – 7 6 Kontrolle LE 8 8 LE 5 Die Abnahme. ein wissenschaftliches Lehrbuch der Software-Technik zu schreiben 15 Warum es so schwierig ist. s s s s s verstehen anwenden LE 1 n Einführung und Überblick 1 s s s s s s s n Warum es so schwierig ist. 1 LE 1 Überblick Einführung und Überblick LE 1 V Unternehmensmodellierung 1 Grundlagen LE 24 2 Objektorientierte Unternehmensmodellierung LE 25 2 LE Navigation II SW-Management 1 Grundlagen LE 1 2 Planung LE 2 3 Organisation I SW-Entwicklung 1 Die Planungsphase LE 2 – 3 2 Die Definitionsphase LE 4 – 22 3 Die Entwurfsphase LE 23 – 31 4 Die Implementierungsphase III SW-Qualitätssicherung 1 Grundlagen LE 9 Vorwort Inhaltsverzeichnis 2 Qualitätssicherung LE 10 3 Manuelle Prüfmethoden LE 11 4 Prozeßqualität LE 12 – 13 5 Produktqualität – Komponenten LE 14 – 17 6 Produktqualität – Systeme LE 18 – 19 11 LE CD-ROM–Werkzeuge Namens. englische Begriff. 2: Vom Buch zum multimedialen CBT Buch Sachbuch • Didaktik / Methodik s Die Terminologie um die definierten Begriffe System und Software herum kennen und anwenden können. s Die Terminologie um die definierten Begriffe System und Software herum kennen und anwenden können. ein wissenschaftliches Lehrbuch zu schreiben.& Pflegephase LE 33 32 LE Sachindex verstehen IV Querschnitte und Ausblicke 1 Prinzipien & Methoden LE 20 2 CASE LE 21 3 Wiederverwendung LE 22 4 Sanierung Impressum LE 23 4 LE Legende: = Übergabe von Teilprodukten = Informationsaustausch = Unterstützung = Einfluß LE = Lehreinheit (für jeweils 1 Unterichtsdoppelstunde) Die in diesem Buchband behandelten Themen Lernziele der Lehreinheit Voraussetzungen Glossar aller Begriffe Verweis Aufgaben Informationen auf der CD Detaillierte Inhaltsangabe Detaillierte Darstellung Zusammenhänge Literaturliste Dieses Piktogramm zu Beginn jeder LE führt zurück zum Haus der Software-Technik des Inhaltsverzeichnisses. ein wissenschaftliches Lehrbuch der Software-Technik zu schreiben 15 s Was ist Software? 21 Warum ist Software so schwer zu entwickeln? 25 Warum ist marktreife Software so schwer zu entwickeln? 34 Was ist Software-Technik? 35 Wie ist dieses B ch gegliedert nd a fgeba t? 41 s • Literatur • Zitieren • Wissenschaftlichkeit Elektronisches Buch • Querverweise /Hypertextorientiert • Bildschirmorientierte Gruppierung Computer Based Training • Interaktivität • Individualisierung • Vielfältigere Aufgaben • Simulationen / Animationen Multimediales Computer Based Training • Einbindung von Ton.Navigation Einführung und Überblick I LE 1 Inhalt Aufzeigen können. ein wissenschaftliches Lehrbuch der Software-Technik zu schreiben 15 Was ist Software? 21 Warum ist Software so schwer zu entwickeln? 25 Warum ist marktreife Software so schwer zu entwickeln? 34 Was ist Software-Technik? 35 Wie ist dieses Buch gegliedert und aufgebaut? 41 Wie können Sie dieses Buch lesen? 44 Was noch zu sagen bleibt! 45 Der eilige Leser kann zunächst die folgenden zwei Abschnitte über.und Einführungsphase LE 32 LE 33 6 Die Wartungs. denen Software in den letzten zehn Jahren unterworfen war.Für eilige Leser springen und mit dem Abschnitt »Was ist Software?« beginnen. über das man ein Lehrbuch schreiben will. Sprache.

bestehend aus ¡ ˚ SyNotation Darstellung von ¡ ˚ Konzeptenstemkomponenten bzw. application software ¡ Anwendungs. zugehörige Daten mationssystem. das die tes Informationssystem. Diese zunehmende Bedeutung der Software schlägt sich auch in ». d. tungen ohne ¡ Computersysteme. um den BePhase Zusammenfassung von Aktivitä. Kauft man heute einen PC und eine Grundausstattung Bürosoftware.Software-Engineering ¡ Softwarewendeten Hardware auf bzw. die Seitenangabe zur entsprechenden Seite im Buch. Maschine. Software-Entwicklung Aus einem gezur Erfüllung der eigenen Aufgabe. technischen len Fähigkeiten zu ergänzen. d.sammengefaßt es erlauben. 10. Software-System ¡ System. Gesichtspunkten (¡ ˚ Notation). Der durchschnittliche Anteil beträgt 50 Prozent. warefamilie entwickelt ist. Ziel war es jedoch. Orgatersystem unmittelbar einsetzen und nisation. Koch.eine spezielle Hardware oder Hardderter oder neuer Anforderungen. 35.Prozeßqualität einer ¡ Software-Entwickzeugen zum Zwecke der Software-Erstel. Sprache. so kommen noch einige weitere Schwierigkeiten aus dem Fachgebiet der Software-Technik hinzu. gedanklichen Welt.und CASE-Werkzeuge Einsatz von ¡ Werk. die für und Weiterentwicklung aufgrund geän. Prozent. Regel auf der ¡ Systemsoftware der ver. stem Einheit aus ¡ Informationssystem Anwendung ¡ rechnergestütztes Infor. mit Hilfe eines ¡ Computersystems löst. das die tes Informationssystem.nieurmäßige Herstellung und Anwensches System zusammen mit sonstigen dung von umfangreichen ¡ ˚ Software-Sytechnischen Einrichtungen. 5: Zunehmender Wertanteil der Software II Einführung und Überblick 90 Zunehmende Bedeutung »In zunehmendem Maße entwickelt sich Software zu einem eigenständigen Wirtschaftsgut und spielt eine entscheidende Rolle in der Gesellschaft. ¡ Benutzer und sonstige Mitarbei. Bei den IT&T-ProEntwicklung geht dukten hat die Software einen Anteil zwischen 25 Prozent und 90 weiter«.Navigation LE 1 Abb. Software-Entwicklung. Deutschland besitzt mit 23 Prozent den weitaus größten Anteil am europäischen Software-Markt.trieb und die Wartung dieser Hardware ten der ¡ Software-Entwicklung nach zu ermöglichen sowie ihre funktionelzeitlichen. Maschine. dann erhält CASE = Computer A ided man bereits ein Verhältnis von S oftware 30 20:80 (PC-Hardware : Software). 220. be. über das man ein Lehrbuch schreiben will.legt werden soll. Einrich. 217. ingeInformationssystem ¡ Organisatori. wie Banken und Versicherungen. ein Lehrbuch für deutsch15 Glossarbegriffe (fett und blau) führen zur Erklärung im Glossar. die ein ¡ Compu. In einigen Bereichen. die sich stellt. Mensch.Software-Technik Zielorientierte Bereitwendungssoftware. 46 .sammengefaßt es erlauben.1992 EFTA) repräsentiert mit einem Umsatz von 56 Mrd. denen eine Syntax und Semantik defi.h. 46 Warum es so schwierig ist. 118. 6: Die weltweit führenden Industrien 3000 2500 2000 1500 1000 500 0 Weltweiter Umsatz in Milliarden US$ 2850 2900 1620 1100 800 800 1320 Quelle: G. die zusammen Aufgaben erledigen. zu ziehungen stehen können. 6). z. warefamilie entwickelt ist. Engineering).die untereinander in verschiedenen Beschen und/oder textuellen Symbolen.SW Abkürzung für ¡ Software. Setzt in der nes Computers Aufgaben zu erledigen. Europa (EU + FAZ-Unternehmergespräch. Engineering).nieurmäßige Herstellung und Anwensches System zusammen mit sonstigen dung von umfangreichen ¡ ˚ Software-Sytechnischen Einrichtungen. benutzt sie Technik.Handeln zugrunde legt. S. Software-System ¡ System. 539 Steuersystem˘ 656||f.planten ¡ Software-Produkt ein fertiges Software-Produkt entwickeln. 238 Struktogramm-Notation˘ 238 Fachbuch • Zielgruppenorientierung Lehrbuch • Visualisierung • Lernziele/Lernstufen • Glossar. 3/. lung. Einsatz von ¡ CASE. Für das vorgesehene Fachgebiet gab es drei Möglichkeiten: s Software-Engineering s Software-Technologie s Software-Technik Der Begriff Software-Engineering ist der international gebräuchliche. Material. geänderte Bedingungen oder Änderung Systemsoftware ¡ Software. CASE Computerunterstützte Software. 28 LE 1 Glossar Einführung und Überblick Anwender Mitglieder einer Institution Prinzip Grundsatz. daß man in Zukunft zu (zitiert nach /Scharf 88/) anspruchsvoller Software den entsprechenden Computer als Zugabe erhält. stems. Juni 1994 g & un är ig ilit id M erte V M c as to Au em Ch x Te tili IT &T is ur To ie str du in u ba en hin ie ie tr us nd m ie str du in us Abbildungsverweise. gedanklichen Welt. die zuAufgaben des ¡ Anwenders mit Hilfe ei. die ein ¡ Compu. Einrich. ¡ Benutzer und sonstige Mitarbei. 7b) beziehen sich auf die Umsätze mit SoftwareProdukten und zugehörigen Dienstleistungen. 664||f stored procedures˘ 691 Streßtest˘ 963 structure˘ 185 structure charts˘ 824 structured analysis˘ 99.Prozeßqualität einer ¡ Software-Entwickzeugen zum Zwecke der Software-Erstel. englische Begriff..h. Nicht enthalten sind % Abb. Leitung und Kontrolle einer ¡ selbst bedienen (¡ ˚ Anwender).SW Abkürzung für ¡ Software. den man seinem oder Organisationseinheit. ¡ Methoden und ¡ DV-System ¡ Computersystem. so hat man bereits ein Verhältnis von ungefähr 50:50. Die erste Frage. Methode Planmäßig angewandte. durch eine festgelegte Menge von grafi. um den BePhase Zusammenfassung von Aktivitä. Engineering Ein ähnliches Verhältnis findet man heute bei Telekommunikationssystemen. ein wissenschaftliches Lehrbuch zu schreiben. lung ihrer fachlichen Aufgaben ¡ Com. z. technischen len Fähigkeiten zu ergänzen.Software-Engineering ¡ Softwarewendeten Hardware auf bzw. daß schon jetzt mehr als die Hälfte der Bedeutung der Software-Industrie nieder.stemen. Einsatz von ¡ CASE. be. Während früher die Auder Wertschöpfung toindustrie zu den weltweiten Leitindustrien zählte. 46||f. 5). niert ist. 7 zeigt den Anteil der Software am Informationstechnik-Markt Siemens AG.. application software ¡ Anwendungs. Diese dem Tourismus weltweit die Leitindustrie (Abb. Anwendungssystem ¡ rechnergestütz. Brüssel.Systemkomponente Teil eines ¡ Syter.die untereinander in verschiedenen Beschen und/oder textuellen Symbolen.planten ¡ Software-Produkt ein fertiges Software-Produkt entwickeln. führen zu dieser Abbildung. Setzt in der nes Computers Aufgaben zu erledigen. Subsystemen. ein Lehrbuch für deutsch15 Im Sachindex führt der Begriff – falls vorhanden – zur Erklärung im Glossar.Rechnergestütztes Informationssyputersysteme einsetzen (¡ ˚ Benutzer). die nicht weiter zerlegbar ist oder zerOrganisatorisches System ¡ Anwen. die für und Weiterentwicklung aufgrund geän. Software-Entwicklung Aus einem gezur Erfüllung der eigenen Aufgabe.Systemelement ¡ Systemkomponente.und CASE-Werkzeuge Einsatz von ¡ Werk.Systemkomponente Teil eines ¡ Syter. betrifft die Bezeichnung des Fachgebiets.h. lung. geänderte Bedingungen oder Änderung Systemsoftware ¡ Software.Software-Qualitätssicherung SicherWerkzeugen bei der Entwicklung. ein SWT-Lehrbuch zu schreiben LE 1 Abb. die auf eine Abbildung auf einer anderen Seite zeigen. bestehend aus ¡ ˚ SyNotation Darstellung von ¡ ˚ Konzeptenstemkomponenten bzw.legt werden soll. Für das vorgesehene Fachgebiet gab es drei Möglichkeiten: s Software-Engineering s Software-Technologie s Software-Technik Software Technik Der Begriff Software-Engineering ist der international gebräuchliche. ist heute die Inforvon Siemens auf mationstechnik. Regel auf der ¡ Systemsoftware der ver. Teilweise betragen die Softwarekosten 90 Prozent der Gesamtko- sten. lung ihrer fachlichen Aufgaben ¡ Com. Video formale Anforderungen inhaltliche Anforderungen Warum es so schwierig ist. 164 komponentenbasierte˘ 870. über das man ein Lehrbuch schreiben will. 2: Vom Buch zum multimedialen CBT Sachindex Buch Sachbuch • Didaktik / Methodik beim Einsatz des JANUSSystems˘ 654 beim Einsatz eines Maskengenerators˘ 652 beim Einsatz eines UIMS/UIBuilders˘ 652 modulare˘ 848 strukturierte˘ 810 Software-Engineering˘ 15.B. Benutzer Personen. und/oder organisatorischen Kriterien. ECU einen etwa so großen Software-Markt wie die USA. ˘ stepwise refinement˘ 937. der. durch eine festgelegte Menge von grafi. stems. im in Europa und den prozentualen Anteil Deutschlands. das aus ¡ Entwicklung (Computer Aided Software Software besteht. die und notwendige Dokumentation. werden nahezu alle Diensteistungen durch Software-Einsatz realisiert« /BMFT 94. Methode Planmäßig angewandte.Software-Qualitätssicherung SicherWerkzeugen bei der Entwicklung. ¡ Systemsoftware stellung und systematische Verwendung und Hardware. die zur Erfül. tungen ohne ¡ Computersysteme. eines Anwendungssystems ist in den letzten zwei Jahrzehnten ständig gestiegen (Abb. Pflege Anpassung eines ¡ Systems an Produkt (¡ Systemelement).und ¡ Computersystem(en). ingeInformationssystem ¡ Organisatori. Pflege Anpassung eines ¡ Systems an Produkt (¡ Systemelement). Leitung und Kontrolle einer ¡ selbst bedienen (¡ ˚ Anwender). zu ziehungen stehen können.B. 398. den man seinem oder Organisationseinheit. Werkzeugen für die arbeitsteilige. Anwendungssystem ¡ rechnergestütz. denen eine Syntax und Semantik defi. die nicht weiter zerlegbar ist oder zerOrganisatorisches System ¡ Anwen. englische Begriff. stellung der geforderten Produkt. 53.und ¡ Computersystem(en). Material. Zusammenhänge • Lehreinheiten zunehmende Anforderungen (jeweils additiv) Wissenschaftliches Lehrbuch • Literatur • Zitieren • Wissenschaftlichkeit Elektronisches Buch • Querverweise /Hypertextorientiert • Bildschirmorientierte Gruppierung Computer Based Training • Interaktivität • Individualisierung • Vielfältigere Aufgaben • Simulationen / Animationen LE 1 Glossar Einführung und Überblick Anwender Mitglieder einer Institution Prinzip Grundsatz. die zur Erfül. 0 Daraus läßt sich die Prognose 1970 1980 1992 Quellen: Hughes Aircraft/GEI ableiten. die zusammen Aufgaben erledigen. das aus ¡ Entwicklung (Computer Aided Software Software besteht.eine spezielle Hardware oder Hardderter oder neuer Anforderungen. Orgatersystem unmittelbar einsetzen und nisation. dessen ¡ Konzept beschreibt einen definierten Systemkomponenten und ¡ ˚ SystemeleSachverhalt unter einem oder mehreren mente aus ¡ Software bestehen. Subsystemen.h.Software-Technik Zielorientierte Bereitwendungssoftware. ¡ Systemsoftware stellung und systematische Verwendung und Hardware. zugehörige Daten mationssystem. d.Software-Management Planung. Mensch. Verwendet man einen PC für 60 die professionelle Software-Entwicklung und kauft entsprechende CASE-Werkzeuge.trieb und die Wartung dieser Hardware ten der ¡ Software-Entwicklung nach zu ermöglichen sowie ihre funktionelzeitlichen.und Telekommunikationsindustrie (IT & T) neben Software-Leistungen entfällt. d. Benutzer Personen. 415 structured programming˘ 216 Struktogramm˘ 98.Software-Management Planung. Werkzeugen für die arbeitsteilige. 958 Steuerbarkeit˘ 521. Computersystem Einheit von ¡ An. software.Software-Produkt Produkt.Software-Produkt Produkt. software. von ¡ ˚ Prinzipien. und/oder organisatorischen Kriterien. Gesichtspunkten (¡ ˚ Notation). Subsystem ¡ Systemkomponente. Software Programme.geforderten Eigenschaften besitzt (¡ Phase). stem Einheit aus ¡ Informationssystem Anwendung ¡ rechnergestütztes Infor. gründete Vorgehensweise zur Erreichung System Ausschnitt aus der realen oder von festgelegten Zielen (¡ Verfahren). Software Programme.geforderten Eigenschaften besitzt (¡ Phase). gründete Vorgehensweise zur Erreichung System Ausschnitt aus der realen oder von festgelegten Zielen (¡ Verfahren). 46||f Software-Entwicklung˘ 39. stellung der geforderten Produkt. mit Hilfe eines ¡ Computersystems löst.stemen. von ¡ ˚ Prinzipien. niert ist.lung durch geeignete konstruktive und analytische Maßnahmen.Rechnergestütztes Informationssyputersysteme einsetzen (¡ ˚ Benutzer). Software-Entwicklung. begrifflichen. ¡ Methoden und ¡ DV-System ¡ Computersystem. Anwendungssoftware ¡ Software. Heinrich von Pierer. Software ist Bestandteil der meisten hochwertigen technischen Produkte und Dienstleistungen geworden. dessen ¡ Konzept beschreibt einen definierten Systemkomponenten und ¡ ˚ SystemeleSachverhalt unter einem oder mehreren mente aus ¡ Software bestehen. Der relative Wertanteil der Software an den Gesamtkosten eines Computersystems bzw. Computersystem Einheit von ¡ An. CASE Computerunterstützte Software. ein wissenschaftliches Lehrbuch der Software-Technik zu schreiben Erscheint es schon schwierig genug. Anwendungssoftware ¡ Software.Systemelement ¡ Systemkomponente. der. Multimediales Computer Based Training • Einbindung von Ton.lung durch geeignete konstruktive und analytische Maßnahmen. Subsystem ¡ Systemkomponente. begrifflichen. die zuAufgaben des ¡ Anwenders mit Hilfe ei. European IT Conference (EITC). Ziel war es jedoch.Handeln zugrunde legt. benutzt sie Technik. Abb. die und notwendige Dokumentation.8. Diese Zahlen (Abb.

5 1. Anhand von Beispielen die Arbeitsweise der Zentraleinheit zeigen können.1. . Software installieren und benutzen können.J. Tastatur und Maus 8 Weitere Ein. USA.und Ausgabegeräte 12 Externe Speicher 13 Vernetzung 15 Das Betriebssystem 17 Fallstudie: Die Firma ProfiSoft 18 Die Informatik 19 Gliederung und Aufbau dieses Buches 26 1 1.3 Leser.LE 1 1 Einführung – Computersysteme und Informatik s s s s s s s s Die aufgeführten Begriffe erklären und in den richtigen Kontext einordnen können. zahlreiche Auszeichnungen. ab 1929 in Princeton (N.6 1. Die bei der Installation und Benutzung von Software ablaufenden Vorgänge anhand von Beispielen in zeitlich richtiger Reihenfolge durchführen können. Einführung 2 Aufbau und Funktionsweise eines Computersystems 3 Die Zentraleinheit 5 Bildschirm.. seit 1933 dort Professor für Mathematik. 1 Prof. Studium der Mathematik in Budapest. wodurch sich das Programm selbst verändern kann (1946).2 beginnen. danach in Berlin und Hamburg tätig. die bereits mit Computersystemen gearbeitet haben und mit der Terminologie vertraut sind.1. so aufgebaute Computer mit einem Prozessor bezeichnet man heute als von Neumann-Computer bzw.1 1.1 1. von Neumann-Architektur. ihren Positionen und ihren Teildisziplinen erläutern können. Hauptidee: Gemeinsamer Speicher für Programme und Daten.3 1.). Johann von Neumann * 1903 in Budapest.1. 1928 Habilitation in Berlin.2 1. Anhand von Beispielen Übertragungszeiten bei vernetzten Computersystemen berechnen können. Dr.1. Die Wissenschaftsdisziplin Informatik mit ihren Definitionen.1. wesentliche Beiträge zu den Computern Harvard Mark I (ASCC) und ENIAC. Ungarn † 1957 in Washington D.4 1.C. Wegbereiter der amerikanischen Computerentwicklung.7 1. Gegebenen Aufgabenstellungen die jeweils geeigneten Peripheriegeräte zuordnen können.2 1.1.1. Den Aufbau und die Funktionsweise eines Computersystems darstellen können. können mit dem Kapitel 1.

s etwa 100 Millionen Menschen Zugang zum Internet haben. s 19 Prozent aller Deutschen zwischen 14 und 59 Jahren. /BMFT 94/. Sie ist Bestandteil der meisten hochwertigen technischen Produkte und Dienstleistungen. s Software entwickelt sich zu einem eigenständigen Wirtschaftsgut. daß die Informatik und insbesondere die Software-Technik heute eine große volkswirtschaftliche Bedeutung haben /GI 87/. Sie prägt damit zunehmend sowohl die Funktionalität als auch die Qualität der Erzeugnisse. in Wirtschaft und Technik geworden. daß s 35 Prozent aller amerikanischen Familien und 50 Prozent der amerikanischen Teenager einen Computer besitzen. das Internet. /Necker 94/: s Die Informatik hat sich in weniger als drei Jahrzehnten aus einem kleinen wissenschaftlichen Kern zu einem entscheidenden und für weite Teile unserer Wirtschaft und Gesellschaft bedeutenden Faktor entwickelt.de Online-Dienst: Anbieter. im Maschinen. s Die Informatik ist zu einer Grundlagen.B. in der Telekommunikationsindustrie.LE 1 1 Einführung 1 Einführung Die Begriffe »Computer«. s Die im Bereich der Informatik tätigen Wirtschaftszweige setzen weltweit jährlich mehrere 100 Milliarden DM um. z. s 65 Prozent aller 1994 weltweit verkauften Computer an Privathaushalte gingen. wie Banken und Versicherungen.gfk. Untersuchungen haben ergeben /GfK 99/. s im Jahr 2000 nur noch ein Drittel aller Arbeitnehmer ohne Computerkenntnisse auskommen kann. die über ein Netz. »WWW«.5 Millionen Menschen. werden nahezu alle Dienstleistungen durch den Einsatz von Software erbracht. /Spiegel 97/. s 43 Prozent aller Deutschen zu Hause oder an ihrem Arbeitsplatz mit einem Computersystem arbeiten. das sind 8. z. in der Medizintechnik oder der Haushaltselektronik. Diese Zahlen deuten bereits an. /WAZ 96/. s Anlagen und Geräte werden von Software gesteuert. 11 f. »Internet«. In einigen Bereichen./. /Die ZEIT 97/. verschiedene (Informations-) Dienstleistungen anbieten .B. im Automobilbau. »Software« und »Informatik« sind täglich in den Medien zu finden.und Anlagenbau. 1999 zumindest gelegentlich das Internet und/oder einen Online-Dienst genutzt haben (Zuwachs von 40 Prozent in sechs Monaten). s Der Software-Anteil als integraler Produktbestandteil nimmt ständig zu. /Negroponte 95.und Querschnittsdisziplin für die meisten Entwicklungen in Wissenschaft und Forschung. S. In der digitalen Vermittlungs2 http://www. s In exportorientierten Branchen der deutschen Wirtschaft übersteigt der Software-Anteil an der Wertschöpfung der Produkte häufig die 50 Prozent-Marke.

müssen sie in einem eindeutigen und präzisen Formalismus beschrieben werden.1. Dazu verwendete er algebraische Methoden und schrieb ein Lehrbuch mit dem Titel »Kitab al jabr w’almuqabalah« (Regeln zur Wiederherstellung und zur Reduktion). Solche Automaten erfüllen nur eine festgelegte Funktion.1 Aufbau und Funktionsweise eines Computersystems LE 1 technik entfallen bis zu 80 Prozent der Entwicklungskosten auf Software. Chr. Teildisziplinen und das Selbstverständnis der Informatik eingegangen. die Funktionsweise und die Terminologie von Computersystemen eingeführt und erklärt. Er lebte um 825 n. Oder man kann ihm eine Handlungsanleitung zur Steuerung von Verkehrsampeln angeben. Anschließend wird versucht.1 Aufbau und Funktionsweise eines Computersystems Computer sind technische Geräte. Arbeitsanweisungen oder Handlungsanleitungen bezeichnet man als Algorithmen (Singular: Algorithmus). Er ist dann in der Lage. werden im folgenden Kapitel zunächst der Aufbau. Um eine intuitive Vorstellung von Computersystemen zu vermitteln und um auf klar definierten Begriffen aufzusetzen. Da ein Computer ohne ein Programm nicht arbeiten kann. s »Information« wird noch viel stärker zum entscheidenden »Produktionsfaktor« und entscheidet über die zukünftige Wettbewerbsfähigkeit der wichtigsten Industriebranchen. Der Begriff Algebra leitete sich aus dem Titel des Lehrbuchs ab. Insbesondere wird auf Definitionen. der bis zu vier Frauen in unterschiedlichem Stand und eine Vielzahl von Kindern besaß. Der Computer kann dann die Lohnsteuer berechnen. Elektrizitätsoder Telefonnetze hatten. den Verkehrsfluß einer Stadt zu regeln.B. 3 Die Bezeichnung Algorithmus geht zurück auf den arabischen Schriftsteller Abu Dshafar Muhammed Ibn Musa alKhwarizmi. Ein Zigarettenautomat kann z. s »Information-Highways« werden einen größeren Einfluß auf die zukünftige Entwicklung von Wirtschaft und Gesellschaft haben. Fahrkartenautomaten. wenn ein wohlhabender Araber starb. denen man im täglichen Leben begegnet: Kaffeeautomaten. eine Vorstellung von der Informatik als Wissenschaft zu vermitteln. Er beschrieb die Erbschaftsverhältnisse. Ist dies der Fall. Solche Vorschriften. Computer sind nicht vergleichbar mit Automaten. die sich ergaben. . keinen Kaffee ausgeben. Damit ein Computer Algorithmen ausführen kann. jeweils neu vorgeben. Zigarettenautomaten. in der Stadt Khiva im heutigen Usbekistan. 1. wobei die Übertragung von Gliedern einer Gleichung von einer zur anderen Seite des Gleichheitszeichens gemeint ist. Aus dem Namen des Schriftstellers wurde algorism und daraus Algorithmus. die durch die Konstruktion bestimmt ist. als es die physikalische Infrastruktur wie Schienen-. Beispielsweise kann man ihm einmal eine Arbeitsanweisung zur Berechnung der Lohnsteuer eingeben. dann bezeichnet man solche Algorithmen als Programme. Gegenstandsbereiche. Im Gegensatz zu einem Automaten mit festgelegten Aktionen hat ein Computer einen wesentlichen Vorteil: Man kann ihm die Vorschrift. die umfangreiche Informationen mit hoher Zuverlässigkeit und großer Geschwindigkeit automatisch verarbeiten und aufbewahren können. nach der er arbeiten soll. die damals Khwarizm hieß und als Teil des Namens verwendet wurde. Aufbauend auf diesen beiden Kapiteln werden dann die Gliederung und der Aufbau dieses Buches beschrieben.

kennt ein Computersystem solche Schwächen nicht. Der schnellste heute verkaufte Computer schafft sogar eine Billion Rechenoperationen pro Sekunde (1012 Operationen pro Sekunde = 1 Tera-Operation pro Sekunde). Software – Komposition – Zugfahrplan. Alles. zu erleichtern. Systemsoftware.B. für die sie geschaffen wurde und ergänzt normalerweise die funktionalen Fähigkeiten der Hardware. auch Basissoftware genannt. ist Software. um den Betrieb und die Wartung dieser Hardware zu ermöglichen bzw. Alle materiellen Teile eines Computersystems bezeichnet man auch als Hardware (harte Ware). alle immateriellen Teile. schnell ermüdet und Fehler macht. s Hohe Geschwindigkeit Ein Computersystem addiert heute in einer Sekunde rund zehn Millionen Zahlen.1 Aufbau und Funktionsweise eines Computersystems Software Systemsoftware spricht man von Computersystemen. die es zusammengefaßt erlauben. in der Regel aber auch Compiler. die für eine spezielle Hardware oder eine Hardwarefamilie entwickelt wurde. Kommunikationsprogramme und spezielle Dienstprogramme (siehe unten). wenn das technische Gerät Computer und die Programme zur Steuerung des Computers gemeint sind. s Hohe Zuverlässigkeit Ein weiterer Vorzug eines Computersystems ist seine hohe Zuverlässigkeit. 32 Millionen Zahlen zusammengezählt. zugehörige Daten und notwendige Dokumentation. mit Hilfe eines Computers Aufgaben zu erledigen. was ein Computersystem kann. Der Begriff Software ist noch umfassender als der Begriff Programm. ein Mensch würde in einer Sekunde zwei solcher Zahlen addieren. Synonym zu Software werden oft auch die Begriffe Software-System und Software-Produkt verwendet. Datenbanken. Zur Systemsoftware zählt man immer das Betriebssystem. Gesuchte Informationen können sehr schnell wiedergefunden werden. Programme. Ein Computersystem hat gegenüber dem Menschen jedoch drei wesentliche Vorteile: s Hohe Speicherungsfähigkeit In einem Computersystem können Unmengen von Informationen – Millionen bis Billionen Zeichen – aufbewahrt werden. Analogien zu diesen Begriffen sind beispielsweise: Hardware – Musikinstrument – Schienennetz. Systemsoftware orientiert sich grundsätzlich an den Eigenschaften der Hardware. kann ein Mensch im Prinzip auch. Ein Computersystem schafft das in drei Sekunden. Software gliedert man oft in Anwendungssoftware und Systemsoftware. dann hätte er nach einem Jahr ununterbrochener Tätigkeit ca. 4 .LE 1 1. eines Computersystems als Software (weiche Ware). z. insbesondere bei monotonen Aufgaben. Nimmt man an. Während der Mensch. Software (SW) sind Programme.

Informationen kurzfristig aufzubewahren und bei Bedarf wieder zur Verfügung zu stellen.1-1 zeigt nochmals grafisch die Zusammenhänge. Dies hängt mit dem technischen Aufbau von Arbeitsspeichern zusammen. ist Software. Netzanschluß). 1. 1.Arbeitsspeicher rektzugriffsspeicher) genannt. da die Informationen nach dem Ausschalten des Computers. Systemsoftware und Hardware bilden zusammen ein Computersystem. Anwendungssoftware. d. Zeichenprogramme. die Aufgaben des Anwenders mit Hilfe eines Computersystems löst. 1.1. benutzt sie zur Erfüllung der eigenen Aufgaben. Tabellenkalkulation. Sie besteht aus s dem Prozessor – auch CPU (central processing unit) genannt – und s dem Arbeitsspeicher (Abb. die ein Computersystem unmittelbar einsetzen und bedienen.1 Die Zentraleinheit LE 1 Anwendungssoftware Anwendungssoftware auch Applikationssoftware (application software) genannt. Anwendungssoftware setzt in der Regel auf der Systemsoftware der verwendeten Hardware auf bzw. externe Speicher.1.1. Der Arbeitsspeicher. Benutzer sind nur diejenigen Personen. 5 . die ein Computersystem Benutzer Anwender zur Erfüllung ihrer fachlichen Aufgaben einsetzen. oft auch Endbenutzer oder Endanwender genannt. Sie benutzen die Ergebnisse der Anwendungssoftware oder liefern Daten. dient dazu. auch RAM (random access memory = Di. In der Zentraleinheit werden die Programme abgearbeitet. nach dem Abschalten der Stromzufuhr. Die Aufbewahrung von Informationen erfolgt nur kurzfristig.1 Die Zentraleinheit Computersystem Anwender Benutzer Abb. Die Zentraleinheit kommuniziert über eine Ein-/Ausgabesteuerung mit den Peripheriegeräten (Ein-/Ausgabegeräte. Als Anwender werden alle Angehörigen einer Institution oder organisatorischen Einheit bezeichnet. 1. Beispiele dafür sind Textverarbeitungs-Software.1-1: Begriffe und ihre Zusammenhänge Ein Computer besteht aus s einer Zentraleinheit (central unit) und s einer Ein-/Ausgabesteuerung. wieder verloren gehen.h. die die Anwendungssoftware benötigt.1-2). Abb.

1.1 Aufbau und Funktionsweise eines Computersystems andere Computer Netzanschluß. Bildschirm Lautsprecher Drucker externe Speicher.B. z. z. z.LE 1 1. Tastatur Maus Mikrophon Scanner digitaler Fotoapparat Videokamera Peripheriegeräte Ausgabegeräte. Festplatte Diskette CD-ROM Fenster Drucker Bildschirm Tastatur Lautsprecher Scanner Maus Abb. z.B.B. 6 . Modem ISDN-Karte Netzwerk-Karte Eingabegeräte.B.2) verwendet. 1. die die Informationen ähnlich wie bei einem Tonband oder einer CD aufbewahren.1-2: Aufbau und Komponenten eines Computers Für die langfristige Aufbewahrung von Informationen werden deshalb externe Speicher (siehe Abschnitt 1.

Eins – Null. Jede Speicherzelle besitzt einen Namen (Adresse). z. Für ein Buch mit 1000 Seiten wird also eine Speicherkapazität von 3 MB benötigt. wird als dessen Speicherkapazität bezeichnet. Die Maßeinheit für Kapazität heißt Byte. wahr – falsch. so daß Speicherkapazitäten bis 200 GB und mehr erreicht werden).1. Markierung – keine Markierung.h. d. Die kleinste Einheit eines Arbeitsspeichers bezeichnet man als Speicherzelle.44 MB s CD-ROM: 650 MB s Festplatte: 2 GB bis ca. Auf solch einem Speicher kann daher eine ganze Bibliothek. Die zweite Komponente der Zentraleinheit ist der Prozessor. Die Informationsmenge. die in einem Speicher aufbewahrt werden kann. Dualsystem dargestellt werden. abgekürzt Bit (binary digit) genannt. abgespeichert werden. Durch die Angabe des Namens wird genau die dem Namen zugeordnete Speicherzelle angesprochen. sei ein Rechenbeispiel angegeben: Eine maschinengeschriebene DIN A4-Text-Seite faßt rund 3000 Zeichen einschließlich der Leerzeilen und Leerzeichen. Ein Byte besteht wiederum aus acht Binärzeichen. Der Prozessor Prozessor eines Computers ist in der Lage.1. daß Bytes im Binärbzw. Um einen Eindruck von der Größenordnung der Speicherkapazität Beispiel zu bekommen. benötigte Speicherkapazität: 3 KB. 10 GB (an einen Computer können mehrere Festplatten angeschlossen werden. In Abhängigkeit von der Größe eines Computers hat ein Arbeitsspeicher heute in der Regel eine Kapazität zwischen acht MB und mehreren hundert MB. hat Kilo hier den Faktor 1024. Heutige Großplattenspeicher haben eine Kapazität von bis zu 200 GB oder mehr. der 1000 bedeutet. er verfügt nicht über unendlich viele Speicherzellen. Algorithmen dagegen können umgangssprachlich 7 .1 Die Zentraleinheit LE 1 Der Hauptvorteil des Arbeitsspeichers liegt darin. Programme abzuarbeiten. Speicherzelle Speicherkapazität Byte Im Unterschied zum normalen Kilobegriff. Der Arbeitsspeicher eines Computers ist nicht unendlich groß. In einem Byte kann bei Texten in der Regel ein Zeichen gespeichert werden.000 Büchern. Eine Speicherzelle kann im allgemeinen eine Zahl oder mehrere Zeichen aufbewahren. 210 ergibt 1024 und nicht 1000. daß Informationen wesentlich schneller hineingegeben und wieder herausgeholt werden können als bei externen Speichern. die stark formalisiert sind. Die Ursache dafür ist. Bei Programmen handelt es sich um Algorithmen.B. Externe Speicher haben folgende Speicherkapazitäten: s Diskette: 1. Ein Byte wird zu folgenden Einheiten zusammengefaßt: 1 KB = 1 Kilo-Byte = 1 024 Bytes 1 MB = 1 Mega-Byte = 1 024 KB = 1 048 576 Bytes ≈ 1 Million Bytes 1 GB = 1 Giga-Byte = 1 024 MB ≈ 1 Milliarde Bytes. bestehend aus 70. Ein Bit kann einen zweielementigen Zeichenvorrat darstellen.

1. Eine Computertastatur besteht aus Tasten für die Eingabe von Informationen (Buchstaben.1. hängt von der Anzahl der Pixel ab. 8 Bildschirm Pixel Tastatur . dividieren. genauer gesagt als Maschinensprache. verknüpfen. den ein Prozessor versteht. Gute Grafikeigenschaften erhält man ab 800 mal 600 Bildpunkten (SVGA-Auflösung). eine Informationseingabe abzuschließen. über die der Computerbenutzer mit dem Computersystem kommuniziert (Abb. Auf einem Bildschirm können Informationen angezeigt werden. subtrahieren. meist Pixel (picture element) genannt. dem in einem präzisen Formalismus mitgeteilt werden muß. s deren Sätze aufgrund einer endlichen Menge von Regeln gebildet werden müssen (Syntax) und s die die Bedeutung jedes Satzes festlegt (Semantik). Ziffern. s Informationen vergleichen.1-3. bezeichnet man als Programmiersprache. Den Formalismus. Die wichtigsten sind: Auslöse. Tastatur und Maus Bildschirm. dann weiß er durch seine Erfahrung auch bei nicht detaillierten Formulierungen meist.h. 1. Ein Programm ist deshalb ein Algorithmus. wie der Algorithmus zu verstehen ist. addieren. was es tun soll. Die prinzipielle Arbeitsweise der Zentraleinheit zeigt Abb.2 Bildschirm. Sonderzeichen) sowie einigen Sondertasten zur Computerbedienung. Heute üblich sind gerasterte Grafikbildschirme.1-2). enter): ↵ Sie dient dazu. Bei dem Prozessor eines Computers handelt es sich dagegen um ein technisches Bauteil. mit welcher Auflösung grafische Darstellungen angezeigt werden können. s Informationen aus dem Prozessor in den Arbeitsspeicher transportieren. Grafiken. Im Gegensatz zur Umgangssprache ist eine Programmiersprache eine formalisierte Sprache. formuliert in einer Programmiersprache. Der Prozessor verfügt zum Verarbeiten von Informationen über folgende Fähigkeiten: s Informationen aus dem Arbeitsspeicher in den Prozessor transportieren. Die kleinste Anzeigeeinheit ist hierbei ein Bildpunkt. s deren Sätze aus einer Aneinanderreihung von Zeichen eines festgelegten Zeichenvorrates entstehen. 1.1 Aufbau und Funktionsweise eines Computersystems Programmiersprache Programm formuliert sein.oder Eingabe-Taste (carriage return. Sie ermöglichen die Darstellung von Zeichen.LE 1 1. multiplizieren. d. Führt ein Mensch einen Algorithmus aus. Tastatur und Maus sind die wichtigsten Geräte. Wie fein. Bildern und Filmen.

zusammen mit anderen Tasten gleichzeitig gedrückt.10 3b Verarbeitung durchführen 10 x 23. Das ist eine Zifferntastatur wie bei einem Taschenrechner. der ein Programm schreibt. Prozessor 2 3 Anweisung entschlüsseln Anweisung ausführen 3a 4 3a Arbeitsspeicher Menge einlesen 1 ProgrammPreis einlesen anweisung lesen Warenwert = Menge x Preis Programm ……… ……… 3a Informationen aus Arbeitsspeicher lesen 10 23. Im folgenden Beispiel wird angenommen. Computer mit einem Prozessor bezeichnet man ihm zu Ehren als von-Neumann-Computer.und Dezimalstellen-Tasten. erzeugt werden.1. Für die bequeme Zahleneingabe enthält eine Computertastatur meist einen separaten Zehnerblock. Der Prozessor steuert die Informationsverarbeitung und führt arithmetische.10 Informationen 3c 231.1-3: Prinzipielle Arbeitsweise der Zentraleinheit . die bei der Ausführung des Programms benötigt bzw. die den Transport der Informationen aus dem Arbeitsspeicher in den Prozessor und umgekehrt bewirken. 1. kann jede 9 Abb. Tastatur und Maus LE 1 Ein Programm besteht aus eine Reihe von Anweisungen.und Ausgabeinformationen. Programme und Informationen in einem gemeinsamen Speicher aufzubewahren. Zwischenergebnisse und Ergebnisse werden vom Prozessor im Arbeitsspeicher abgelegt.1. Es wird angenommen. Steuerungs-Taste (control): CTRL oder STRG Diese Taste. Derjenige. Die Idee.und p-Taste bewirkt bei manchen Systemen den Ausdruck von Informationen.2 Bildschirm. meist bezeichnet mit F1 bis F12. Sowohl das Programm zur Fakturierung als auch die Eingabe. weiter bei 2 Informationen Menge: Preis: 10 23. werden im Arbeitsspeicher aufbewahrt.00 Warenwert: Summe Warenwert: Rabattbetrag: Zwischensumme Rabatt: jeweils mehrere Speicherzellen Der Prozessor liest eine Programmanweisung nach der anderen und führt jede Programmanweisung mit den im Arbeitsspeicher aufbewahrten Informationen aus.10 3c Ergebnisse im Arbeitsspeicher abspeichern 231. Beispiel: CTRL. logische und Transportoperationen aus. oft noch erweitert um Rechenoperations. Am oberen Rand einer Computertastatur befinden sich oft sogenannte frei programmierbare Funktionstasten. daß für eine Rechnungserstellung der Warenwert pro Artikelposition aus Menge und Preis zu berechnen ist (Fakturierung). stammt von Johann von Neumann (siehe Kurzbiographie am Kapitelanfang). daß der Benutzer über die Tastatur bereits die Menge und den Preis eingegeben hat und daß diese Werte sich bereits im Arbeitsspeicher befinden. bewirkt bestimmte Aktionen. Transportoperationen sind die Operationen.00 4 nächste Anweisung lesen.

dann wird eine entsprechende Funktion ausgelöst. Der Benutzer kann auf der elektronischen Arbeitsoberfläche eine durch ein Piktogramm repräsentierte Anwendung aktivieren. Bestellungen. zwei oder drei Drucktasten auf der Oberfläche und einer Rollkugel auf der Unterseite (Abb. Ikonen (icons) dargestellt werden. Ein Piktogramm ist eine grafisch abstrakte Darstellung von Objekten.). Wird das Programm vom Computer ausgeführt und die Taste wird gedrückt. Die Maus wird auf eine glatte Oberfläche gelegt und kann dann leicht hin. ist ein schnelles und genaues Positionieren mit CursorTasten nicht möglich. Funktionen. Der Benutzer sieht eine grafische Benutzungsoberfläche (GUI). der die momentane Bearbeitungsposition anzeigt.1-4 zeigt die Analogie zwischen einem »klassischen« Schreibtisch-Arbeitsplatz und der Arbeitsoberfläche eines Computer-Arbeitsplatzes.LE 1 1. Ein Cursor (Läufer). Auf dieser Arbeitsoberfläche können Objekte (Aufträge. auch Schreibmarke genannt. Am häufigsten wird hierfür heute die sogenannte Maus verwendet. Geräte (Telefon. Als Alternativen wurden sogenannte Zeigeinstrumente entwikkelt. daß die Bedienung des Computers besonders einfach wird. Anwendungen oder Prozessen auf dem Bildschirm. an der der Cursor steht.und -ausgangskorb) und Anwendungen (Adreßverwaltung.1-2). schnell direkt oder indirekt auf Bildpunkte oder Bildbereiche zu zeigen. 1. Gibt man ein Zeichen mit der Tastatur ein. Mit Hilfe der CursorTasten kann der Cursor auf dem Bildschirm bewegt werden. 1. Da Grafikbildschirme aus mehreren Hunderttausend Bildpunkten bestehen. meist durch einen Pfeil dargestellt. Posteingangs. Radiergummi. Zusätzlich enthält jede Computertastatur sogenannte Cursor-Tasten. desktop genannt. Durch die Verwendung eines Grafikbildschirms ist es auch möglich. dann wird es im allgemeinen an der Stelle eingefügt.1 Aufbau und Funktionsweise eines Computersystems Maus GUI = graphical user interface Arbeitsoberfläche (desktop) Piktogramme (icons) dieser Tasten mit einer bestimmten Bedeutung belegen. Mit der Funktionstaste F1 wird im allgemeinen eine Hilfefunktion aufgerufen. Rechnungen. die es ermöglichen.und herbewegt werden. In der Regel geschieht dies durch einen Doppelklick mit der Maus auf das 10 .). Textverarbeitungssystem usw. Durch Betätigen einer Taste (Anklicken) kann man bestimmte Aktionen auslösen. Eine Maus ist ein kleines handliches Kästchen mit einer. ist eine oft blinkende Markierung (meist ein senkrechter Strich) auf dem Bildschirm. die Informationsdarstellung auf dem Bildschirm so zu gestalten. Abb. Büroklammern usw. die einer physikalischen Arbeitsoberfläche eines Schreibtisches nachgebildet ist. in Form von Piktogrammen bzw.). auf dem Bildschirm nachvollzogen. Memos usw. Geräten. Man spricht auch von einer »elektronischen« Arbeitsoberfläche. Hilfsmittel (Bleistift. die die Bearbeitung der Objekte ermöglichen. Die Bewegung der Maus wird dabei von einem Maus-Zeiger.

Die Anwendung öffnet dann ein Anwendungsfenster auf der Arbeitsoberfläche. die Bereitstellung einer anwendungsorientierten Grundfunktionalität sowie die Koordination mit den verschiedenen Anwendungen übernimmt ein GUI-System. mit gedrückter Maustaste das Papierpiktogramm über die Arbeitsoberfläche auf das Papierkorbpiktogramm bewegen (drag) und dann die Maustaste loslassen (drop). Beispielsweise können nach dem Start eines Textsystems Textobjekte (Briefe. der ein Stück Papier nicht mehr benötigt. Memos. repräsentiert durch ein Piktogramm. Wenn auf der Arbeitsoberfläche bereits versucht wird.1-4: Vergleich einer traditionellen Arbeitsoberfläche mit einer elektronischen Arbeitsoberfläche GUI-System Beispiel Selektieren. 1. Auf der elektronischen Arbeitsoberfläche kann der Benutzer analog das Stück Papier. so daß mehrere Anwendungsfenster auf der Arbeitsoberfläche sichtbar sind. damit er seine Aufgaben erledigen kann. Das Papierpikto11 Abb.2 Bildschirm. Die auf der Arbeitsoberfläche verfügbaren Elemente »Fenster« und »Piktogramme« müssen vom Benutzer manipuliert werden können. Loslassen (pick. Anwendungsfenster stellen die Benutzungsoberfläche der jeweiligen Anwendung dar.1. Tastatur und Maus Piktogramme für … LE 1 Fenster Mauszeiger entsprechende Piktogramm.1. Das verwendete GUI-System beeinflußt ganz wesentlich die Gestaltung der Anwendungsoberflächen. Ein Anwendungsfenster kann wiederum aus mehreren Fenstern bestehen. Die Verwaltung der Arbeitsoberfläche. eine physikalische Arbeitsumgebung nachzubilden. Der Benutzer kann mehrere Anwendungen aktivieren. Ziehen. drag & drop) . auch die Arbeitsweise auf der elektronischen Arbeitsoberfläche der physikalischen Arbeitsweise in übertragener Form anzupassen. Dokumente) bearbeitet werden. mit der Maus selektieren (pick). Ein Fenster entspricht einem Ausschnitt aus der Arbeitsumgebung des Benutzers und ermöglicht die Bearbeitung entsprechender Objekte. Ein Mitarbeiter. dann liegt es natürlich nahe. ergreift es mit der Hand und wirft es in den Papierkorb.

LE 1

1.1 Aufbau und Funktionsweise eines Computersystems

Abb. 1.1-5: Selektieren, Ziehen und Loslassen (Beispiel)

gramm verschwindet. Das Papierkorbpiktogramm ändert seine Form, um anzuzeigen, daß der Papierkorb etwas enthält (Abb. 1.1-5). Benötigt der Mitarbeiter das Stück Papier aus dem Papierkorb doch noch einmal, dann kann er es aus dem Papierkorb zurückholen. Dies muß auch beim elektronischen Papierkorb möglich sein, sonst stimmt die Analogie nicht. Ist dies nicht möglich, dann muß ein Reißwolf anstelle des Papierkorbs durch ein Piktogramm dargestellt werden.

Bei der direkten Manipulation werden vom Benutzer – in gewisser Analogie zur Arbeitsweise in einer physikalischen Arbeitsumgebung (z.B. Büro) – Arbeitsobjekte (z.B. Dokumente) unmittelbar visuell identifiziert, selektiert (»zur Hand genommen«) und bearbeidirekte tet. Die Bedienungstechnik »Selektieren, Ziehen und Loslassen« Manipulation (pick, drag & drop) ist ein Beispiel für eine direkte Manipulation. 1.1.3 Weitere Ein- und Ausgabegeräte

Neben Texten werden in vielen Anwendungen auch Grafiken, Fotos und Bilder verwendet. Um diese Informationen im Computer speiScanner chern zu können, werden sie durch einen Scanner (Abtaster) oder einen digitalen Fotoapparat aufgenommen, digitalisiert und als Bitmuster dem Computersystem zur Verfügung gestellt. digitale Videofilme können ebenfalls digitalisiert, gespeichert und auf Videokamera dem Bildschirm abgespielt werden. Will man Ausgabeinformationen vom Computer nicht nur auf dem Bildschirm lesen, sondern »schwarz auf weiß« bzw. in Farbe Drucker besitzen, dann benötigt man als Ausgabegerät einen Drucker. Es gibt heute eine Vielzahl von Druckern, die ein breites Leistungsund Preisspektrum abdecken. Die Auswahl eines geeigneten Drukkers hängt vom Einsatzgebiet ab. Aus dem Einsatzgebiet lassen sich Anforderungen an den Drucker ableiten. Häufig verwendet werden heute s Laserdrucker und s Tintenstrahldrucker. Mikrophon, Mikrophon und Lautsprecher ermöglichen den Einsatz gesprocheLautsprecher ner Sprache in Computersystemen. gesprochene In verschiedenen Formen wird die gesprochene Sprache zukünfSprache tig in der Kommunikation mit einem Computersystem und über ein Computersystem verstärkt möglich sein. Die Bearbeitung gesprochener Sprache läßt sich unterteilen in Sprachspeicherung, Spracherkennung und Sprachausgabe. Sprachspeicherung Bei der Sprachspeicherung wird die Sprache über ein Mikrophon aufgenommen. Die Sprache wird digitalisiert, die Daten werden komprimiert und dann auf einem Speichermedium aufbewahrt.

12

1.1.4 Externe Speicher

LE 1

Die Sprachspeicherung kann im Büro für folgende Anwendungen eingesetzt werden: – Verwendung als Diktiergerät, – Versenden von Sprachmitteilungen (voice mailing), – Sprachanmerkungen in Dokumenten. Wie bei einem Diktiergerät kann Sprache aufgezeichnet und über einen Lautsprecher abgehört werden. Zusätzlich können Einfügungen in bereits aufgezeichnete Sprachinformationen vorgenommen werden. Ähnlich wie Dokumente können auch Sprachinformationen in Form von Sprachmitteilungen über elektronische Post an einen oder mehrere Empfänger versendet werden. Spracherkennung bedeutet, daß gesprochene Informationen Spracherkennung vom Computersystem erkannt werden. Spricht der Benutzer z.B. das Wort »Posteingang«, dann muß dieses Wort vom System erkannt und anschließend beispielsweise die eingegangene Post angezeigt werden. Die Spracherkennung eröffnet neue Anwendungen, insbesondere die direkte Sprach-Text-Umsetzung (»automatische Schreibmaschine«, »Sprechschreiber«). Die vollsynthetische Sprachausgabe erlaubt es, einen beliebi- Sprachausgabe gen im Computersystem befindlichen Text vorlesen zu lassen. In mehreren Schritten wird aus einem vorliegenden Text eine Sprachausgabe aufgebaut und synthetisiert, ohne daß vorher eine menschliche Stimme als Vorlage oder Referenz vorhanden war. Zunehmend an Bedeutung gewinnen Multimedia-Anwendungen, Multimedia die Texte, Daten, Grafiken, Bilder, Filme, Töne und gesprochene Sprache kombinieren (Abb. 1.1-6). 1.1.4 Externe Speicher Arbeitsspeicher besitzen sowohl aus technischen als auch aus Kostengründen eine Kapazität in der Größenordnung von vier MB bis zu mehreren hundert MB. Es ist daher nicht möglich, umfangreiche Informationsbestände und eine Vielzahl von Programmen im Arbeitsspeicher über längere Zeit hinweg aufzubewahren. Außerdem gehen alle Informationen im Arbeitsspeicher verloren, wenn der Computer ausgeschaltet wird. Im Arbeitsspeicher befinden sich daher nur die Programme und Informationen, mit denen gerade gearbeitet wird. Für die langfristige Aufbewahrung von Programmen und Informationen hat man besondere Speicher die externen Speicher entwickelt, die wesent- externe Speicher lich preiswerter als Arbeitsspeicher sind und eine höhere Speicherkapazität besitzen. Der Begriff externe Speicher deutet an, daß diese Speicher nicht zur Zentraleinheit gehören. Es gibt verschiedene externe Speichermedien. Sie unterscheiden sich in der Zugriffsgeschwindigkeit, d.h. wie schnell Informationen
13

LE 1

1.1 Aufbau und Funktionsweise eines Computersystems

Abb. 1.1-6: MultimediaSysteme und Anwendungen

Multimedia ist ein Schlagwort, das heute oft in einem sehr umfassenden Sinn verwendet wird. Da es noch keine allgemein akzeptierte Definition gibt, werden verschiedene Definitionen vorgestellt: Schachcomputer »Multimedia ist eine (neue) Kommunikationsform: Computergestützt und medienintegriert und interaktiv« /Steinhau 94/. »Mehrheitlich wird von einem Multimedia-System gesprochen, wenn sowohl diskrete Medien (Text, Raster- und Vektorgrafik) als auch kontinuierliche Medien (Ton, Bewegtbild und Animation) in das System integriert sind und wenn der Benutzer mit dem System interagieren, d.h. den Ablauf steuern kann« /Stahlknecht, Schnieders 94/.

Sensorama

medienintegriert TV

DiaAudiovision

»Ein Multimedia-System ist durch die rechnergesteuerte, integrierte Verarbeitung, Speicherung, Darstellung, Kommunikation, Erzeugung und Manipulation von unabhängigen Informationen mehrerer zeitabhängiger und zeitunabhängiger Medien gekennzeichnet« /Steinmetz, Rückert, Racke 90/. Zeitabhängige Medien sind Bewegtbilder natürlichen oder künstlichen Ursprungs, Audiosignale und Signale verschiedener Sensoren wie Temperatur- und Luftdrucksensoren. Zeitunabhängige Medien sind Texte, Grafiken, Tabellen und Standbilder. Unabhängigkeit der verschiedenen Medien bedeutet, daß sie unabhängig voneinander gespeichert, bearbeitet und eingesetzt werden können. Bei einer Videokamera werden Bild und Ton gemeinsam aufgezeichnet, so daß ein fester zeitlicher Bezug zwischen ihnen besteht. Können Text- und Bildbausteine räumlich beliebig zueinander angeordnet werden, dann sind sie unabhängig voneinander. Durch die zeitliche, räumliche und inhaltliche Synchronisation können unabhängige Medien integriert werden, damit sie gemeinsam eine bestimmte Funktion erfüllen. Es sollten mindestens drei Medien in einem System integriert sein, wobei mindestens ein Medium zeitabhängig sein sollte. Multimedia-Anwendungen multimediale Lehr- und Lernsysteme (CBT = computer based training, interaktives Edutainment), interaktives Entertainment (z.B. interaktive Spielfilme), interaktive Informationssysteme (point of information), Abenteuerspiele, Hypermedia-Systeme (siehe Kapitel 2).

wiedergefunden werden, in der Speicherkapazität und im Preis. Sie lassen sich in drei große Klassen einteilen: s Diskettenspeicher (geringe Kapazität, langsam), s Plattenspeicher (hohe Kapazität, schnell), s CD-ROM-Speicher (mittlere Kapazität, mittlere Zugriffsgeschwindigkeit). Alle Speichermedien (Diskette, Platte, CD-ROM) befinden sich in Laufwerken, die das entsprechende Medium an einem Schreib-/Lesekopf zum Schreiben und Lesen der Informationen vorbeibewegen.
14

1.1.5 Vernetzung

LE 1
Dateien

Informationen werden auf externen Speichern in Dateien (files) abgelegt. Dateien sind vergleichbar mit Karteikästen bei der Ablage manueller Informationen. Um eine Datei speichern zu können, muß sie einen Namen erhalten. Dieser Name wird in einem Inhaltsverzeichnis (directory) auf dem Speichermedium vermerkt. Ebenso die Größe der Datei in Bytes. In diesem Inhaltsverzeichnis sind die Namen aller gespeicherten Dateien enthalten. Dateien können zu Ordnern bzw. Verzeichnissen zusammengefaßt werden, Ordner können wiederum Ordnern zugeordnet werden. Dadurch ist es möglich, Ordnerhierarchien aufzubauen, z.B. Informatik/Grundlagen/LE1.doc , wobei LE1.doc der Dateiname ist, Grundlagen der zugehörige Ordner. Der Ordner Grundlagen gehört wiederum zum Ordner Informatik. Um eine Datei eindeutig von allen anderen Dateien in einem Computersystem unterscheiden zu können, muß die gesamte Hierarchie, Pfad genannt, angegeben werden, wie oben im Beispiel. Oft gliedert man Dateinamen in zwei Teile. Bei dem ersten Teil handelt es sich um den eigentlichen, frei wählbaren Namen wie LE1. Der zweite Teil ist die Dateinamen-Erweiterung, Suffix oder extension genannt, die den Typ der Datei angibt, z.B. txt für eine Textdatei, doc für ein Word-Dokument, wav für eine Audio-Datei, wmf für eine GrafikDatei, bmp für eine Bild-Datei. Der Dateinamen-Suffix wird auch dazu verwendet, um zu einer Datei automatisch die zugehörige Anwendungssoftware zu starten. 1.1.5 Vernetzung

Ordner, Verzeichnisse

Pfad Aufbau von Dateinamen Hinweis: Der Aufbau von Dateinamen hängt vom verwendeten Betriebssystem (siehe Abschnitt 1.1.6) ab. Die hier beschriebene Zweiteilung ist in dem Betriebssystem MS-DOS, das heute Bestandteil von Windows 95/98 ist, vorgeschrieben. In anderen Betriebssystemen ist eine Unterteilung in ein oder mehrere Teile möglich, aber nicht vorgeschrieben.

Computersysteme sind heute in der Regel vernetzt, d.h. sie können mit anderen Computersystemen Informationen austauschen. Damit Computersysteme elektronisch kommunizieren können, müssen sie im allgemeinen physikalisch durch Kabel oder über Funk miteinander verbunden sein. Die Kabel und die Funkstrecken, die die Verbindung herstellen, werden in ihrer Gesamtheit als Netz bezeichnet. Zu dem Kabel als Hardware bzw. den Sende- und Empfangsstationen bei Funk kommt noch die Netz-Software hinzu, die mit dafür sorgt, daß die elektronische Informationsübermittlung stattfinden kann. Zwei wichtige Netze sind s das Intranet und s das Internet. Ein Intranet verbindet Computersysteme eines Unternehmens oder einer Organisation. Das Internet verknüpft weltweit Intranets oder einzelne Computersysteme miteinander. Auf das Internet wird ausführlich im Kapitel Kapitel 1.4 1.4 eingegangen. Es gibt mehrere technische Möglichkeiten, um Netzwerke zu realisieren. In Abhängigkeit von der notwendigen Übertragungsge15

LE 1

1.1 Aufbau und Funktionsweise eines Computersystems

ISDN steht für »integriertes digitales Fernmeldenetz« (integrated services digital network).

schwindigkeit der Informationen können folgende Übertragungsmedien benutzt werden: – Telefon- oder ISDN-Leitungen für geringe Übertragungsgeschwindigkeiten zwischen 14 400 Bit/s und 64 000 Bit/s. Das entspricht 1800 Zeichen/s bzw. 8000 Zeichen/s. – Verdrillte Zweidrahtleitungen (twisted pair) oder Koaxialkabel für mittlere Übertragungsgeschwindigkeiten. Die Geschwindigkeiten liegen zwischen 10 MBit/s, das entspricht etwa 1,25 Millionen Zeichen/s, und 100 MBit/s. – Lichtwellenleiter bzw. Glasfasern für hohe Übertragungsgeschwindigkeiten (100 MBit/s bis hin zu 500 MBit/s). Solche Lichtwellenleiter werden zunehmend für die Verkabelung von Telekommunikations-Netzen und lokalen Netzen verwendet. Die Übertragung von Informationen in Netzen erfolgt paketweise, d.h. die zu übertragenden Informationen werden in ein oder mehrere Pakete (Abb. 1.1-7) fester oder variabler Länge aufgeteilt. Die Pakete werden dann über das Netz transportiert. Die Größe eines Paketes wird üblicherweise beschränkt, so daß die Übertragungsdauer eine bestimmte Zeit nicht überschreitet (meist im Bereich von Tausendstel Sekunden). Bei Übertragungsgeschwindigkeiten im MBit/s-Bereich ergeben sich Paketgrößen im KBit-Bereich. Beispielsweise können 250 Zeichen = 250 Byte = 2000 Bit = 2 KBit als ein Paket übertragen werden.
Zu übertragende Informationen Legende: K = Kopfdaten (header) enthalten: – Empfänger- und Absenderadresse – Nummer des Pakets – Fehler-Code

Abb. 1.1-7: Zum Prinzip der Informationsübertragung mit Paketen

K Paket 1

K Paket 2

K Paket 3

K Paket 4

In Abhängigkeit davon, ob zu einem Zeitpunkt nur ein Paket oder mehrere Pakete parallel im Netz transportiert werden, unterscheidet man Basisbandnetze und Breitbandnetze. In Basisbandnetzen werden mehrere Pakete nur zeitlich hintereinander transportiert (Zeitmultiplex). Breitbandnetze können zeitlich parallel mehrere Pakete übertragen. Dies geschieht dadurch, daß das Übertragungsmedium meist Lichtwellenleiter mit mehreren nichtüberlappenden Frequenzbändern beschickt wird (vergleichbar mit der gleichzeitigen Übertragung verschiedener Sender im Rundfunk). Auf jedem Frequenzband kann unabhängig von den anderen Frequenzbändern ein Paket übertragen werden (Frequenzmultiplex). Durch sogenannte Übertragungsprotokolle wird geregelt, auf welche Weise ein Computersystem Zugang zum Übertragungsmedium erhält. In Abhängigkeit vom Übertragungsmedium und dem verwendeten Übertragungsprotokoll sind für ein Computersystem unterschiedliche Netzanschluß-Systeme nötig:
16

1.1.6 Das Betriebssystem

LE 1
NetzanschlußSystem

Ein Modem (Modulator/Demodulator) wird benötigt, wenn das Computersystem an ein analoges Telefonnetz angeschlossen werden soll. Es wandelt digitale Signale, d.h. Bits, in akustische um. Diese Umwandlung heißt Modulation. Beim Empfänger werden akustische Signale in digitale umgesetzt (Demodulation). s Eine ISDN-Karte wird benötigt, wenn das Computersystem an ein digitales Telefonnetz angeschlossen werden soll. An einen ISDN-Basisanschluß können bis zu acht unterschiedliche Endgeräte angeschlossen werden, von denen wiederum zwei Geräte gleichzeitig benutzt werden können. Beim Schmalband-ISDN sind Übertragungsgeschwindigkeiten bis zu 64 KBit/s erlaubt. Langfristig wird ein Breitband-ISDN angestrebt, das ein Vielfaches dieser Übertragungsgeschwindigkeit ermöglicht. s Eine Netzwerk-Karte wird benötigt, wenn das Computersystem an ein lokales Netzwerk (LAN, local area network) angeschlossen werden soll. Lokale Netzwerke verbinden Computersysteme über kurze Entfernungen (von einigen Metern bis maximal wenigen Kilometern), meist innerhalb einer Institution oder eines Unternehmens. Als Übertragungsmedium werden keine »öffentlichen« Leitungen verwendet. Ein Netzwerk kann nicht nur dazu dienen, Informationen zwischen den angeschlossenen Computern auszutauschen (Informationsverbund), sondern auch dazu, Ressourcen gemeinsam zu nutzen. Ressourcen können beispielsweise Drucker und externe Speicher sein. Da diese Peripheriegeräte relativ teuer sind, können sie als sogenannte Server an das Netz angeschlossen werden. Ein Server ist ein Gerät, das festgelegte Dienstleistungen auf Anforderung für die Teilnehmer im Netz erbringt. Die im Netz befindlichen Computer können dann Druckaufträge an den Druck-Server (es handelt sich dabei z.B. um einen schnellen Laserdrucker) senden. Umfangreiche Informationsbestände können auf einem gemeinsamen Archiv-Server abgelegt werden. Die Computersysteme, meist handelt es sich dabei um die am Arbeitsplatz verwendeten Computer, die Dienstleistungen von Servern in Anspruch nehmen, bezeichnet man als Clients. In manchen Fällen kann ein Computersystem gleichzeitig Client in Bezug auf eine Dienstleistung A und Server für andere Clients in Bezug auf eine Dienstleistung B sein.
s

Hinweis: Der hier benutzte Begriff Karte bezeichnet eine technische Komponente eines Computers, die in das Gehäuse eines Computers nachträglich eingebaut werden kann, daher auch Einsteckkarte oder Einschubkarte genannt. Die Bezeichnung Karte beruht auf der Form der technischen Komponente. Sie hat eine rechteckige Form und besitzt ungefähr die Größe einer DIN-A6-Seite.

Server = Bediener

Client = Klient, Kunde

1.1.6 Das Betriebssystem Zur Steuerung und Verwaltung der einzelnen Komponenten eines Computersystems dient ein sogenanntes Betriebssystem. Das Betriebssystem erledigt unter anderem folgende Aufgaben: Betriebssystem – Voreinstellung der Hardware nach dem Einschalten auf definierte Anfangswerte (bootstrapping).
17

LE 1

1 Einführung

– Eröffnen des Dialogs zwischen Benutzer und Computer über Bildschirm, Tastatur und Maus (console driver). – Interpretation und Ausführung der Kommandos des Benutzers an das Betriebssystem (command interpreter). – Zuweisung verfügbarer Arbeitsspeicherbereiche an die einzelnen Programme (memory manager). – Behandlung der Ein-/Ausgabe-Anforderungen (I/O-manager). – Verwaltung der Peripherie (resource manager). – Verwaltung der Dateien (file manager). Das Betriebssystem selbst ist ein Programm wie jedes andere. Damit es jederzeit Kommandos vom Benutzer entgegennehmen kann, befindet sich ein Teil des Betriebssystems ständig im Arbeitsspeicher des Computers (speicherresidenter Teil). Nicht ständig benötigte Teile befinden sich auf einer sogenannten Systemplatte, d.h. auf einem externen Speicher, und werden bei Bedarf in den Arbeitsspeicher geholt. Es gibt unterschiedlich leistungsfähige und unterschiedlich stark verbreitete Betriebssysteme. Am weitesten verbreitet sind folgende: s Windows 95/98 von der Fa. Microsoft (für Clients), s Windows NT von der Fa. Microsoft (für Server und Clients), s UNIX (für Server und Clients) und die kostenlose Variante Linux, s MVS bzw. OS/390 (für IBM-Großcomputer). Bevor Anwendungssoftware benutzt werden kann, muß sie auf dem entsprechenden Computersystem zunächst installiert werden (wenn sie noch nicht vorhanden ist). Abb. 1.1-8 beschreibt die dazu notwendigen Schritte sowie die Anwendung eines Software-Produkts. 1.1.7 Fallstudie: Die Firma ProfiSoft Nach dem Studium der Informatik mit Schwerpunkt Software-Technik gründen die zwei ehemaligen Absolventen Alexander Klug, genannt Alex, und Robert Neumann, genannt Rob, die Firma ProfiSoft. Ihre im Studium erworbenen Erkenntnisse wollen Sie dazu nutzen, um für Kunden Software zu entwickeln, Kunden zu schulen und zu beraten. Um bei Gesprächen mit potentiellen Kunden einen guten Eindruck zu hinterlassen, entwirft jeder ein persönliches Qualifikationsprofil. Abb. 1.1-9 zeigt das Profil von Alex. Es enthält zusätzlich eine gesprochene Begrüßung, falls das Profil als Datei an den Kunden gesandt wird.

18

1.2 Die Informatik

LE 1

Installation 1 Kauft man ein Software-Produkt, dann erhält man in der Regel ein Benutzerhandbuch sowie eine CDROM oder Disketten, die die Anwendungssoftware enthalten. (Auf die Bereitstellung über das Netz wird im Kapitel 2 eingegangen). 2 Damit das Software-Produkt benutzt werden kann, muß die Software installiert werden. Installieren bedeutet in der Regel, daß die gesamte Software oder zumindest einige Teile vom Datenträger (Diskette oder CD-ROM) auf die Festplatte kopiert werden. Dies geschieht deshalb, weil die Software von der Festplatte schneller in den Arbeitsspeicher geladen werden kann, als von der CD-ROM oder der Diskette. 3 Das Kopieren übernimmt das Betriebssystem, d.h. es liest die Dateiinhalte vom Datenträger, legt Dateien auf der Festplatte an und trägt dort die Inhalte wieder ein. Die Anweisung zum Installieren muß vom Benutzer Betriebssystem Arbeitsüber die Tastatur/Maus an das Betriebssystem geProzessor Instalspeicher geben werden. lationsIn der Regel besitzt jede Anwendungssoftware ein befehl Installationsprogramm, meist setup genannt, das Anzeige kopieren durch Doppelklick mit der Maus auf dem Datenträger gestartet werden muß. Dieses Programm Ein-/Ausgabesteuerung übernimmt dann unter Inanspruchnahme des Betriebssystems die Installation. Das Installationsprogramm erledigt folgende Aufgaben: Tastatur BildCDFesta Festlegen des Funktionsumfangs, der genutzt Maus schirm ROM platte werden soll. b Abstimmung der Software auf die vorhandene Hardware. c Integration in bestehende Programme, z.B. um Daten auszutauschen. d Anlegen eines anwendungsspezifischen Piktogramms auf der Arbeitsoberfläche (desktop), das nach dem Starten des Computersystems jeweils angezeigt wird. 4 Bei Lexika, Telefonbüchern usw. enthält die CD-ROM nicht nur die Software, sondern auch die Informationen, die verarbeitet werden sollen. In der Regel wird nur die Software auf die Festplatte kopiert, die Informationen bleiben auf der CD-ROM. Will man auf die Informationen zugreifen, muß die entsprechende CD-ROM in das Laufwerk eingelegt werden. Benutzung b 5 Um Anwendungssoftware zu nutzen, muß sie Betriebssystem ArbeitsProzessor gestartet werden. Dies geschieht in der Regel speicher c Anw.-Software durch einen Doppelklick auf das entsprechende Doppelklick auf Informationen Piktogramm. Piktogramm In der Zentraleinheit läuft nun folgendes ab: c Anzeige a Laden a Das Betriebssystem lädt, d.h. kopiert, die Ein-/Ausgabesteuerung Anwendungssoftware (ganz oder Teile davon) von der Festplatte in den Arbeitsspeicher. b Anschließend startet das Betriebssystem die Anwendungssoftware. Tastatur BildCDFestc Die Anwendungssoftware wird vom Prozessor Maus schirm ROM platte Schritt für Schritt abgearbeitet. Nach dem Laden wird die erste Anweisung ausgeführt. In der Regel wird das Anwendungsfenster auf dem Bildschirm angezeigt. d Der Benutzer kann aus den angebotenen Funktionen die jeweils gewünschte aktivieren.

1.2 Die Informatik
Parallel zur stürmischen Entwicklung der Computer- und SoftwareTechnik entstand die Wissenschaftsdisziplin Informatik. Zunächst wurde die Informatik als Spezialgebiet innerhalb anderer wissenschaftlicher Disziplinen betrieben. Seit 1960 wird sie nicht mehr nur als eine Ansammlung von aus anderen Wissenschaften (z.B. Logik, Mathematik, Elektrotechnik) entliehenen Methoden und Regeln
19

Abb. 1.1-8: Installation und Benutzung von Anwendungssoftware

LE 1

1 Einführung
Profil von Dipl.-Inform. Alexander Klug Gründer der Firma ProfiSoft zusammen mit Robert Neumann Persönliche Angaben q Geboren in Bochum q Alter 24 Jahre Studium Studium der Informatik q Schwerpunkt: Software-Technik q Diplomarbeit: Erstellung eines multimedialen Lehr- und Lernsystems für die Informatikausbildung (mit Auszeichnung) q Dauer: 10 Semester q Während des Studiums Praktika in verschiedenen Softwarehäusern q 4 Semester lang Hilfsassistent am Lehrstuhl für Software-Technik
q

Arbeitsschwerpunkte in der Firma ProfiSoft Innovative Seminare und Trainings auf dem Gebiet der Software-Technik q Konzeption und Erstellung von multimedialen Firmenpräsentationen q Konzeption und Erstellung von Computer Based Trainings (CBT)
q

Hobbies q Segeln q Fischen

Abb. 1.1-9: Profil von Alex

Definitionen der Informatik
www.gi-ev.de

aufgefaßt. Die Informatik hat sich vielmehr zu einem zusammenhängenden, theoretisch fundierten Gebäude, also zu einer neuen Grundlagenwissenschaft entwickelt, auf die andere Wissenschaften zurückgreifen. Die Informatik ist in mehrfacher Hinsicht eine grundsätzlich neuartige Wissenschaft /Brauer, Münch 96, S. 12 ff/: s Die Hauptprodukte der Informatik sind immateriell, nämlich Software – im Unterschied zu den traditionellen Ingenieurwissenschaften. s Die Produkte der Informatik sind im allgemeinen erst in Verbindung mit materiellen Objekten praktisch nutzbar. s Die Informatik ist potentielle – und meist auch schon tatsächliche – Kooperationspartnerin für jede Wissenschaft und jede Sparte praktischer Tätigkeiten. Obwohl diese Eigenarten der Informatik allgemein anerkannt sind, gibt es jedoch unterschiedliche Ansichten über das Selbstverständnis der Informatik. Es lassen sich folgende vier Positionen unterscheiden (Abb. 1.2-1): s Position 1: Mathematisch-logische Orientierung, s Position 2: Ingenieurwissenschaftliche Orientierung, s Position 3: Evolutionäre Orientierung, s Position 4: Partizipative Orientierung. Entsprechend diesen Positionen wird der Begriff »Informatik« enger oder weiter gefaßt und die Schwerpunkte der Informatik werden verschieden gesehen. Die »Gesellschaft für Informatik«, Interessenvertretung der deutschen Informatiker, verwendet folgende Definitionen:

20

1.2 Die Informatik

LE 1

Position 1: Mathematisch-logische Orientierung /Dijkstra 89/ These: Computer können nur Symbole manipulieren. Sie tun dies mittels Programmen. Programme sind maschinell ausführbare Formeln. Aufgabe der Programmierer ist es, Formeln durch die Manipulation von Symbolen herzuleiten. Informatik befaßt sich also mit dem Wechselspiel von maschineller und menschlicher Symbol-Manipulation. Die Informatik-Grundausbildung muß daher stringent mathematisch-logisch sein. Es ist – ohne Verwendung von Computern – die formale Manipulation einer einfachen imperativen Programmiersprache zu lehren. Ziel ist die Vermittlung der Fähigkeit, korrekte Programme zu schreiben, d.h. gegebene Spezifikationen korrekt in maschinell ausführbare Formeln umzusetzen. Position 2: Ingenieurwissenschaftliche Orientierung /Parnas 90/ These: Informatiker arbeiten de facto wie Ingenieure, weil sie technische Artefakte herstellen. Es fehlt ihnen aber eine Ingenieursausbildung, die fundamentale Methoden wie z.B. Zuverlässigkeitsanalysen komplexer Systeme enthält. Es sollte daher eine Ingenieursausbildung angestrebt werden, die aus mathematischen und ingenieurwissenschaftlichen Kursen besteht. Die Programmierung realer Maschinen sollte im Grundstudium ignoriert werden. Position 3: Evolutionäre Orientierung /Brooks 87/ These: Anforderungen an ein Software-System können bei realen Systemen nicht eindeutig formuliert werden. Spezifikationen erfassen häufig veraltete Anforderungen und verhindern so die rasche und flexible Anpassung an die sich ständig ändernden organisatorischen Strukturen und Aufgaben. Daher hat keine der bisher entwickelten formalen Methoden (algebraische Spezifikation, formale Verifikation, automatische Programmierung) zu einem qualitativen Sprung in der Software-Erstellung geführt. Kontinuierliche Verbesserungen sind die einzige Hoffnung.
Quelle: /Bonsiepen, Coy 92/

Abb. 1.2-1: Zum Selbstverständnis der Informatik

Position 4: Partizipative Orientierung /Bonsiepen, Coy 92/ These: Computer sind Geräte, die bestimmte Funktionen innerhalb menschlicher Tätigkeitsbereiche erfüllen. Sie sind Mittel zum Zweck. Im Mittelpunkt stehen daher die alltäglichen Aufgaben von Menschen, die die Software nutzen. Software-Systeme sind Bestandteil einer funktionierenden Organisation. Der Informatiker muß deshalb den sozialen Kontext des Arbeitsplatzes, die Aufgabenverteilung zwischen Mensch und Computer innerhalb des Arbeitsprozesses verstehen lernen. Software-Systeme sind so zu entwickeln, daß sie einfach, benutzbar und arbeitsunterstützend sind. Ziel der Ausbildung muß es sein, Informatiker zu befähigen, Geräte, Programme und Prozesse zu spezifizieren und zu entwerfen, die den gestellten Anforderungen genügen. Es werden akzeptable Lösungen gesucht, nicht optimale und perfekte.

»Informatik ist die Wissenschaft von der systematischen und automatisierten Verarbeitung von Information. Sie erforscht grundsätzliche Verfahrensweisen der Informationsverarbeitung und allgemeine Methoden ihrer Anwendung in den verschiedensten Bereichen. Für diese Aufgaben wendet die Informatik vorwiegend formale und ingenieurmäßig orientierte Techniken an. Durch Verfahren der Modellbildung sieht sie beispielsweise von den Besonderheiten spezieller Datenverarbeitungssysteme ab; sie entwickelt Standardlösungen für die Aufgaben der Praxis.« /GI 85/ »Informatik ist die Wissenschaft, Technik und Anwendung der maschinellen Verarbeitung und Übermittlung von Informationen.« /GI 87/ Die ACM (Association for Computing Machinery) – größte internationale, wissenschaftliche Organisation der Informatiker – benutzt folgende Definition /Denning et al. 89/:
21

Das Wort »Informatik« wurde 1968 vom damaligen Bundesforschungsminister Stoltenberg anläßlich der Eröffnung einer Tagung in Berlin verwendet. Mit Informatik wurde dabei der wissenschaftliche Hintergrund eines Forschungsprogrammes des Bundes auf dem Gebiet Datenverarbeitung bezeichnet. 1967 war in Frankreich das Wort »informatique« aufgekommen und hat sich inzwischen auch im Holländischen (informatika), Italienischen (informatica), Polnischen (informatyka), Tschechischen und Russischen eingebürgert. In den Vereinigten Staaten entstand Anfang der 60er Jahre der Ausdruck »computer science«. Teilweise scheint sich sowohl im Angelsächsischen (informatics) als auch im internationalen Gebrauch der Wortstamm »Informatik« durchzusetzen.
www.acm.org

LE 1
Computer Science

1 Einführung

Dynamik

»Computer science and engineering is the systematic study of algorithmic processes – their theory, analysis, design, efficiency, implementation and application – that describe and transform information. The fundamental question underlying all of computing is, What can be (efficiently) automated?« Im »Studien- und Forschungsführer Informatik« /Brauer, Münch 96/ wird Informatik aus einer anderen Perspektive betrachtet: »Informatik läßt sich also kennzeichnen durch die drei Begriffe Intelligenz – Formalismen – Technik oder als Intelligenzformalisierungstechnik. Etwas allgemeiner könnte man sagen: Informatik ist die (Ingenieur-) Wissenschaft von der theoretischen Analyse und Konzeption, der organisatorischen und technischen Gestaltung sowie der konkreten Realisierung von (komplexen) Systemen aus miteinander und mit ihrer Umwelt kommunizierenden (in gewissem Maß intelligenten und autonomen) Agenten oder Akteuren, die als Unterstützungssysteme für den Menschen in unsere Zivilisation eingebettet werden müssen – mit Agenten/Akteuren sind Software-Module, Maschinen (zum Beispiel Staubsauger) oder roboterartige Geräte gemeint.« /Langenheder, Müller, Schinzel 92/ charakterisieren Informatik als »Legierung aus Formalwissenschaft, Naturwissenschaft, Technik und Geisteswissenschaften«. /Freytag 93/ betrachtet Informatik ähnlich wie Architektur als Gestaltungswissenschaft (»Form und Kontext plus Methoden«). Der geschichtliche Hintergrund der Informatik wird in Abb. 1.2-2 skizziert. Wegen des universellen Charakters der Informatik läßt sich ihr Gebiet schwer eingrenzen. Aufgaben, Gegenstände und Methoden der Informatik werden stark von den Natur-, Ingenieur- und Geisteswissenschaften beeinflußt. Die Informatik selbst liegt zwischen diesen Disziplinen. Von den Naturwissenschaften unterscheidet sich die Informatik, da ihr Forschungsgegenstand von Menschen geschaffene Systeme und Strukturen sind; von den Ingenieurwissenschaften unterscheidet sie sich ebenfalls, da ihre Betrachtungsgegenstände meist immateriell sind, und von den Geisteswissenschaften unterscheidet sich die Informatik, da sie sich nicht auf Erkenntnisgewinn und Beschreibung von Sachverhalten beschränkt, sondern praktisch anwendbare Ergebnisse erzielt. Zusammenfassend kann man sagen, daß die Informatik eine Strukturwissenschaft ist. Dynamik ist für mich ein charakteristisches Merkmal der Informatik. Ohne das Verstehen der Abläufe in Programmen ist das Wesen und die Faszination der Informatik nicht zu begreifen. Dies erschwert aber auch dem Lernenden den Einstieg in die Informatik. Auf der beiliegenden CD-ROM werden daher wichtige Abläufe animiert dargestellt, um die Vorstellung zu unterstützen.
22

1.2 Die Informatik

LE 1

Die geschichtliche Entwicklung zeigt, daß es dem Menschen im Laufe der Zeit gelungen ist, sich seine Arbeit zu erleichtern. So entstanden von der einfachen Steinaxt über Handwerkzeuge aller Art die heutigen energieverarbeitenden Maschinen wie Motoren, Bagger, Fahrzeuge, Kräne. Diese Maschinen haben dem Menschen im physischen Bereich fast überall die routinemäßige Arbeit abgenommen. Die menschliche Tätigkeit kann sich auf die Planung und Überwachung konzentrieren. Neben der Erleichterung körperlicher Arbeit war der Mensch von Anfang an auch bemüht, sich geistige Arbeit durch geeignete Hilfsmittel leichter zu machen (Abacus, Rechenschieber, Tabellen). Das Lösen von Problemen oder allgemeiner das Verarbeiten von Informationen bedeutet geistige Arbeit. Von einer gewissen Komplexität an lassen sich Probleme nur noch mit Hilfsmitteln lösen. Im Laufe der Wissenschaftsgeschichte sind die zu lösenden Probleme bzw. die zu verarbeitenden Informationen immer komplizierter geworden. Damit hat auch der zur Lösung bzw. Verarbeitung erforderliche Aufwand ständig zugenommen. Als Hilfsmittel entstanden vor etwa 50 Jahren elektronische Datenverarbeitungsanlagen, die als informationsverarbeitende Maschinen die Menschen bei der Lösung von Problemen unterstützten und es ihnen ermöglichen, ökonomisch und rationell zu arbeiten. Geistige Routinetätigkeiten werden uns von Computer-systemen abgenommen. Ein Computersystem kann Informationen wesentlich schneller verarbeiten, als ein Mensch. Als geistiges Hilfsmittel des Menschen potenziert es damit seine Möglichkeiten und eröffnet ihm eine neue Dimension. Durch die Geschwindigkeit heutiger Computer wird ein Zeitraffereffekt erzielt, durch den der Mensch in neue Bereiche eindringen kann und durch den neue Perspektiven sichtbar werden. Technische Spitzenleistungen wie der moderne Brückenbau, die Weltraumfahrt oder die Wahlhochrechnungen wären ohne ein Instrument wie ein Computersystem nicht möglich. Die schnelle Verarbeitung von Informationen sowie die Aufbewahrung von umfangreichen Daten und die Auswertung dieser Daten nach unterschiedlichsten Kriterien potenziert auch Mißbrauchsmöglichkeiten. Es sollte daher jeder durch seine kritische Aufmerksamkeit dazu beitragen, daß die Annehmlichkeiten, die die automatische Informationsverarbeitung uns beschert, allen Menschen zugute kommen, daß die Mißbrauchsmöglichkeiten dieser neuen Technik aber auf ein Minimum eingeschränkt werden.

Abb. 1.2-2: Geschichtlicher Hintergrund der Informatik

Abacus = auf Drähte aufgefädelte Perlen

Der Gegenstandsbereich der Informatik ist vielschichtig. Min- Gegenstandsdestens vier miteinander eng verzahnte Schichten gehören dazu bereich /GI 87/: s Hardware, s Software, s Organisationsstrukturen, s Benutzer und Anwender. Basierend auf einem eng gefaßten Informatikbegriff definiert die »Gesellschaft für Informatik« /GI 85/ den Gegenstandsbereich folgendermaßen: »Die Informatik befaßt sich daher a mit den Strukturen, den Eigenschaften und den Beschreibungsmöglichkeiten von Information und Informationsverarbeitung, b mit dem Aufbau, der Arbeitsweise und den Konstruktionsprinzipien von Rechnersystemen, c mit der Entwicklung sowohl experimenteller als auch produktorientierter informationsverarbeitender Systeme moderner Konzeption,

23

LE 1

1 Einführung

d mit den Möglichkeiten der Strukturierung, der Formalisierung und der Mathematisierung von Anwendungsgebieten in Form spezieller Modelle und Simulationen und e mit der ingenieurmäßigen Entwicklung von Softwaresystemen für verschiedenste Anwendungsbereiche unter besonderer Berücksichtigung der hohen Anpassungsfähigkeit und der Mensch-Computer-Interaktion solcher Systeme.« Die Informatik gliedert sich in die Teilbereiche (Abb. 1.2-3): s Kerninformatik und s Angewandte Informatik. Die Kerninformatik beschäftigt sich mit den zentralen Forschungsgebieten der Informatik. Unter »Angewandter Informatik« versteht man Anwendungen von Methoden der Kerninformatik in anderen Fachwissenschaften. Schwerpunktbildungen innerhalb der Kerninformatik führen zu den Teilgebieten s Theoretische Informatik, Abb. 1.2-3: Gliederung der s Praktische Informatik und Informatik s Technische Informatik.
Nachbarwissenschaften (Schnittstellen) Kerninformatik Informatik Fachwissenschaften, die die Informatik als Hilfswissenschaft verwenden: Angewandte Informatik

Wechselwirkungen

Mathematik (mathem. Logik, Systemtheorie)

Theoretische Informatik Automatentheorie formale Sprachen Codierungstheorie Theorie der Algorithmen Schaltwerkstheorie Praktische Informatik Software-Entwicklung Software-Qualitätssicherung Software-Management Software-Werkzeuge Betriebssysteme Datenbanken Informationssysteme Computernetze Compilerbau

Informatik in den Wirtschaftswissenschaften (Wirtschaftsinformatik) Informatik in den Naturwissenschaften

Volkswirtschaftslehre, Betriebswirtschaftslehre Physik, Physiologie, Chemie Elektrotechnik, Maschinenbau, Bauingenieurwesen Medizin

Informatik in den Ingenieurwissenschaften (Ingenieurinformatik) Informatik in der Medizin (Medizininformatik)

Elektrotechnik (Gerätetechnologie, Nachrichtentechnik) Physik (Halbleitertechnik, Festkörperphysik)

Technische Informatik Hardwarenahe Fragestellungen Funktionsprinzipien der Geräte; logische Struktur der Bauelemente logischer Rechnerentwurf

Informatik in den Geisteswissenschaften

Mathematik, Linguistik, Psychologie, Jurisprudenz, Soziologie, Pädagogik

Informatik in der Gesellschaft

24

1.2 Die Informatik

LE 1

Die schnell wachsende Bedeutung der Informatik sowie die zunehmende Nachfrage nach ausgebildeten Fachleuten auf diesem Gebiet führte Ende der 60er Jahre zur Schaffung des Studiengangs Informatik an Universitäten und Fachhochschulen. Die »Rahmenordnung für die Diplomprüfung im Studiengang Informatik an Universitäten und gleichgestellten Hochschulen« /Rahmenordnung 95/ sagt folgendes zum Informatikstudium: »Die Informatik ist zentral mit der Entwicklung und Beherr- Informatikstudium schung komplexer Informatik-Systeme befaßt. Sie hat sich unbe- Zitat schadet ihrer strukturwissenschaftlichen Grundlagen zu einer ingenieurmäßigen Disziplin im Sinne konstruierender Tätigkeiten entwickelt. Diese Entwicklung wird sich verstärkt fortsetzen. In bezug auf Umfang und Struktur ist der Diplomstudiengang Informatik daher den Studiengängen in den klassischen Ingenieurwissenschaften gleichzusetzen. Dem Diplom-Informatiker steht ein sehr vielfältiges Tätigkeitsfeld offen. Von ihm wird erwartet, daß er in der Lage ist, ingenieursmäßig Methoden und Techniken zur Konstruktion großer Informatik-Systeme anzuwenden, sich schnell in neue Problemstellungen und andere Gebiete einzuarbeiten und durch selbständige Weiterbildung den Anschluß an die Entwicklung seines Faches zu halten. Dazu ist eine breite Ausbildung in den methodischen Grundlagen und die Vermittlung von ingenieurmäßigen Vorgehens- und Verhaltensweisen erforderlich.« Die »Gesellschaft für Informatik« /GI 85/ zählt für das Grundstudium für die »Einführung in die Informatik« (ca. 22 Semesterwochenstunden) folgende Themen auf: s Grundbegriffe, s Methoden und Modelle der Informatik, s Algorithmen, s Konzepte der Programmierung und ihre Anwendung usw. Im »Computing Curricula 91« der internationalen Informatik- www.ieee. organisationen ACM und IEEE (Institute of Electrical and Electronics computer.org Engineers) /Curricula 91/ werden für das Gebiet »Algorithmen und Datenstrukturen« (47 Vorlesungsstunden) folgende Themen vorgeschlagen: s Grundlegende Datenstrukturen s Abstrakte Datentypen s Rekursive Algorithmen s Komplexitätsanalyse s Komplexitätsklassen s Sortieren und Suchen s Berechenbarkeit und Unentscheidbarkeit s Problemlösungsstrategien s Parallele und verteilte Algorithmen
25

LE 1

1 Einführung

In /Bischoff 95/ werden die Studiengänge der Informatik an Fachhochschulen beschrieben. Aussagen zu Lehrinhalten werden nicht gemacht. In einem Themenheft wird die »Objektorientierung in der Ausbildung« ausführlich diskutiert /Informatik-Spektrum 97/.

1.3 Gliederung und Aufbau dieses Buches
Die Curricula zur Grundlagenausbildung in der Informatik bieten dem Lehrenden genügend Spielraum für eigene inhaltliche Schwerpunkte und methodisch-didaktische Konzepte. Inhaltlich orientiert sich dieses Buch mehr an den in Abb. 1.2-1 dargestellten Positionen 3 und 4 als an den Positionen 1 und 2. Jahrelange Unterrichtserfahrung haben mir gezeigt, daß ein theoretischer, deduktiver Einstieg in die Grundlagen der Informatik ohne Computerbenutzung – wie es die Positionen 1 und 2 fordern – demotivierend und realitätsfern ist. Nur eigene Praxiserfahrungen mit Computersystemen von Anfang an geben dem Lernenden ein Gefühl für die Möglichkeiten der Programmierung, zeigen ihm aber auch deutlich die Probleme der Programmierpraxis – insbesondere die Probleme der Spezifikation und der Qualität. Mit diesem Problembewußtsein ausgestattet, ist der Lernende aufnahmebereit für Themen wie Testen, Verifikation, Anforderungsmodellierung, Eigenschaften und Aufwand von Algorithmen. Die didaktisch-methodische Vorgehensweise orientiert sich daher vorwiegend am induktiven Vorgehen, d.h. vom Speziellen zum Allgemeinen. Ausgangspunkt können mehrere Beispiele sein, aus denen dann auf eine allgemeine Regel geschlossen wird. Diese Vorgehensweise wird aber nicht dogmatisch gesehen. Bei Bedarf wird auch deduktiv vorgegangen, d.h. aus dem Allgemeinen wird der Einzelfall bzw. das Besondere hergeleitet. »Lernen durch Beispiele«, »Lernen durch Analogie« und »Lernen durch eigenes Tun« fällt oft besonders leicht. Daher werden diese Lernformen – insbesondere durch die Aufgaben – unterstützt. Da man am meisten lernt, wenn man selbst etwas tut (Merkfähigkeit 90 Prozent), werden eigene Aktivitäten unterstützt. Zu jeder Lehreinheit gibt es multimediale Unterstützungen und Ergänzungen, die auf der beigefügten CD-ROM bzw. über das Internet zur Verfügung stehen. Bei jeder Einarbeitung in ein neues Gebiet muß man sich mit Prinzipien, Methoden, Konzepten, Notationen und Werkzeugen befassen. Prinzipien sind Grundsätze, die man seinem Handeln zugrunde legt. Methoden sind planmäßig angewandte, begründete Vorgehensweisen zur Erreichung von festgelegten Zielen (im allgemeinen im Rahmen festgelegter Prinzipien). Methoden enthalten also den Weg zu etwas hin, d.h. sie machen Prinzipien anwendbar. Methoden geben außerdem an, welche Konzepte wie und wann verwendet werden, um die festgelegten Ziele zu erreichen.
26

induktiv vs. deduktiv

Lernen durch Beispiele, Analogie und eigenes Tun

1.3 Gliederung und Aufbau dieses Buches

LE 1

Konzepte erlauben es, definierte Sachverhalte unter einem oder Prinzip mehreren Gesichtspunkten zu modellieren. Eine Notation stellt Informationen durch Symbole dar. Ein KonMethode zept kann durch eine oder mehrere Notationen dargestellt werden. Werkzeuge (tools) dienen der automatisierten Unterstützung von Methoden, Konzepten und Notationen. Konzept Zentraler Gegenstand der Informatik ist die Software. Eine Software-Entwicklung besteht aus drei Hauptaktivitäten: s Definition der Anforderungen (Systemanalyse), Notation s Entwurf des Software-Systems (Programmieren im Großen), s Implementierung bzw. Programmierung der Software-KompoWerkzeug nenten (Programmieren im Kleinen). Der inhaltliche Schwerpunkt dieses Buches liegt auf den Prinzipien, Methoden, Konzepten und Notationen der Programmierung von Wechselwirkung Software-Komponenten, auch »Programmieren im Kleinen« genannt. Für einen Informatiker sind solide Kenntnisse und Fertigkeiten auf diesem Gebiet unumgänglich, um die Möglichkeiten, Grenzen und Probleme der Realisierung von Software richtig einschätzen zu können. Die Aktivitäten »Definition« und »Entwurf« werden ansatzweise bereits mitbetrachtet (siehe dazu auch: /GI 97/). Diese Thematik gehört aber in eine Vorlesung über Software-Technik (siehe z.B. »Lehrbuch der Software-Technik« /Balzert 96, 98/). Der »rote Faden« dieses Buchs sind die Konzepte der Program- »roter Faden« mierung und Algorithmik. Die wichtigsten Konzepte der SoftwareEntwicklung und der Programmierung sind heute die Konzepte der »Objektorientierung«, wie Objekte, Klassen, Vererbung. Diese Konzepte werden in diesem Buch immer zuerst vorgestellt. Die entsprechenden Kapitelüberschriften lauten dazu: »Zuerst die Theorie: ...«. Anstelle von »Zuerst die Theorie« könnte auch stehen: »Zuerst die Konzepte«. Konzepte werden durch eine oder mehrere Notationen beschrie- UML ben. Als grafische Notation für die Beschreibung objektorientierter Konzepte hat sich die UML (unified modeling language) durchgesetzt, die in diesem Buch fast vollständig eingeführt und benutzt wird. Zur Programmierung werden Programmiersprachen benutzt. Sowohl von den unterstützten Konzepten als auch von der Bedeutung her halte ich objektorientierte Programmiersprachen heute für die Grundlagenausbildung am geeignetsten. Andere Programmiersprachen wie deklarative, funktionale oder logikorientierte Sprachen sind in ihren Konzepten und Anwendungsbereichen zu spezialisiert, um als »erste« Sprache vermittelt zu werden. Betrachtet man wichtige objektorientierte Sprachen wie Java, C++, Smalltalk, Eiffel, Oberon, dann stellt sich die Frage, welche Sprache für die Ausbildung am geeignetsten ist.
27

LE 1

1 Einführung

Vollständigkeit

Entdeckendes Lernen

CASE

Für mich sind folgende Kriterien am wichtigsten: s In der Praxis weitverbreitet und eingesetzt. s Unterstützung allgemein anerkannter Konzepte. s Innovationsgrad der Sprache. s Grad der Normung. s Einfachheit und Eleganz der Sprache. Eine Bewertung der Sprachen anhand dieser Kriterien führt zur Verwendung der Sprachen Java und C++ in diesem Buch. Java steht als Sprache im Mittelpunkt, die speziellen C++-Konzepte werden ergänzend behandelt. Die jeweils verwendete Programmiersprache beeinflußt natürlich stark die Reihenfolge der vorgestellten Konzepte und die Auswahl der Beispiele. Wegen der großen Bedeutung der Objektorientierung in der Software-Technik habe ich mich dazu entschlossen, von Anfang an die objektorientierte Sichtweise einzuführen und nicht zuerst die prozedurale Sicht zu verwenden. Bei jeder Einführung in ein Wissensgebiet sollte der Lernende nicht mit zu vielen Konzepten, Notationen und Begriffen auf einmal konfrontiert werden. Bei dem hier gewählten ganzheitlichen Einstieg in die Objektorientierung werden am Anfang einige Konzepte nur erwähnt und bleiben zunächst im »Nebel«. Nach und nach »lichtet sich der Nebel«, wenn die erwähnten Konzepte detailliert betrachtet werden. Diesem Nachteil steht jedoch der große Vorteil gegenüber, daß von Anfang an die Kernkonzepte der Objektorientierung wie Objekte und Klassen im Mittelpunkt stehen und beherrscht werden. Die Programmiersprachen-Notationen beginnen meistens mit Kapitelüberschriften wie »Dann die Praxis: ...« Eine vollständige Darstellung der Grundlagen der Informatik ist heute in einem Lehrbuch nicht mehr möglich. Auf der einen Seite ist das Gebiet nicht eindeutig abgrenzbar, auf der anderen Seite ist die Innovationsgeschwindigkeit insbesondere bei den Programmiersprachen hoch. Daher erfordert eine Tätigkeit in der Informatik immer lebenslanges Lernen. Im vorliegenden Buch wird die Programmiersprache Java nicht vollständig behandelt. Ausgehend von exemplarischen Darstellungen sollen Sie, lieber Leser, dann durch »entdeckendes Lernen« weitere Sprachelemente selbstständig »erkunden«, sich die nötigen Informationen auf der beiliegenden CD-ROM oder im Internet besorgen und dadurch die Gebiete ihrem Wissen hinzufügen, an denen Sie Interesse haben. Um Software zu entwickeln, ist der Einsatz von Werkzeugen notwendig. Für die Programmierung sind Compiler und Programmierumgebungen unumgänglich. Der Begriff CASE steht für Computer Aided Software Engineering. Er drückt aus, daß Software-Entwicklung mit Hilfe von Software-Werkzeugen erfolgt. Man spricht daher auch oft von CASE-Werkzeugen, um zu betonen, daß der Ein28

1.3 Gliederung und Aufbau dieses Buches

LE 1

satz von Software-Werkzeugen zum Zwecke der Software-Entwicklung gemeint ist. In diesem Buch wird davon ausgegangen, daß CASE-Werkzeuge intensiv eingesetzt werden. Auf der beigefügten CD-ROM befinden sich eine Vielzahl entsprechender Werkzeuge. Auf das Werkzeug GO (generating objects) GO möchte ich besonders hinweisen. Es wurde von meiner Frau und mir entwickelt und ermöglicht den Einsatz der UML in der Analyse mit automatischem Übergang in den Entwurf und anschließender Generierung von Java- und C++-Quellprogrammen. Die Struktur des Buches zeigt Abb. 1.3-1.
Definition Objektorientierte Konzepte UML-Notation GO-Werkzeug Software-Technik Prinzipien Produktverbesserung Prozeßverbesserung Checklisten, Richtlinien

Abb. 1.3-1: Struktur des Buches

Entwurf Objektorientierte Konzepte UML-Notation GO-Werkzeug

Algorithmik Eigenschaften Verifikation Aufwand Listen und Bäume Suchen und Sortieren

Programmierung Objektorientierte Konzepte Java-Notation C++-Notation Java-Compiler C++-Compiler

Anwendungsbereiche kaufmännisch technisch Grafik Multimedia

Globales Ziel des Buches ist es, einen systematischen Überblick über Prinzipien, Methoden, Konzepte und Notationen des »Programmierens im Kleinen« und seine Einordnung in die verschiedenen Kontexte zu geben. Dieses Wissen – verbunden mit den praktischen Übungen am Computersystem – soll den Leser befähigen, s professionell effiziente Programme problemgerecht n zu entwickeln, n zu analysieren, n zu überprüfen, n adäquat in der UML zu beschreiben und n in Java zu transformieren, zu übersetzen und auszuführen.

29

LE 1

Glossar
Algorithmen →Algorithmus. Algorithmus (Plural: Algorithmen), Problemlösungsbeschreibung, die festlegt, wie ein Problem gelöst werden soll (→Programm). Anwender Mitglieder einer Institution oder Organisationseinheit, die zur Erfüllung ihrer fachlichen Aufgaben →Computersysteme einsetzen (→Benutzer). Anwendungssoftware →Software, die Aufgaben des →Anwenders mit Hilfe eines →Computersystems löst. Setzt in der Regel auf der →Systemsoftware der verwendeten →Hardware auf bzw. benutzt sie zur Erfüllung der eigenen Aufgaben. Arbeitsoberfläche Teil einer →grafischen Benutzungsoberfläche, die dem Benutzer quasi als Ersatz für die Schreibtischoberfläche dient. Es können Objekte, Hilfsmittel, Geräte und Anwendungen auf ihr repräsentiert werden. Mit Hilfe der →direkten Manipulation können Funktionen ausgeführt werden. Über →Fenster erfolgt die Kommunikation des →Benutzers mit den Anwendungen. Arbeitsspeicher Medium zur kurzfristigen Aufbewahrung nicht zu umfangreicher Information; Bestandteil der →Zentraleinheit; siehe auch →externer Speicher. Benutzer Personen, die ein →Computersystem unmittelbar einsetzen und selbst bedienen (→Anwender). Betriebssystem Spezielles Programm eines →Computersystems, das alle Komponenten eines →Computersystems verwaltet und steuert sowie die Ausführung von Aufträgen veranlaßt. Bildschirm Ausgabegerät zum Anzeigen von Informationen. Bit (binary digit) Binärzeichen, das nur jeweils einen von zwei Zuständen darstellen bzw. speichern kann, z.B. Null oder Eins. Acht Bits faßt man zu einem →Byte zusammen. Byte Maßeinheit für die →Speicherkapazität. In einem Byte kann ein Zeichen gespeichert werden; siehe auch →Bit. Client Vernetztes →Computersystem, das Dienstleistungen von →Servern in Anspruch nimmt. computer science →Informatik. Computer Technische Geräte, die umfangreiche Informationen mit hoher Zuverlässigkeit und großer Geschwindigkeit automatisch, gesteuert von →Programmen, verarbeiten und aufbewahren können; auch Rechner oder elektronische Datenverarbeitungsanlagen genannt. Computersystem →Computer (→Hardware) und →Programme (→Software). Datei Logisch zusammenhängender Informationsbestand (z.B. Kundenstammdatei), vergleichbar mit einer Kartei bei der manuellen Informationsverarbeitung. desktop »elektronische« →Arbeitsoberfläche. Direkte Manipulation Bedienungsform, bei der analog zu einem physikalischen Vorgang Objekte mit der →Maus auf der →Arbeitsoberfläche selektiert, bewegt und losgelassen werden (pick, drag & drop). In Abhängigkeit von der Zielposition können dadurch Funktionen wie Kreieren, Löschen, Kopieren, Drucken und Verschieben realisiert werden (generische Funktion). Externe Speicher Speichermedien zur langfristigen Aufbewahrung von großen Informationsmengen (Diskettenspeicher, Plattenspeicher, CD-ROM-Speicher). Fenster Rechteckiger Bereich auf dem Bildschirm, der von der →Anwendungssoftware zur Ein- und Ausgabe von Informationen und Kommandos benutzt wird. file →Datei. Grafische Benutzungsoberfläche Grafikbildschirm bestehend aus einer →Arbeitsoberfläche und →Fenstern, über die der Benutzer mit der →Anwendungssoftware interagiert und kommuniziert. GUI →grafische Benutzungsoberfläche. GUI-System Software-System, das die →grafische Benutzungsoberfläche verwaltet und die Kommunikation mit der →Anwendungssoftware abwickelt. Hardware Alle materiellen Teile eines →Computersystems. Informatik Ingenieurwissenschaft von der theoretischen Analyse und Konzeption, der organisatorischen und technischen Gestaltung sowie der konkreten

30

B. gemessen in KB. Speicherkapazität Umfang der Informationen. das aus →Software besteht. d. besteht aus einem Eingabeteil für Zeichen. →externer Speicher. das es ermöglicht. Informationen auf Papier in Bitmuster umzuwandeln (→Bit). Zentraleinheit Teil eines →Computers. Zehnerblock und frei programmierbaren Funktionstasten. das →Clients Dienstleistungen zur Verfügung stellt. GB (→Byte). Software-Produkt Produkt. zugehörige Informationen und notwendige Dokumentation. Externe Speicher dienen zur langfristigen Aufbewahrung von umfangreichen Informationsbeständen. um den Betrieb und die Wartung dieser Hardware zu ermöglichen sowie ihre funktionellen Fähigkeiten zu ergänzen. Der Computer selbst setzt sich aus der Zentraleinheit und der Peripherie (Eingabegeräte wie Tastatur. Dadurch ist es z. möglich. medienintegrierte Software-Systeme. speziellen Sondertasten. Es sollten mindestens drei Medien integriert sein. Maus und Scanner. die für eine spezielle →Hardware oder Hardwarefamilie entwickelt ist. 31 . Die Informationen werden in Form von Dateien (files) auf externen Speichern abgelegt. Software (SW) →Programme. die es zusammengefaßt erlauben.h. Speicher mit direktem Zugriff auf alle Speicherzellen. externe Speicher. Entsprechend der Handbewegung bewegt sich der Cursor auf dem Bildschirm. mit Hilfe eines →Computersystems Aufgaben zu erledigen. Tastatur Eingabegerät zum manuellen Eintippen von Zeichen. Systemsoftware →Software. der maschinell ausgeführt werden kann. ihre Ausführungen vornimmt. evtl. Cursortasten. in der die eigentliche Informationsverarbeitung stattfindet. Fotos. das wiederum aus acht Bits besteht. Grafiken. Die Größe eines Speichers wird als dessen Speicherkapazität bezeichnet. Speicher Medium zur Aufbewahrung von Informationen. zu verarbeitende Informationen aus dem →Arbeitsspeicher liest sowie Zwischenergebnisse und Ergebnisse im →Arbeitsspeicher ablegt. Software-System System. handschriftliche Skizzen in elektronische Informationen zu wandeln. dessen Systemkomponenten und Systemelemente aus →Software bestehen. die automatisch ausgeführt werden sollen. Scanner Abtastgerät. die in einem →Speicher aufbewahrt werden können. andere Bezeichnung →Arbeitsspeicher (interner Speicher). Programmiersprache Formalisierte Sprache zum Schreiben von →Algorithmen. Maus Kleines Kästchen. Prozessor Der Teil der →Zentraleinheit. LE 1 Ein Computersystem besteht aus dem materiellen Computer (Hardware) und den immateriellen Programmen (Software). Die Maßeinheit für die Speicherkapazität ist das Byte. räumliche und inhaltliche Synchronisation unabhängiger Medien gewünschte Funktionen bereitgestellt werden. Ausgabegeräte wie Bildschirm und Drucker. →Arbeitsspeicher. Netzanschluß) zusammen. RAM Random Access Memory. Multimedia interaktive. das mittels der Hand auf dem Schreibtisch bewegt wird. MB. Programm Streng formalisierter. bei denen durch die zeitliche. wobei zumindest ein Medium zeitabhängig sein sollte. Server Vernetztes →Computersystem. der Programmanweisungen aus dem →Arbeitsspeicher liest. besteht aus →Prozessor und →Arbeitsspeicher.Glossar/Zusammenfassung Realisierung von eigenständigen oder eingebetteten Software-Systemen. eindeutiger und detaillierter →Algorithmus.

die sich mit Computersystemen und insbesondere der Theorie und Praxis ihrer Software beschäftigt. bezeichnet man als Informatik (computer science). Anwender liefern Informationen für Computersysteme und nutzen ihre Ergebnisse. Die Verwaltung der Arbeitsoberfläche übernimmt ein GUI-System. Solche Netze können wiederum untereinander verbunden sein (Internet). z. Die grafische Benutzungsoberfläche (GUI) besteht aus Piktogrammen (icons) und Fenstern. Heidelberg: Spektrum Akademischer Verlag 1998 32 . kurzfristig aufbewahrt werden. Computersysteme. Zitierte Literatur /Balzert 96/ Balzert H. in dem die Programme Anweisung für Anweisung ausgeführt werden. bezeichnet man als Server. Programme werden in einer Programmiersprache formuliert. Multimedia-Anwendungen. Lehrbuch der Software-Technik. sind Clients. Bevor ein Programm in einer Programmiersprache geschrieben wird. steuert und koordiniert das Computersystem mit seinen Komponenten.. die in derartigen Netzen Dienstleistungen für andere Computersysteme zur Verfügung stellen. Externe Speicher und der Arbeitsspeicher bilden zusammen den Speicher des Computers. in dem Programme und Informationen. die festlegt. selbst ein spezielles Programm. Jeder Benutzer kommuniziert über eine elektronische Arbeitsoberfläche (desktop) mit dem Computersystem.. und dem Arbeitsspeicher (RAM). Mit Hilfe der direkten Manipulation können Objekte auf dem Bildschirm selektiert und Aktionen darauf angewandt werden. welche Aufgaben auszuführen sind. auch Software-System oder Software-Produkt genannt. Heidelberg: Spektrum Akademischer Verlag 1996 /Balzert 98/ Balzert H. Band 1.B. Software. gliedert man in Anwendungssoftware (application software). Programme teilen dem Computer mit. Das Betriebssystem. In Unternehmen und Verwaltungen sind Computersysteme in der Regel vernetzt (Intranet). Computersysteme. und Systemsoftware. Lehrbuch der Software-Technik. Band 2. die solche Dienstleistungen in Anspruch nehmen. Beide bilden zusammen mit der Hardware ein Computersystem. Benutzer bedienen Computersysteme direkt. nach welchen Regeln (Syntax) die Programme geschrieben werden müssen und welche Bedeutung (Semantik) die einzelnen Programmkonstrukte haben.LE 1 Zusammenhänge/Literatur Die Zentraleinheit besteht aus dem Prozessor. wird die allgemeine Problemlösung oft als Algorithmus – meist in verbaler Form – formuliert. Die Wissenschaft. die zur momentanen Programmausführung benötigt werden.

Müller G. 89/ Denning P. 59–63 /GfK 99/ GfK Online-Monitor. Eine Curriculardebatte. Bonn. Wirtschaftsinformatik an Fachhochschulen. S. Münch S. 1987. pp. Nürnberg. Coy 92/ Bonsiepen L. in: CACM.. 9–23 /Die Zeit 97/ Rüttgers J. Informations. Die ZEIT. (Hrsg. Bundesministerium für Forschung und Technologie. Berlin: Springer-Verlag 1996 /Brooks 87/ Brooks F. 1989. Studien. Untersuchungswelle.. No Silver Bullet-Essence and Accidents of Software Engineering. P. Das Studium der Informatik an Fachhochschulen. Computing as a Discipline. Präsentation der zentralen Ergebnisse. August 1994 /Bonsiepen. Technische Informatik. in: IEEE Computer 20. 1989 /Freytag 93/ Freytag J. in: Informatik-Spektrum.. Düsseldorf. Informatik – cui bono?. 164–165 /GI 87/ Aufgaben und Ziele der Informatik. Schulen ans Netz. in: Informatik-Spektrum. S. 339–341 /Negroponte 95/ Negroponte N. Berlin: Springer-Verlag 1993. Schinzel 92/ Langenheder W.9. S. 3.. 50 /Dijkstra 89/ Dijkstra E. Wissenschaft und Technik. Müller. et al. On the Cruelty of Really Teaching Computer Science. S. Münch 96/ Brauer W. W.. 323–325 /Brauer. München: Bertelsmann-Verlag 1995 LE 1 33 .). Dec. in: Informatik-Spektrum.). June 1991.. Coy W. Oktober 1997. Studien. 10–19 /Curricula 91/ Computing Curricula 1991. in: Informatik-Spektrum.. Braunschweig: ViewegVerlag 1995 /BMFT 94/ Initiative zur Förderung der Software-Technologie in Wirtschaft. Dezember 1997 /Langenheder. in: Informatik als Schlüssel zur Qualifikation. 19.. Berlin: Springer-Verlag 1992 /Necker 94/ Necker T..1997. Bonn. 1987 /GI 97/ Ergänzende Empfehlungen der Gesellschaft für Informatik: Lehrinhalte und Veranstaltungsformen im Informatikstudium. S. Jan. 302–306 /Informatik-Spektrum 97/ Themenheft zu »Objektorientierung in der Ausbildung«. Juni 1985.. Total digital. 1999 /GI 85/ Ausbildung von Diplom-Informatikern an wissenschaftlichen Hochschulen – Empfehlungen der Gesellschaft für Informatik.. J. in: CACM. in: CACM. 20.und Kommunikationstechnik in Deutschland – Visionen und Realitäten. Schinzel B.und Forschungsführer Informatik. 23. 1994.Literatur /Bischoff 95/ Bischoff R. Febr. Arbeitspapier der Gesellschaft für Informatik. Hamburg. S. in: Informatik-Spektrum.. 1.und Forschungsführer-Informatik. Okt. (Hrsg. pp.. 69–84 /Denning et al. pp. Gesellschaft für Konsumforschung. (1992) 15.

Education for Computer Professionals. 621–626 /Steinhau 94/ Steinhau H. in: Screen Multimedia 11/94.. 13.. Rückert.. c Sprechen Sie einen Begrüßungstext und nehmen Sie ihn mit einer geeigneten Software auf.au 10 100 30 25 kB kB kB kB Wieviel Zeit benötigen ein Modem mit 14. 1990. Integrieren Sie ihn in den Text aus a. Rückert H. a Verfassen Sie einen kurzen Text. Racke W. in: Wirtschaftsinformatik. Münch 96/ /Spiegel 97/ Der digitale Mensch.400 Bits pro Sekunde und eine ISDN-Karte eines PC mit 64.7. pp. 36 (1994). Westdeutsche Allgemeine Zeitung..LE 1 Literatur/Aufgaben /Parnas 90/ Parnas D. 10 /Steinmetz. in dem Sie sich vorstellen..html Bild1.gif Bild2. Orientieren Sie sich an der Fallstudie von Abschnitt 1. S. um das Software-Projekt von einem Server auf einen Client zu übertragen? b Wieviel Zeit benötigen Sie zusätzlich. wenn Sie ein eingescanntes Bild aus Ihrem letzten Urlaub mit der Größe 989 KB einfügen? Konstruktive Muß-Aufgabe 30 Minuten 2 Lernziel: Software installieren und benutzen können. in: /Brauer. Diese Aufgaben sollten Sie zunächst zufriedenstellend lösen. b Scannen Sie ein Sie darstellendes Foto ein und plazieren Sie es in den Text aus a. 1990.96 Alle Wissens. C. in: Informatik-Spektrum (Rubrik: Das aktuelle Schlagwort).1. Analytische Muß-Aufgabe 20 Minuten 1 Lernziel: Anhand von Beispielen Übertragungszeiten bei vernetzten Computersystemen berechnen können... Vergleichende Buchbesprechungen. 7..jpg Musik. 280–282 /WAZ 96/ Internet in Deutschland wächst explosionsartig. a Gegeben seien folgende Dateien eines Software-Projektes: Index.. Multimedia-Systeme.. Schnieders 94/ Stahlknecht P. 1995. Verwenden Sie ein Textverarbeitungssystem Ihrer Wahl. bevor Sie die folgenden analytischen und konstruktiven Aufgaben bearbeiten. Schnieders T. 3/1997 /Stahlknecht. Spiegel special. 34 .5. in: IEEE Computer 23 (1).und Verstehens-Aufgaben befinden sich auf der beigefügten CD-ROM 1. Multimedia ist . 17–22 /Rahmenordnung 95/ Rahmenordnung für die Diplomprüfung im Studiengang Informatik an Universitäten und gleichgestellten Hochschulen. Racke 90/ Steinmetz R. S. Essen.000 Bits/Sekunde mindestens. S.

3 1.4.2 1.7.5. verstehen anwenden Das Kapitel 1.8 1.1 1.2 1.1 1. Anschluß. WWW und HTML s s s s s s s s Aufbau.7.5. Anhand der beschriebenen Suchstrategien systematisch im Internet unter Einsatz von Suchmaschinen Informationen recherchieren können. Das Internet 36 Der Aufbau des Internet 36 Der Anschluß an das Internet 38 Die Adressierung im Internet 39 Dienste im Internet 40 Elektronische Post im Internet (e-mail) 41 Nachrichtengruppen im Internet (newsgroups) 45 Plaudern im Internet (chat) 48 Dateien übertragen im Internet (ftp) 49 Computersysteme fernbedienen über das Internet (Telnet) 50 Das World Wide Web (WWW) 50 WWW-Browser 52 Suchen und Finden im Internet 54 Die Sprache HTML 57 Medien einbinden 60 Erweiterungen von WWW-Browsern (plug ins) 62 Erstellen von HTML-Seiten und Bereitstellen auf WWW-Servern 64 Die Bedeutung des Internet 66 Die Firma ProfiSoft im Internet 67 1.1 1.3 1.LE 2 1 Einführung – Internet.und Adressierungsmöglichkeiten des Internet erläutern können. Technik.7. Mit Hilfe der angegebenen Befehle multimediale HTML-Dokumente erstellen und auf WWW-Servern bereitstellen können.4 1.5 1. Einen WWW-Browser so bedienen können. Einen WWW-Browser um plug-ins erweitern können.2 1.5.6. Multimediale HTML-Dokumente bezogen auf die Syntax analysieren können. Die besprochenen Dienste mit ihren Charakteristika beschreiben können.4 1.6 1.7 1.1 muß bekannt sein. 35 .1 1.5.6. daß die besprochenen Dienste im Internet in Anspruch genommen werden können.5.4.4.3 1.9 Auf den beigefügten CD-ROMs befindet sich Software für die Internet-Benutzung.2 1.5 1. einschließlich WWW-Browsern.

das eine Infrastruktur für die Sprachkommunikation bietet.und Zielcomputer ent36 TCP/IP . dann können Informationen zwischen diesen Computersystemen ausgetauscht und gegenseitig Dienstleistungen in Anspruch genommen werden. Sind Computersysteme miteinander vernetzt. n die dasselbe Übertragungs-Protokoll (TCP/IP) verwenden. durch Kabel oder Funk miteinander verbunden. die über Kommunikationscomputer (gateways) erreichbar sind /Schneider 95/. sondern auch A mit C über den gemeinsamen Partner B. analog zum Telefonnetz. Die zu übermittelnden Datenströme werden bei diesem Übertragungsprotokoll in Pakete einheitlicher Größe (siehe Abb.B. Das bekannteste und am meisten genutzte weltweite Netz. 1.4 Das Internet 1.h. die Angaben über die Absender. Jedes Paket wird mit Kopfdaten (header) versehen.4. z.1 Der Aufbau des Internet Das Internet ist durch keine zentrale Organisation aufgebaut worden. d. 1. Vielmehr schließen sich Organisationen. Das Internet stellt somit eine Kommunikationsinfrastruktur zum gleichberechtigten Informationsaustausch zur Verfügung.LE 2 1. Das Internet besteht aus s einer Vielzahl von Computern. Beispiel Definition Internet Gibt es zwischen A und B sowie zwischen B und C eine Verbindung. die von ihrem beruflichen oder privaten Computer-Arbeitsplatz aus direkten Zugriff auf diese Dienste haben. s einer Vielzahl weiterer Netze. das Computersysteme verbindet. ist das Internet. Universitäten. Diese Art der Netznutzung ist konträr zum Telefonieren. das unmittelbar auf dem Verursacherprinzip beruht. die voneinander unabhängig auf verschiedenen Wegen zu unterschiedlichen Zeiten zum Ziel kommen können. zusammen und mieten Leitungen zwischen den einzelnen Mitgliedern mit kostenlosem oder pauschal mitfinanziertem Nutzungsrecht aller Teilstrecken für alle Mitglieder. s einer Vielzahl von Benutzern. n auf denen Dienste angeboten und/oder genutzt werden. dann kann nicht nur B mit A und C kommunizieren. Die Kommunikation zwischen den Computersystemen im Internet geschieht durch das Übertragungsprotokoll TCP/IP (transmission control protocol/internet protocol).1-7) aufgeteilt.4 Das Internet Computersysteme können für sich isoliert eingesetzt oder vernetzt mit anderen Computersystemen betrieben werden. n die direkt oder indirekt miteinander verbunden sind.

Im Zielcomputer werden die einzelnen Datenpakete wieder zu einem vollständigen Datenstrom in der richtigen Reihenfolge zusammengesetzt. 1. sind für die Auswahl der Teilstrecken verantwortlich. Da jeder Benutzer die Ressourcen anderer Partner mitbenutzt. Die Nutzdaten werden aus dem Protokollrahmen des Quellnetzes extrahiert und anschließend in die entsprechenden Datenformate des Zielnetzes umgesetzt. müssen Kommunikationscomputer. daß die Benutzung des Internet nichts kostet. Wegen der Pauschalfinanzierung meinen neue Benutzer meist.4. Einfahrt). kann eine Leitung durch viele Computersysteme gemeinsam genutzt werden.4-1: Datentransport im Internet gateway . Diese isolieren die beteiligten Netze total voneinander. Verlorengegangene Pakete werden automatisch wieder angefordert (Abb. Eine durchgehende Leitung zwischen Sender und Empfänger ist nicht nötig. 37 Abb.1. Spezielle Wegplanungscomputer in den Netzknoten. Nicht alle Computernetze benutzen das Übertragungsprotokoll TCP/IP. 1. zwischengeschaltet werden. sollte er die Dienste sorgfältig und bewußt nutzen. Legende: Computersystem router Verbindung gateway Änderung des Protokolls Paket (TCP/IP-Protokoll) Paket (anderes Protokoll) Da das Übertragungsprotokoll TCP/IP die Datenströme in Pakete aufteilt. Es wird keinerlei Protokollinformation des einen Netzes an das andere Netz weitergegeben. Beim Ausfall einer Übertragungsstrecke können sofort alternative Wege geschaltet werden. Sie analysieren die in einem eintreffenden Datenpaket gespeicherte Zieladresse und ermitteln aufgrund ihrer internen Adreßtabellen (routing tables) den weiteren Weg des Datenpakets durch das Netzwerk. router genannt. Damit Computersysteme solcher Netze ebenfalls mit dem Internet kommunizieren können. Dadurch wird die Datenübertragung wesentlich effizienter.4-1).1 Der Aufbau des Internet LE 2 halten. so daß Netzzusammenbrüche weitgehend vermieden werden. sogenannte gateways (Torweg. Durch die inzwischen weite Verbreitung des Internet wird die Technik des Internet zunehmend auch für firmeninterne Netze verwendet. sondern es werden nur die Nutzdaten übergeben.

Sicherer ist das PPP. beliefern . Der Unterschied der beiden Protokolle besteht in der unterschiedlichen Fehlererkennung und Fehlerkorrektur. die auf TCP/IP aufsetzen. Technisch ist dazu ein Programm nötig. Ein Provider ist eine Institution oder ein Unternehmen. einen sogenannten Internet Service Provider (ISP). Wählleitungen oder paketvermittelnde Netze an das Internet angeschlossen werden. 1. Historisch betrachtet liegen die Ursprünge des Internet in den USA. Der private Benutzer kann sich über das analoge Telefonnetz mit einem Modem oder über das digitale Telefonnetz mit einer ISDNKarte in das Internet einwählen. Kahn die TCP/IP-Architektur in Grundzügen beschrieben. das ursprünglich vier Computersysteme von vier Universitäten verband. Cerf und R. Im Anschluß hieran wurde das TCP/IP-Übertragungsprotokoll nach und nach entwickelt und im ARPAnet als alleiniges Protokoll verwendet. 1974 wurde in einem Artikel von V. Als Firma oder Privatperson muß man einen Internet-Dienstanbieter. Dort forderten in den sechziger Jahren Universitäten und Forschungseinrichtungen ein landesweites Computernetzwerk.2 Der Anschluß an das Internet Lokale Computernetze können über Standleitungen.4 Das Internet Extranet zur Historie Ein Intranet verbindet Computersysteme eines Unternehmens oder einer Organisation basierend auf der Technik des Internets insbesondere des TCP/IP-Übertragungsprotokolls miteinander. Der DFN (Verein zur Förderung eines Deutschen Forschungsnetzes 38 provide = bereitstellen. die für sie relevant sind. Es gibt einer definierten Benutzergruppe einen beschränkten Zugriff auf Informationen. etwa zu Händlern. einer Behörde der US-Regierung. das über verschiedene Zwischenstufen zum heutigen Internet führte. in Anspruch nehmen. Häufig verwendete Protokolle für diesen Zweck sind SLIP (serial line internet protocol) und PPP (pointto-point-protocol). Distributoren und Lieferanten. ist aber kein Teil des öffentlichen Internets.4. Wegen der Robustheit gegenüber Störungen und Ausfällen übernahm das US-Militär diese Technik und erstellte das DARPA-Netz (Defense ARPA). Ein Extranet erweitert ein Intranet zu anderen Unternehmen hin. sich vom heimischen Computer aus über die Hochschule direkt ins Internet einzuwählen (siehe nächsten Abschnitt). Beispiele für Internet-Dienstanbieter sind DFN und UUnet. 1972 wurde daraufhin von der ARPA (advanced research project agency). Als Student oder Mitarbeiter einer Hochschule hat man im allgemeinen die Möglichkeit. das ARPAnet gegründet. die ein an das Internet angeschlossenes Netzwerk für Wählzugänge bereitstellt. das das TCP/IP-Übertragungsprotokoll für eine solche Punktzu-Punkt-Verbindung bereitstellt.LE 2 Intranet 1.

C3. Diese vier Bytes werden dezimal.147. Die Blockung der Adressen erleichtert die Netzverwaltung. Es gibt zur Zeit drei Klassen von Adressen.C2. 0 ≤ B2 ≤ 255 Mit dieser Adresse kann man ca. Von ClassC-Adressen sind erst 4 Prozent vergeben.x.x.B2.x mit 192 ≤ C1 ≤ 255. durch Punkte getrennt.x.4..x wird nicht vergeben). Jeder Betreiber eines lokalen Netzes erhält vom gewählten Internet-Provider einen Block zusammenhängender Adressen und verteilt diese an die angeschlossenen Computersysteme. das vom Rechenzentrum der Universität Karlsruhe betrieben und von den deutschen Internet-Providern gemeinsam finanziert wird.x. geschrieben. 39 IP = internet protocol NIC Adreß-Klassen . s Class-C-Adresse: Aufbau C1. Die IP-Adresse der Ruhr-Universität Bochum lautet 134.147. Die Ruhr-Universität Bochum hat die Class-B-Adresse 134. Für die Wahl eines geeigneten Providers sind ausschlaggebend s der Nutzungspreis und s die Nähe des nächsten Einwahlknotens. V. Das deutsche Internet wird von DE-NIC verwaltet. C3 ≤ 223 Sie erlaubt bis zu 255 Computer in einem Adreßblock. mit 128 ≤ B1 ≤ 191.x.x. 1. Die Telefonkosten vom Standort des Computers bis zum Einwahlknoten müssen vom Internet-Benutzer selbst getragen werden. s Class-B-Adresse: Aufbau B1.x.1.x. UUnet bedient in erster Linie Industrie und Wirtschaft aber auch Privatkunden.x. Statt nun alle Computer der Universität in internationalen Tabellen einzutragen.3 Die Adressierung im Internet LE 2 e. mit 0 ≤ A ≤ 126 Auf der Welt gibt es genau 126 Class-A-Adressen (10. Heute gibt es zahlreiche lokale Provider.x.3 Die Adressierung im Internet Jedes Computersystem im Internet besitzt eine eindeutige »Rufnummer«.4. Sie besteht aus vier Bytes. genügt der Vermerk. 0 ≤ C2. 16 000 Computer verwalten.x. Der Lehrstuhl für Software-Technik hat die IP-Adresse 134.80. Alle Universitätscomputer befinden sich aus Netzsicht hinter diesem Zugangspunkt. wie der zentrale Zugangspunkt (router) der Universität zu erreichen ist.147. 55 Prozent aller Class-B-Adressen sind bereits verteilt. ob der Provider über einen Einwahlknoten im Ortstarif.oder Nahbereich verfügt. Die weltweit eindeutige Kennzeichnung der Computersysteme im Internet übernehmen die NICs (Network Information Centers). seine IP-Adresse.x. Berlin) wurde als Selbsthilfeeinrichtung für Wissenschaft und Forschung gegründet und erhebt pauschale Gebühren. Daher ist es wichtig. die der Größe der jeweiligen Einrichtung entsprechen: s Class-A-Adresse: Aufbau A.

Durch die DNS-Adressen ist es möglich. s Plaudern im Internet (chat). sind leichter zu behalten und erleichtern es.4 Das Internet Da die IP-Adressen schlecht zu merken sind. Die wichtigsten Dienste sind: s Elektronische Post im Internet (e-mail). swt.bereich. Ist der gewünschte Name aber bereits belegt. in dem DNSAdressen in Tabellen gespeichert sind und das DNS-Adressen in IPAdressen übersetzt. bei Städte.B. s Nachrichtengruppen (newsgroups).ruhr-uni-bochum. 1. Diese Namen werden von den NICs vergeben. Sie sind in der Regel folgendermaßen aufgebaut: computer.und Markennamen. wobei Benutzerwünsche berücksichtigt werden. der die erste Anlaufstelle für die Anfragen aus dem Ausland darstellt. auch DNS (domain name system) genannt. daß Adressaten im Internet zwischen Computersystemen »umziehen«. ohne daß die »Sender« informiert werden müssen. Das zuständige NIC überwacht und koordiniert die Nameserver-Funktionen der einzelnen Einrichtungen und betreibt den nationalen Nameserver.5 Dienste im Internet Das Internet ist deshalb so interessant. wobei insbesondere in den USA eine weitere Gliederung verwendet wird: s de für Deutschland s edu Computer im US-Bildungssystem s fr für Frankreich s com Computer in US-Firmen s ch für Schweiz s gov Computer in US-Verwaltungen s at für Österreich s org Computer in US-Organisationen Das Kürzel vor der top level domain soll die jeweilige Institution möglichst gut benennen. Ein Nameserver ist ein Computersystem. s Computersysteme fernbedienen über das Internet (telnet). dann muß im allgemeinen ein anderer gewählt werden.de.B.land DNS Nameserver Die letzte Silbe im DNS bezeichnet man als top level domain. 40 . weil es aus vielen verschiedenen Diensten besteht.institution. s Dateien übertragen im Internet (ftp). Sie gibt in der Regel das Land an. Diese Server werden root-Server genannt. erhalten die Computer im Internet zusätzlich einen oder mehrere funktionsbezogene Namen wie z. ein Computersystem zu lokalisieren. Diese domain-Namen. Ausnahmen gibt es z.LE 2 funktionsbezogene Namen 1. dann werden die Daten zuerst an einen Nameserver geschickt. s WWW (world wide web). Die weitere Systematik bleibt der jeweiligen Institution überlassen. Wird eine DNS-Adresse zur Adressierung eines Zielcomputers verwendet.

um ihre Dienstleistungen zu erbringen. Damit man elektronische Post empfangen kann.1 Elektronische Post im Internet (e-mail) LE 2 Alle diese Dienste benutzen eigene – auf IP aufsetzende – Protokolle.5. 41 . aber fast immer innerhalb eines Tages.ruhr-uni-bochum.@-Zeichen fe« oder »at« (engl. Anschließend speichert der Server die Post in das Postfach des Empfängers. Manchmal in Sekunden.B. Der Briefkopf enthält folgende Angaben: s An (To): Gibt den oder die Empfänger der Nachricht an.5-1 zeigt an einem Beispiel den Aufbau einer »elektroni. Das Internet transportiert die elektronische Post bis zum gewünschten SMTP-Server. der empfangende SMTP-Server nur den linken Teil. hb@swt. müssen mit einer e-mail-Software die Verbindung zu dieser Datei hergestellt und die Daten in das eigene Computersystem übertragen werden. Ein Computersystem.1.server in der Regel die DNS-Adresse ist und Empfänger meist der Vor.5. Für die Übertragung von e-mails wurde ein spezielles Protokoll. Wegen der Bedeutung des WWW wird dieses in einem eigenen Kapitel behandelt. bei)) getrennt. Technisch gesehen bedeutet dies. Die router im Internet bearbeiten nur den rechten Teil der Adresse. Abb. 1. z.server wobei smtp.de Beide Angaben werden durch das @-Zeichen (sprich »Klammeraf. electronic mail) ist der am häufig. das SMTP (simple mail transport protocol).Beispiel schen« Nachricht. Eine e-mail wird technisch gesehen in zwei Schritten befördert. benötigt man eine e-mail-Adresse. Jede e-mail besteht aus einem Briefkopf (header) und der Nachricht selbst. Um die eingegangene Post zu lesen.e-mail sten genutzte Internet-Dienst. erreicht eine e-mail den Empfänger. bezeichnet man dementsprechend als SMTP-Server. Eine e-mail-Adresse ist folgendermaßen aufgebaut: e-mail-Adresse Empfänger@smtp. entwickelt. daß auf dem SMTP-Server des Providers ein elektronisches Postfach (mailbox) existiert. Die für diese Adresse eintreffende Post wird in diesem Postfach – es handelt sich dabei um eine Datei – gespeichert.1 Elektronische Post im Internet (e-mail) Die elektronische Post (e-mail.1.und Nachname oder das Monogramm des Adressaten ist. Im folgenden werden die einzelnen Dienste kurz vorgestellt. über das die Zustellung der elektronischen Post erfolgt. egal wo sich sein Computer befindet.

In Abb. s Anlage (Attachment): Gibt dem Empfänger an.5-1 ist die Anlage in Form eines Piktogramms im unteren Teil des Fensters dargestellt. Der Klammeraffe heißt daher in der englischsprachigen Welt auch commercial a. das alle Vorgaben erfüllte. hinter CC (steht für carbon copy. Der Betreff steht sozusagen auf dem Briefumschlag.h.LE 2 Abb. s CC: Elektronische Post hat den Vorteil.5 Dienste im Internet Beispiel Das @-Zeichen wurde von dem Programmierer Ray Tomlinson 1972 für den Aufbau einer e-mail-Adresse verwendet. s Betreff (Subject): Zunächst sieht der Empfänger nur diesen Betreff und kann entscheiden. Weitere Empfänger können entweder hinter To: angegeben werden. Deshalb ist er bereits auf den ersten amerikanischen Schreibmaschinentastaturen zu finden /Kühnert 97/. Daher ist es einfach. 1. Beim Senden der Nachricht gibt der Autor an. d. die er verwendete. ein Modell 33 Teletype. Das @-Zeichen selbst soll eine Entsprechung des französichen à sein. welche Datei oder Dateien der Nachricht beigefügt werden sollen. sie nicht nur an eine Person. dann verwendet man BCC (blind carbon copy). 42 . Englische Kaufleute sollen das früher so auf ihre Preisschilder geschrieben haben. Er suchte nach einem Zeichen. e-mail wurde ursprünglich nur für Textmitteilungen in ASCII-Format konzipiert. Der ASCII-Code (American Standard Code for Information Interchange) (Abb. daß mehrere Empfänger existieren. 1. daß sie ohne Aufwand beliebig vervielfältigt werden kann. fand er das Zeichen @.5-2) umfaßt – grob gesagt – alle Zeichen. es gibt keine länderspezifischen Sonderzeichen wie Umlaute oder ß. sondern an viele zu versenden.5-1: Beispiel für ein e-mailProgramm 1. 1. oder. die sich auf einer englischen PC-Tastatur befinden. daß die elektronische Nachricht ein oder mehrere Anlagen enthält. s BCC: Sollen die angeschriebenen Personen nicht erfahren. ob er die Post lesen will. das niemals im Namen eines Menschen auftauchen würde und damit als eindeutiger Trenner dienen konnte. Auf der Tastatur. wenn sie die Nachricht nur zur Kenntnis erhalten sollen. der englische Begriff für Durchschlag).

SP Abb. 1965 beschloß die ECMA eine Normzeichentabelle. er hatte nur Großbuchstaben. 10 Positionen sollten nationalen Sonderzeichen zur Verfügung stehen. Genf DOS = Disk Operating System./ ! " # $ % & ´ ( ) * + . Damit ist aber noch nicht das Problem gelöst. Latin Durch Hinzunahme eines achten Bits zu einem 7-Bit-Code wie ASCII ergeben sich 128 weitere Positionen in der Zeichentabelle. Sie entsprach im wesentlichen ASCII. Er beruht auf 16 Bit (2 Byte) und stellt damit 65469 Positionen zur Verfügung. Diese Tabelle wurde 1968 vom ANSI als X3. ergänzt (ISO 8859-1 bis 10) – die Nummer 2 (Latin-2) deckt die mittelosteuropäischen ab. New York ISO = International Organization for Standardization.4 übernommen und zum amerikanischen Normzeichensatz. Bisher wird er nur in Windows NT und der Programmiersprache Java verwendet. . 1981 führte IBM für DOS-Computersysteme die Codepage 437 ein. wie man Bilder oder Töne verschickt. aber auch die großen westeuropäischen Verkehrssprachen berücksichtigte. die sich mit Latin-1 im Zeichenvorrat deckt.1. der alle westeuropäischen Sprachen abdeckte (ECMA-94). Die IBMCodepage 819 für DOS ist identisch mit Latin-1. Unicode (UCS) Seit 1987 ursprünglich von den Firmen Apple und Xerox entwickelter Code. 1. zum Teil auch für nichtlateinische Alphabete. Genf ANSI = American National Standards Institute. 1974 wurde sie internationale Norm (ISO 646. wird das betreffende Sonderzeichen – in der Regel automatisch – in Klammern gesetzt und dort mit einem Zahlenwert codiert. S. Beide Hälften: Latin-1 – Die darstellbaren Zeichen aus der Zeichentabelle »Latin-1« (ISO 8859-1). Im Juni 1992 wurde er zur internationalen Norm (ISO/IEC 10646-1). Er wurde 1986 von der ISO zur Weltnorm gemacht (ISO 8859-1. Diese werden heute auf verschiedene Weise genutzt. der die Schriftzeichen aller Verkehrssprachen der Welt aufnehmen soll: alphabetische wie syllabische und logographische Schriften.1 Elektronische Post im Internet (e-mail) LE 2 ASCII (USASCII) 1963 genormter amerikanischer 7-Bit-Zeichensatz für den Fernschreibverkehr und den Datenaustausch zwischen Computern. Im März 1985 beschloß ECMA einen 8-Bit-Code mit 256 Zeichen. Die deutsche Entsprechung zu ISO 8859-1 ist DIN 66303 (November 1986). Zwischenraum) DEL: Delete (Löschen) Um Sonderzeichen innerhalb eines ASCII-Textes zu verwenden. genannt Latin-1) und ab 1987 nach und nach durch neun weitere Zeichensätze.291ff. Meist wird mit DOS dagegen Codepage 850 verwendet. Linke Tabellenhälfte: ASCII – Die darstellbaren Zeichen aus der Zeichentabelle »ASCII« (ISO 646). 43 . revidiert 1983 und 1991) und gleichzeitig deutsche Norm (DIN 66003).5-2: Genormte Zeichensätze ECMA = European Computer Manufacturers Association. ECMA-6. die Zeichen aber in anderer Reihenfolge anordnet. »Windows« enthält sämtliche Zeichen aus Latin-1 und noch einige mehr. / 0 1 2 3 4 5 6 7 8 9 : . ein Betriebssystem Quelle:/Zimmer 97.5. fügte aber auf den unbesetzten Positionen die 26 Kleinbuchstaben hinzu. die die hinzugewonnenen Plätze für den amerikanischen Datenverkehr nutzte. < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ˆ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ DEL ¡ ¢ £ ¤ ¥ | § ¨ © ª « ¬ ˙ ® ¯ ° ± 2 3 ´ µ ¶ ˙ ¸ ı º » 14 12 34 ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï D Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Y D ß à á â ã ä å æ ç è é ê ë ì í î ï δ ñ ò ó ô õ ö ÷ ø ù ú û ü y p ÿ SP: Space (Leerschritt. Von den 128 Positionen benutzt er nur 100.

Sie erlauben es. Antworten können einfach in den Ursprungstext eingefügt werden. Über www. Sie bewirkt. Eine Mailing-Liste muß abonniert werden (subscribe). vorausgesetzt beim Sender und Empfänger ist MIME installiert.B. daß das Zielcomputersystem die Post ohne Authentifizierung annimmt und für den Empfänger in einem besonderen Bereich bereithält. durch ein vorangestelltes Re. Damit können dann z. Der e-mail-Dienst erlaubt den schnellen. Durch Weiterversenden (forward) kann eine e-mail einem Dritten zugeleitet werden. Diese können dann entweder an die Liste oder auch privat antworten. Anlagen werden binär im MIME-Standard (multipurpose internet mail extensions) übertragen. Eine e-mail.LE 2 1. an eine e-mail jede andere Computerdatei anzuhängen. daß automatisch eine e-mail an den Absender erzeugt wird. damit man an ihr teilnehmen kann.de kann man sich auf diese Mailing-Liste setzen. Word-Dokumente. s Durchschläge (cc) nur wenn unbedingt nötig und nur an einen kleinen beschränkten Empfängerkreis. Anhängsel (attachments) zur Nachricht ermöglicht.h. die man beachten sollte. kein reply verwenden. Mailing-Listen gibt es zu allen möglichen Themen. wenn Kommentare in der Kopie erfolgen. als Unmengen unerwünschter Kopien zu sichten und zu löschen. Es entsteht entweder ein Diskussionsforum oder nur ein Mechanismus zum Verteilen von e-mails. s Kurzfassen! Mailing-Listen erweitern die elektronische Post. Die zu übertragenden Informationen werden beim Versand automatisch in ASCII-Zeichen codiert und beim Empfang wieder automatisch decodiert. d. wird vervielfältigt und an alle Teilnehmer dieser Liste weitergeschickt. Zu diesem Buch gibt es ebenfalls eine Mailing-Liste. Der Ursprungstext wird ebenfalls besonders gekennzeichnet. die an eine Mailing-Liste geschickt wird. sonst auf die Kopie verzichten. eine Zusammensetzung aus Netzwerk und Etikette. Im Internet gibt es eine Reihe von Verhaltensregeln. z.5 Dienste im Internet Antwort (reply) Weiterversenden (forward) Netiquette Etikette = Benehmen. Alle über diese Liste verteilten Nachrichten landen im eigenen Postfach. dann wird dies durch die Antwort-Funktion (reply) erleichtert. Brauch Mailing-Listen Mailing-Liste zu diesem Buch Charakteristika Zur Lösung dieses Problems wurden Anlagen bzw. asynchronen und informellen 44 . bei der der Betreff beibehalten und – je nach Programm – besonders gekennzeichnet wird.B. muß man das Abonnement rückgängig machen (unsubscribe). Charakteristisch für den e-mail-Dienst im Internet ist. Will man eine erhaltene e-mail beantworten. s Bei einer Antwort auf eine e-mail die Kopie nur dann zurücksenden. Um eine Mailing-Liste zu verlassen. Bilder und Ton-Dateien verschickt werden. Für den e-mail-Dienst sollten folgende Regeln eingehalten werden: s Keine irreführenden Betreff-Zeilen eintragen. Diese informellen Benimmregeln werden Netiquette genannt.softwaretechnik. Nichts ist lästiger.

5. Einen solchen fortlaufenden Dialog bezeichnet man im Usenet als Faden (thread). Jeder Teilnehmer kann einen Kommentar zu einer Mitteilung eines anderen Mitglieds an die Gruppe schicken.newusers. Computersysteme. Es gibt folgende sechs klassische Kategorien: s comp Themenbereiche Computersysteme und Informatik s news Themen. Die Mitteilungen des Usenet werden mit Hilfe des Network News Transport Protocols (NNTP) im Internet befördert.de Kategorien der Newsgroups .2 Nachrichtengruppen im Internet (newsgroups) Newsgroups bzw. Im Usenet gibt es über 50.2 Nachrichtengruppen im Internet (newsgroups) LE 2 Austausch von Nachrichten.net/ nntp-list. die über das Internet von jedem benutzt werden können. s sci Themenbereiche Forschung (science) und Anwendung s soc Gesellschaftliche und politische Diskussionen.000 verschiedene Nachrichtengruppen. die sich mit dem Usenet selbst befassen.5. Das bekannteste Computer-Konferenzsystem stellt das weltumspannende Usenet im Internet dar. Ähnlich wie bei Mailing-Listen basiert das Usenet technisch gesehen auf den Möglichkeiten der e-mail. entscheidet jeder ServerBetreiber für sich. Der geographische Ort des Empfängers spielt keine Rolle mehr.1.questions und news. Aus Kapazitätsgründen wird in der Regel nur eine begrenzte Anzahl angeboten. bezeichnet man als NNTP-Server. Es gibt jedoch viele öffentliche NNTP-Server.kanren. Jeder Teilnehmer kann auf die bisher eingebrachten Beiträge eines Forums zugreifen und bei Bedarf eigene hinzufügen.newusers. Um an einer Usenet-Gruppe teilzunehmen.web. Ein weiterer Teilnehmer oder der Autor der ersten Nachricht können wiederum Stellung hierzu nehmen. 45 asynchrone Kommunikation NNTP Übersichten über öffentlich zugängliche Server: http:// www. ComputerKonferenzen abzuhalten. Für Neueinsteiger sind folgende Gruppen nützlich: news. Welche Nachrichtengruppen auf einem bestimmten NNTP-Server angeboten werden.html NewsserverSuchdienst: http://www. Durch eine hierarchische Namensgebung werden die Gruppen gegliedert. über die der Nachrichtenverkehr abgewickelt wird. der an die Orginalnachricht angehängt wird. muß man sie abonnieren (subscribe). 1. Zu verschiedenen Themengebieten gibt es Diskussionsforen. Diese Nachricht wird dann ebenfalls an die bestehenden Mitteilungen angehängt usw. Mitteilungen an eine Nachrichtengruppe werden an diese Adresse geschickt und dann wiederum allen Teilnehmern dieser Gruppe verfügbar gemacht.announce. Bei einer Computer-Konferenz wird über elektronische »schwarze Bretter« asynchron kommuniziert. Jede einzelne Nachrichtengruppe besitzt eine eindeutige Adresse. Nachrichtengruppen ermöglichen es.

für die weniger komplizierte Regeln gelten. s de Deutschsprachige Nachrichtengruppen. Beispiele für Gruppen sind: alt.5 Dienste im Internet Ort für ideologische. wird sie in den Editor geladen. die neue Mitglieder betreffen alt. Testmitteilungen zu verschicken In dieser Hierarchie kann der Benutzer selbst neue Gruppen anlegen und löschen.questions Themen. s misc Vermischtes (miscellaneous). z. de. 1. Im Gruppenbereich werden die abonnierten Nachrichtengruppen verwaltet. Alle auf dem jeweiligen NNTP-Server erhältlichen Gruppen können eingelesen und zum Abonnieren markiert werden.test Erlaubt es. comp. Neben den klassischen Hierarchien gibt es viele sogenannte alternative Hierarchien.B. d. In den klassischen Kategorien entscheidet dies ein Gremium. Bei der Teilnahme an einer Nachrichtengruppe sollten folgende Benimmregeln befolgt werden: 46 .security oder de.alt. Datum und Uhrzeit des Versands sowie den Betreff-Angaben angezeigt.drogen s lokale An jeder Universität existieren örtliche NachrichtenGrup. Eine Nachrichtengruppe beginnt in der Regel mit einem dieser Kürzel. Audio-Dateien und ähnliches alt.binaries Enthalten codierte Bilder.B. religiöse und sonstige kontroverse Debatten.5-3) s Gruppenbereich. z.java. s talk rub.bretter. Unterhierarchien orientieren sich zum Teil an den klassischen Kategorien. Im Nachrichtenbereich werden die in den einzelnen abonnierten Gruppen vorhandenen Mitteilungen mit Absenderangabe. die dann meist nur auf dem lokalen NNTP-Server pen vorhanden sind. Eine solche Gruppe ist z.LE 2 1. die die Regeln der klassischen Kategorien umgehen.h.newusers. der zusammen mit der Mitteilung wieder an die Gruppe geschickt wird.comp. Auf diese Weise entsteht ein »Faden« (thread). Abgetrennt durch Punkte werden die Teile des Gruppennamens von links nach rechts immer spezieller. alles.lang. benötigt man als Software einen Newsreader. um ein neues Forum einzurichten: s alt Gruppen. Am Ende der Mitteilung kann ein Kommentar angefügt werden (follow up). s Nachrichtenbereich und s Editor. was in die anderen Hierarchien nicht paßt.multimedia Newsreader Netiquette Um an den Nachrichtengruppen im Usenet teilzunehmen. Um eine Nachricht zu lesen. Die Benutzungsoberfläche eines Newsreaders gliedert sich in der Regel in die Bereiche (Abb.B.programmer.

answers veröffentlicht. wie viele andere Einsteiger vorher. Mitteilungen nur an die hierfür geeignete Nachrichtengruppe schicken. In multikulturellen Gruppen mit Humor und Ironie vorsichtig sein. um Wiederholungen zu vermeiden. Niemals im Affekt schreiben. um ein Gefühl für die Atmosphäre und die Themen der Gruppe zu erhalten. um nicht dieselben Fragen zu stellen. Zuerst die Liste mit häufig gestellten Fragen durchlesen.1. Diese FAQs (frequently asked questions) werden regelmäßig in den entsprechenden Gruppen und/oder in news. 1. Kurzfassen! Diskussionen zuerst eine Weile mitverfolgen.5-3: Beispiel eines Newsreaders FAQs .2 Nachrichtengruppen im Internet (newsgroups) Gruppenbereich Nachrichtenbereich LE 2 Editor s s s s s s s s Aussagekräftige Betreff-Angaben wählen. 47 Abb.5. Alle Antworten auf Nachrichten (follow ups) lesen. sondern jede Antwort vor dem Abschicken komplett durchlesen. damit die Mitglieder der Gruppe die Nachrichten schnell auf deren Inhalt hin durchsehen können. Erst dann mitreden (Fachbegriff: posten).

Es wird dann angezeigt. Immer daran denken: etliche Tausende lesen mit.h. die mit der Endung ».LE 2 1. Abmelden aus dem Kanal. Fast jede Universität hat ihren eigenen Kanal.ca Anzeige sämtlicher Server. wem die Nachricht gilt.und Kleinschreibung verwenden. Vorsicht mit Abkürzungen (Akronymen). WER NUR IN GROSSBUCHSTABEN SCHREIBT. Gegenüber Problemen in einer fremden Sprache tolerant sein. * ist ein wildcard. Es können auch Leitungsstörungen sein. 1. s /me Der eigene Name wird im chat vorangestellt. sich in nahezu Echtzeit mit anderen Benutzern zu unterhalten – im Gegensatz zur elektronischen Post und zu Nachrichtengruppen. textorientiertes Kommunikationswerkzeug. /me geht es gut! ergibt * Helmut geht es gut! s Name: Nachricht s /part #bochum Durch vorangestellten Namen angeben. 1. # kennzeichnet einen Kanalnamen. Mit folgenden Befehlen kann man sich am Plaudern beteiligen: s /list Anzeige aller Kanäle. die asynchron ablaufen.5 Dienste im Internet s s s s s s s Vollständige Sätze verwenden. 48 . z. Im IRC gibt es unterschiedliche Kanäle (channels). wobei ca für Kanada steht. SCHREIT! Gegenüber Rechtschreibschwächen tolerant sein.5. s /join #bochum Anmelden bei einem Kanal. Um am IRC teilzunehmen. Ein Beispiel für eine Plauderei zeigt Abb. beliebig verwendbare) Spielkarte« Plaudern (chat) im Internet bedeutet. die sich um jeweils ein Thema drehen. der oft wie die Stadt heißt.3 Plaudern im Internet (chat) chat Echtzeit IRC Befehle wildcard = »wilde (d. Groß. s /list *.5-4. die mit dem Buchstaben b beginnen. die der Diskussionsgruppe vielleicht nicht bekannt sind. Aus der Diskussion sparsam zitieren (Fachbegriff: quoten). s /join #neuerkanal Einrichten eines neuen Kanals (bisher nicht verwendeter Name).B.ca« enden. muß man sich bei einem IRC-Server anmelden. das für eine beliebige Zeichenfolge steht. wer im Moment im Kanal angemeldet ist. Der Internet Relay Chat (IRC) ist ein weltumfassendes. s /list #b* Anzeige aller Kanäle.

Damit ist es möglich. In der Regel wird der Zugang zu Computersystemen durch die Vergabe einer sogenannten Login-ID (Identifikation). wird als Login-ID die Angabe »anonymous« oder »ftp« und als Paßwort »guest« oder die eigene e-mail-Adresse angegeben. Damit die Übertragungszeit für Dateien minimiert wird. wurde das file transfer protocol (ftp) entwickelt. muß man sich aus Sicherheitsgründen auf dem gewünschten ftp-Server »ausweisen«. Man spricht von gepackten Dateien. die ein ausführbares Programm enthalten. sind die Dateien in der Regel komprimiert abgespeichert.1. um die Datei zu dekomprimieren.4 Dateien übertragen im Internet (ftp) LE 2 Abb. Nicht selbstentpackende Dateien müssen durch das Programm entpackt werden. Um in den allgemein zugänglichen Bereich eines ftp-Servers zu gelangen.5. Diesen Vorgang bezeichnet man als Einloggen. Heute wird dieser Dienst auch intensiv dazu genutzt. von ftp-Servern Informationen und Software auf das eigene Computersystem zu laden. die mit einem geheimen Paßwort gekoppelt ist.4 Dateien übertragen im Internet (ftp) Um Dateien zwischen Computersystemen im Internet zu übertragen. 1. die nur für einen bestimmten Personenkreis zugänglich sein sollen. Gepackte Dateien müssen nach der Übertragung entpackt werden. Nach dem Verbindungsaufbau werden diese beiden Angaben abgefragt. Da ftp-Server oft auch Dateien bereitstellen. geschützt. entpacken . Es gibt selbstentpackende Dateien. 49 Login-ID Paßwort Einloggen packen. aktualisierte Softwareversionen (updates) über das Netz von der Herstellerfirma zu beziehen.5-4: Beispiel für ein IRC 1. mit dem sie auch gepackt wurden.5.

Programme auszuführen. Gopher 1 Einführung Um Dateien auf öffentlich zugänglichen ftp-Servern zu finden. Dabei arbeitet das eigene Computersystem wie ein an ein zentrales Computersystem angeschlossenes Terminal. s interaktives. s Hypermedia-Informationssystem. Unter einem Terminal versteht man einen Bildschirm und eine Tastatur. dort ändern und dann wieder auf den Zielcomputer übertragen.5. Oxford University. Ohne Telnet müßte man die zu ändernde Datei erst auf den eigenen Computer laden.tudresden.6. sollte sich zunächst Grundlagenwissen aneignen. Telnet »emuliert« auf dem eigenen Computersystem ein zeichenorientiertes Terminal-Fenster. heute: Direktor des WWW Consortiums und principal research scientist am MIT. Wer Telnet benutzen möchte.nw. Mit Hilfe von Telnet ist es daher möglich. Beide indizieren Dateien auf öffentlich zugänglichen ftp-Servern. um elektronische Post zu lesen. wenn man sich von einem fremden Computersystem auf ein Computersystem mit seinem eigenen e-mail-Zugang einloggen will. .LE 2 Archie. Dies ist sehr nützlich. 1. Ausbildung: BA in Physik. Außerdem können mit Telnet Programme direkt auf einem fremden Computersystem gestartet werden. Dadurch wird die Suche nach bestimmten Dateien und deren Lokalisierung möglich.de/gsge/ok/ Telnet. So benötigt der Telnet-Benutzer die Kenntnis spezieller Unix-Kommandos. s verteiltes. kann man die Suchmaschinen Archie und Gopher einsetzen (siehe Abschnitt 1.2). um entfernte Computersysteme ferngesteuert über das Internet nutzen zu können.de/ Workshp/Telnet/ 1. s plattformübergreifendes. Im Gegensatz zu den anderen Internetdiensten basiert das WWW auf der Hypertext-Technik. ist ein s globales. schule.html http://www. W3 oder WWW genannt. Ein Hypertext ist ein Dokument. Ein Terminal besitzt keinen eigenen Prozessor und damit auch keine Möglichkeit. Änderungen auf einem entfernten Computersystem direkt vorzunehmen. Diese Definition wird im folgenden näher erläutert. in dem 50 Tim Berners-Lee Wegbereiter des WWW am Kernforschungszentrum CERN in Genf (1990). die mit einem entfernten Computersystem verbunden sind. kurz Web.5 Computersysteme fernbedienen über das Internet (Telnet) Der Internet-Client Telnet wurde entwickelt. s dynamisches.6 Das World Wide Web (WWW) Das World Wide Web (weltweites Netz).wh8. das auf dem Internet läuft. Terminal Möglichkeiten http://do.

wenn man dies wünscht. dann wird zu dem Dokument verzweigt.U. plattformübergreifend . Durch diese Technik können Dokumente beliebig vernetzt werden.h. Abb.1. Videos. Bilder. Die Verweise auf andere Dokumente bezeichnet man als Hyperlinks. Im WWW kann nicht nur auf textorientierte Dokumente verwiesen werden. verweisen die Hyperlinks im WWW oft auf Dokumente. ist das WWW global und plattformübergreifend. daß ein Dokument von einem völlig anderen Computersystem – u. die sich auf demselben Computersystem befinden. Daher handelt es sich beim WWW um ein verteiltes Informationssystem. Daher spricht man von einem Hypermedia-System.6-1: Beispiel für ein HypertextHilfesystem verteilt global. das das Betriebssystem Windows standardmäßig Beispiel anbietet. Da die Informationen weltweit verteilt und auf Computersystemen unterschiedlicher Hersteller mit unterschiedlichen Betriebssystemen liegen können.6-1 zeigt ein entsprechendes Beispiel. An jeder Verweisstelle kann zu anderen Dokumenten verzweigt werden. Klickt man mit der Maus auf ein solches Wort. d.6 Das World Wide Web (WWW) LE 2 wiederum auf ein oder mehrere andere Dokumente verwiesen wird. Ton usw. Während Hypertext-Hilfesysteme sich in der Regel vollständig auf einem Computersystem befinden. auf das der Verweis zeigt. Ein solcher Verweis wird in der Regel durch ein farbig unterstrichenes Wort gekennzeichnet. 1. die auf anderen Computersystemen im Internet gespeichert sind. benutzt ebenfalls die Hypertext-Technik. Ein Mausklick auf einen Hyperlink im WWW kann also dazu führen. Hypertext-Dokumente müssen nicht mehr sequentiell gelesen werden. Das Hilfesystem.h. von einem anderen Kontinent – auf den eigenen Computer geladen wird. dieses Dokument wird dann auf dem Bildschirm angezeigt. d. sondern auch auf Grafiken. 1. 51 Abb. alle Hyperlinks verweisen auf Dokumente.

von der aber oft abgewichen wird. www gibt an. Doppelpunkt und zwei Schrägstriche (://) geben dem Browser an..ruhr-uni-bochum.html eine http://www. Die Angabe www ist eine Konvention. gegliedert nach Lehreinheiten.html In diesem Beispiel gibt http an. 1. sondern vereint alle anderen Internetdienste unter einer einheitlichen Benutzungsoberfläche. einschließlich der Verweise im Dokument. ist daher folgendermaßen aufgebaut: Adressierung protokoll://dns/verzeichnis /. Da sich die URLs aber öfters ändern.de/multimedia/index. mit der man die Dienste des WWW in Anspruch durchsehen. Außerdem kann es Interaktionselemente wie Druckknöpfe oder Schalter enthalten./dateiname Beispiel Hinweis: In diesem Buch werden eine Reihe von URLs angegeben. nehmen kann. dann wird eine Fehlermeldung ausgegeben. Die Internet-Adresse. daß es sich um den WWW-Server handelt.softwaretechnik. Vom Web aus kann man also alle Möglichkeiten des Internet nutzen. ist es notwendig.oder die DNS-Adresse des gewünschten WWW-Servers verwendet werden. Das Web erlaubt aber nicht nur den Zugriff auf WWW-Dokumente.6.swt. aktuell gehaltenen URL-Liste.. daß das hypertext transfer protocol verwendet werden soll. to browse = Die Software. 52 .1 WWW-Browser Die Adressierung im WWW erfolgt nach denselben Prinzipien wie im Internet. die auf dieses Dokument verweisen. in die der Benutinteraktiv zer Informationen eintragen kann. Im Beispiel wird auf den WWW-Server des Lehrstuhls für Software-Technik zugegriffen und dort auf die Datei index. bei der Adreßangabe mitzuteilen. da der Ersteller eines WWW-Dokuments dieses jederzeit ändern kann. Umgekehrt gibt es aber keine Kontrolle über die Dokumente. Es kann alternativ die IP. Für die Übertragung von WWW-Dokumenten wird im Web das hypertext transfer protocol (http) verwendet. Ein WWW-Dokument kann Formulare enthalten. bezeichnet man als WWW-Browser. Optional kann nach der Computeradresse noch der komplette Pfad bis hin zu einem bestimmten Dokument angegeben werden.6 Das World Wide Web (WWW) Das WWW ist dynamisch. daß jetzt die eigentliche Computeradresse folgt.html in dem Verzeichnis multimedia. befindet sich auf dem Server http:// www. ohne sich mit der speziellen Bedienung verschiedener Zugriffsprogramme vertraut machen zu müssen. welches Protokoll für die Übertragung zum gewünschten Computersystem verwendet werden soll. herumstöbern Da WWW-Browser nicht nur auf WWW-Dokumente zugreifen können. wie sie für einen WWW-Browser verwendet wird.de/ buchgdi. Wird ein Verweis nicht gefunden. sondern auch mit allen anderen Servern im Internet kommunizieren können.LE 2 dynamisch 1. Daher ist das Web interaktiv.

Druckknöpfen und einem Feld Adresse. Die erste Seite eines Web-Dokuments bezeichnet man als Startoder Leitseite (home page).de Die im WWW verwendete. Dabei kann der Verweis auf einen völlig anderen Server zeigen. URL home page Abb.6-2). standardisierte Darstellung von Internetadressen bezeichnet man als uniform resource locator (URL). Ist das Computersystem mit dem Internet verbunden.6-2: Beispiel eines WWW-Browser 53 . 1.swt.1.ruhr-uni-bochum.server. dann wird automatisch die erste Seite des angegebenen Web-Dokuments in das Computersystem geladen und angezeigt (Abb. die dann über das Netz in das Computersystem geladen werden. 1. ftp://ftp.1 WWW-Browser LE 2 Will man über einen Browser auf einen ftp-Server zugreifen. z. dann lautet die allgemeine Adressenangabe: ftp://ftp. Als Voreinstellung befindet sich in diesem Feld in der Regel bereits eine URL.B. Nach dem Start eines Web-Browsers erscheint auf dem Bildschirm ein Fenster mit Menüleiste.6. Durch Anklicken von Hyperlinks auf der Startseite gelangt man zu anderen Web-Seiten. Dies merkt man unter Umständen überhaupt nicht.

Beispiel Gestaltung and (Web-Seite or WWW-Seite or home page) In Abhängigkeit von der Art der gesuchten Information. aber auch Wortanfängen gesucht werden. siehe nächstes Kapitel) und unsichtbare Schlüsselworte (keywords) ausgewertet. gibt es unterschiedliche Möglichkeiten: s Anregungen und Ideen: Newsgroups oder Mailing-Listen. »der« usw. die in einem engen Zusammenhang mit dem interessierenden Thema stehen.LE 2 1. s Eine Sucheinschränkung ist auch durch die Angabe des Erstellungsdatums oder des Erstellungszeitraums möglich. Das Problem besteht darin. Schlüsselwörter sind: Gestaltung. kann nach beliebigen Wortendungen.6-4) und erstellen ein Verzeichnis der darin vorkommenden Wörter. Übersicht über viele öffentlich zugängliche Mailing-Listen: http://www.newusers.mun. WWW-Seite. design. da dort oft nur für das Thema relevante Wörter verwendet werden. mit einem Hinweis in welchen Dateien sie gefunden wurden. liefern. Um die Menge der gefundenen Adressen zu reduzieren. s Durch die Reduktion auf den Wortstamm (trunk).2 Suchen und Finden im Internet Im Internet befinden sich Unmengen an Informationen. Eine Anfrage mit Schlüsselwörtern liefert dann als Ergebnis alle Web-Adressen zurück. kann oft auch nur in Zusammenfassungen (abstracts) gesucht werden. Gestalten usw. allerdings ohne Füllwörter wie »und«.6. Im allgemeinen wird das ? für genau einen oder keinen Buchstaben und der * für eine beliebige Anzahl von Buchstaben verwendet. Web-Seite./cc/tsg/lists/index. Beispiel Es sollen Gestaltungshinweise für Web-Seiten gefunden werden. or und not verknüpft werden. 1. Mit Hilfe von Sonderzeichen. Web-Seiten selbst verfügen über keine Zusammenfassung.questions 54 . s Mehrere Suchbegriffe können mit den booleschen Operatoren and. home page.6-3 und 1. die hinter dem Schlüsselwort auftauchen. jedoch werden die Titelzeile (<titel>.ca. gezielt gewünschte Informationen zu suchen und zu finden. allgemeine Es gibt folgende allgemeine Suchstrategien: Suchstrategien s Festlegung von Schlüsselwörtern. Internet-Suchmaschinen (search engines) durchsuchen autoSuchmaschine matisch alle verfügbaren Dateien (Abb. Diese Wörter werden alphabetisch geordnet als Index gespeichert. sogenannten »wildcards« werden Platzhalter für beliebige Buchstaben geschaffen. s Beispiel Eine Suchanfrage mit »Gestalt*« wird Texte mit Worten wie Gestaltung.html Einstieg bei Newsgroups: de.6 Das World Wide Web (WWW) 1.

6. Wissenschaftliche Informatikorganisationen: ACM (Association for Computing Machinery) http://www.hbz-nrw.computer. die sich mit entsprechenden Themen befassen.loc. 1-6-3: Beispiel für die »home page« einer Suchmaschine 55 .org IEEE (Institute of Electrical and Electronics Engineers) http://www.org GI (Gesellschaft für Informatik) http://www.1.6-3). Abb.swbv.html s Fakteninformationen: ftp oder WWW Empfehlenswert ist der Einstieg über Institutionen oder Organisationen. 1.acm.cgi Library of Congress USA: http://lcweb.uni-Konstanz.de Außerdem kann über Suchmaschinen gesucht werden (Abb.2 Suchen und Finden im Internet s LE 2 Referenzinformationen Literatursuche: Nordrhein-westfälischer Bibliotheksverbund: http://www.gi-ev.gov/homepage/index.de/CGI/cgi-bin/opacform.de Südwestdeutscher Bibliotheksverbund: http://www.

de/ -url: http://my.de Bester Suchdienst für denjenigen. Beispiele Yahoo! http://www. aber oft überlastet. Newsgroups usw. Who Where? http://www. Übersicht über Suchmaschinen: http://www.se/tk/websearch_systemat.searchenginewatch. Lycos: http://www.com Spezialisiert auf Newsgroups.web.com. Metacrawler: http://www.de: http://vroom.fireball.vlib.com 56 .com Übersichtliche Suche. die sich entlang der Hyperlinks ziellos durch das WWW »hangeln« und alle Seiten in eine Datenbank aufnehmen.site. Fireball: http://www. Nur WWW. auch jene für e-mail-Adressen.Lycos.hotbot.com Hervorragendes Abfrageformular. die sie auf ihrem Weg finden. riesiger Datenbestand. Excite: http://www.com Dogpile: http://www. http://www.kolibri. Kolibri: http://www.com Schnelle Suche.dejanews.com/infind_de Deutsche Metasuchmaschine. e-mail-Adressen.excite.de Ausgefeilte Suchparameter. Hotbot: http://www.dogpile.Lycos. Metasuchsysteme: Schicken eine Anfrage gleichzeitig an mehrere Suchdienste. getrennte Suche nach Personen und Netzadressen. wieviele Hyperlinks von außerhalb auf die Web-Seite http://my. Klein (meist bis 100 000 Einträge).6-4: WWW-Suchdienste Kataloge: Systematisch nach bestimmten Themengebieten angelegt. Magellan: http://www.de Suche auch nach längeren Begriffen.ub2.de Hohe Aktualität. Anschriften Telefonnummern. Infoseek: http://www.de Deutscher Katalog-Suchdienst. Organisationen. die genau wissen was sie suchen.com.yahoo. web-robots.LE 2 1 Einführung Abb. http://www. Für alle.albany. Suche kann auf Rubriken beschränkt werden.de Umfangreich. sinnverwandte Begriffe möglich. fast alle existierenden Suchmaschinen abzufragen.site. spiders): Softwaresysteme. kennt deutsche Sonderzeichen und Umlaute. Dejanews: http://www. Metasuchsysteme All-in-one: http://www. aber genau. 1.dino-online. Web. sondern auch Newsgroups und e-mailAdressen. Auch ftp.net Erlaubt es. Virtual Library (CERN): http://www. Sucht auf Wunsch nicht nur Web-Seiten. http://www.excite.metacrawler.com Inference Find: http://www.mckinley.infind.org Für wissenschaftlich und wirtschaftlich Interessierte. Die Abfrage + link: http://my.de/ erlaubt es festzustellen.whowhere.com.com Durchsucht auch ftp und Newsgroups.de Deutscher Suchdienst.infoseek. Suchmaschinen (search engines. Webcrawler: http://webcrwaler.altavista.de Dino: http://www.lu. was es zu einem bestimmten Thema alles gibt.de/ zeigen.yahoo.html http://www. der erst einmal wissen will.com Speziell zum Auffinden von Personen. Alta Vista: http://www.site.

Ton usw. eine Web-Präsentation (web site) besteht aus einer oder mehreren Web-Seiten.w3. Hier helfen Programme wie Archie. oft in Form eines Inhaltsverzeichnisses. WebDokument bzw. Der Aufbau und die Struktur von Web-Dokumenten wird mit der Sprache HTML (Hyper Text Markup Language) beschrieben.org/ Markup/Wilbur/ http://w3. 1.org/TR/ REC-html40 Hyperlinks Quid pro quo. die Text. Quid pro quo. 1. Außerdem adressiert die URL die Startseite. Die Startseite gibt meist einen Überblick über den Inhalt der Präsentation. den Zugriff auf die verschiedenen InternetDienste über eine einheitliche Benutzungsoberfläche zu ermöglichen. Zusätzliche Hilfe bei der Suche bieten spezialisierte Softwaresysteme. Um eine große Kompatibilität zwischen verschiedenen Computerplattformen zu ermöglichen. Schwieriger ist die Suche nach Dateien auf ftp-Servern.1. s Personen und Institutionen. 1. HTML ist eine Seitenauszeichnungssprache und bietet die Möglichkeit.6-4). wurde HTML entwickelt. Ziel war es. die Web-Robots und Software-Agents (Handelnde.7 Die Sprache HTML Ein Web-Dokument bzw. Die meisten Leser beginnen mit dieser Seite den Einstieg in die Web-Präsentation. Die Startseite stellt den Einstieg in das Web-Dokument dar. WebPräsentation Seiten innerhalb des Web-Dokuments Abb. Grafik. Quid pro quo. enthalten und in einer sinnvollen Weise über Hyperlinks miteinander verbunden sind (Abb. Bilder. Quid pro quo. 1. Für diese Sprache ist das später dafür gegründete WWW Consortium (W3C) zuständig. Gopher oder ftpsearch.6-3 und Abb.7-1: Aufbau eines Web-Dokuments 57 .2 eingeführt.org/TR/ REC-html32 http://w3. inhaltliche Kategorien von Dokumenten durch HTML-Befehle zu kennzeichnen. WWW Suche mit Hilfe einer Suchmaschine (Abb.7 Die Sprache HTML LE 2 Das WWW wurde 1991 am europäischen Kernforschungszentrum CERN in Genf entwickelt. Quid pro quo.7-1). Start-Seite (home page) HTML-Referenzen: http://www. Im Januar 1997 wurde HTML 3. 1. Reisende) genannt werden.

htm bzw . Hervorhebungen (formatting) <B> Fetter Text (bold) </B> <I> Kursiver Text (italic) </I> <U> Unterstrichener Text (underline) </U> <HR> Horizontale Linie (horizontal rule) (Achtung: kein Abschlußbefehl) <BR> Zeilenumbruch (break) (Achtung: kein Abschlußbefehl) Wird das HTML-Dokument mit einem Texteditor erstellt. der verschiedene Formatierungsanweisungen enthalten kann </BODY> </HTML> Die Titelzeile erscheint nicht im Dokument selbst. dann ist die Datei als ASCII-Datei mit der Endung . Grundgerüst eines vollständigen HTML-Dokuments: <HTML> <HEAD> <TITEL> Titelzeile des Dokuments </TITLE> </HEAD> <BODY> Eigentlicher Inhalt des Dokuments. Jede inhaltliche Kategorie wird in entsprechende HTML-Formatierungsbefehle (tags) »eingebettet«.B. Der Abschlußbefehl wiederholt den Anfangsbefehl und enthält einen vorangestellten Schrägstrich.7-1: Die wichtigsten HTML-Befehle Jedes HTML-Dokument setzt sich prinzipiell aus zwei Abschnitten zusammen: dem Kopfteil (header): <HEAD> Kopfteil </HEAD> dem eigentlichen Dokument. s Abschnitte (paragraphs). Zeilenumbrüche haben keine Wirkung.LE 2 1 Einführung tags Inhaltliche Kategorien sind z. Überschriften (headings) <H1> Überschriftsebene 1 </H1> bis <H6> Überschriftsebene 6 </H6> Abschnitte (paragraphs) <P> Abschnitt </P> Es wird eine Leerzeile eingefügt.htm>" Ein Beispiel </A> Bild einbinden (image) <IMG ALIGN = TOP oder MIDDLE oder BOTTOM SRC ="URL"> 58 . 1. sondern – in Abhängigkeit vom jeweiligen Browser – beispielsweise in der Titelzeile des WWW-Browsers. d.h. Außerdem wird die Titelzeile von Suchmaschinen ausgewertet. Rumpf genannt (body): <BODY> Hauptteil </BODY> Jeder HTML-Befehl ist in spitzen Klammern eingeschlossen. s Sechs verschiedene Überschriftsebenen (headings). es gibt einen Anfangsbefehl und einen Abschlußbefehl. s Aufzählungen (bulleted lists). HTML-Befehle sind in der Regel symmetrisch aufgebaut.html abzuspeichern! Aufzählungen (unordered lists) <UL> <LI> Listenelement (list item) <LI> Listenelement … </UL> Numerische Aufzählungen (ordered lists) <OL> <LI> Listenelement <LI> Listenelement … </OL> Hyperlink einbinden (anchor) <A HREF = "URL"> Bezeichnung des Hyperlinks </A> Beispiel für Zugriff auf lokale Datei in Windows: <A HREF = "file://localhost/c:\html\ Beispiel. Beim Laden eines so gekenn- Tab.

www. Beim Laden des HTML-Doku. erfolgt die Darstellung des gewünschten sefaktuell/ Formats – im Unterschied zu einem Textverarbeitungssystem – http://www.7-2: HTMLRohtext und seine BrowserDarstellung 59 .dir.Information_and_ Documentation/ ments interpretiert der WWW-Browser die HTML-Befehle und setzt Data_Formats/HTML/ sie in eine entsprechende Darstellung um.7-2 zeigt.7 Die Sprache HTML LE 2 zeichneten Dokuments in einem Web-Browser formatiert der Browser das Dokument und stellt es entsprechend dar.de/ Wie die Abb.com/Comnicht bei der Erstellung des Dokuments. 1. wenn dieses puters_and_Internet/ in einen WWW-Browser geladen wird. Tab. 1. yahoo. 1. Verschiedene Browser Abb.rungen in HTML: http:// tierte Darstellung dieses Textes in einem Web-Browser gegenüber.7-2 stellt einen Web-Text mit Formatbefehlen und die forma. sondern erst.1. Liste mit EinfühAbb.7-1 zeigt die wichtigsten Formatierungsbefehle von HTML. 1.teamone.

Diese briefmarkengroßen Miniaturen werden Daumennägel (thumbnails) genannt. Auf Web-Seiten ist es üblich.html"><\IMG SRC = "Pfeil. MIDDLE oder BOTTOM SRC = "URL"> Hinter ALIGN (alignment) wird angegeben. Bilder. des Bildes ausgerichtet wird oder in der Mitte (middle) oder am unteren Rand (bottom) (Abb. 1. eines Lautsprechersymbols. um »lokale« HTML-Dokumente. Jeder WWW-Browser verfügt über einen Befehl (z. in der das Bild bzw.B.gif"></A> thumbnails Damit ist es möglich.1 Medien einbinden HTML-Dokumente enthalten ausschließlich Text.gif"><IMG SRC = "kleinesBild. damit der Benutzer schon eine Vorstellung von dem Bild bekommt. z.h. kann dann die Datei ausgeführt werden.7-4).B. 1.LE 2 1. Die ALIGN-Angabe bezieht sich nur auf die Textzeile.mp2.B. zu laden. 60 . Durch Anklicken wird dann das Vollbild angezeigt. An der gewünschten Stelle wird vielmehr ein Hyperlink auf die entsprechende Datei gesetzt. in der Farbe blau und unterstrichen.7-3). Steht ein <IMG>-Befehl innerhalb eines <A>-Befehls. mp3).7. Daher müssen andere Grafikformate vorher entsprechend konvertiert werden. Auf allen Computerplattformen ist in der Regel das au-Format verfügbar.7 Die Sprache HTML stellen das HTML-Dokument unterschiedlich dar. mp2 Analog zu Bildern können auch Audio-Dateien aufgerufen werden.B. Die meisten Browser unterstützen in der Grundausstattung nur die Grafik-/Bildformate gif und jpg (Abb. bevor – wegen der Übertragungszeit – das ganze Bild erscheint. Audio und Video können im Unterschied zu einem komfortablen Textverarbeitungssystem nicht direkt in das Dokument eingebunden werden. dann wird nach Anklicken des Bildes zur Verweisstelle verzweigt. d. ob der auf diesen Befehl folgende Text rechts am oberen Rand (top) der Grafik bzw. Der entsprechende HTML-Befehl lautet: <IMG ALIGN = TOP.gif" ></A> Beispiel Audio au. <A HREF = "Startseite. Die Anzeige der für Hyperlinks definierten Textteile erfolgt in der hierfür im jeweiligen Browser festgelegten Darstellung. wav. die sich auf demselben Computersystem befinden. die Formatierungsbefehle müssen nicht von jedem Browser gleich umgesetzt werden. von Bildern und Grafiken eine verkleinerte Form als Vorschau zu erstellen. Open Local File). die Grafik aufgeführt ist. oft auch die Formate wav und mpeg-Audio (. Piktogramme zum Navigieren innerhalb eines Web-Dokuments einzusetzen. Durch Anklicken eines entsprechenden Piktogramms. 1. z. z. <A HREF = "grossesBild. Andere Medien wie Grafiken.

in folgender Form: <ADDRESS> Helmut Balzert <A HREF = "mailto:hb@swt. Wird ein Web-Dokument oft geändert. Wünschenswert ist es. direkt eine e-mail an die betreffende Person zu senden. dann sollte das letzte Änderungsdatum angezeigt werden. ohne die Adresse nochmals ins e-mail-Programm eingeben zu müssen. 61 .ruhr-uni-bochum.7-3: Beispiel für das Einbinden von Grafiken und Bildern PiktogrammSammlungen sind zu finden unter: http:// dir.5-2. im Aufbau).yahoo.ruhr-uni-bochum. linke Seite der Tabelle).de </A> </ADDRESS> ADDRESS Dieser Befehl ermöglicht es.B.1 Medien einbinden LE 2 Abb.1.7.com/ leo/lia/ Am Ende der Startseite sollte angegeben werden. 1.com/Arts/ Design_Arts/ Graphic_Design/ Web_Page_Design_and_ Layout/Graphics/ http:// www. auf der Web-Seite einen Verweis zur e-mail-Adresse des web masters anzubringen. z.edu. Außerdem sollte der Zustand des Dokuments aufgeführt werden (fertiggestellt. Diese Person bezeichnet man als »web master«. HTML unterstützt ursprünglich nur den unteren Teil des ISO. 1.Sonderzeichen Latin1-Zeichensatzes (siehe Abb.au/ ~anthony/icons/ index.html http:// www.sct.gu.de" > hb@swt. wer für das Web-Dokument verantwortlich oder zuständig ist.silverpoint.

nach und nach baut sich das Bild als Mosaik aus quadratischen Feldern auf.com/html/ Damit der gesamte ISO-Latin1-Zeichensatz verwendet wird. ohne daß die Wahrnehmung wesentlich beeinträchtigt wird. Außer einer Reduzierung der Farbpalette verwendet gif zusätzlich eine LZWKompression.7-4: Grafikformate im Web Alles über gif: http://members. sondern ähnlich wie bei einer Fernsehröhre versetzt. com/gifanim/ index0. testgrnd. die der Browser aufruft. 1.edu/ Text in Bildern nicht geeignet. Die Dateigröße nimmt nur minimal zu. Für Portraits.B. desto geringer ist auch der Platzbedarf. Dies sind eigenständige Programme auf demselben Computersystem. die wenige optische Informationen enthalten. .1 bis 4. Sie arbeitet zeilenweise und bleibt daher bei horizontalen Farbverläufen wirkungslos. Jedoch ist das Bild dann zunächst unscharf zu sehen.zampano. HTML-Dokumente in eine geeignete Darstellung zu überführen und anzuzeigen. daß sie möglichst wenig Speicherplatz benötigen und daher kurze Übertragungszeiten erlauben.jpl.6 Die benutzergerechte Gestaltung einer Web-Präsentation gehört zu dem Gebiet der »Software-Ergonomie«. 1. da mit der Reduzierung der Farben Daten verloren gehen.htm http://www. Sie werden beim Laden immer kleiner und schärfer. Ein gif-Bild besitzt eine Farbpalette.gov/PNG/ png-Format (portable networks graphics) Eignet sich für Animationen.7. ist folgender HTML-Befehl in den Kopf des HTML-Dokuments einzutragen: <META HTTP-EQUIV = "Content-Type" CONTENT = "text/html".aol.h. Alles über png: http://quest. Die Einstellung auf eine begrenzte Farbtabelle darf erst am Ende erfolgen. z.html Für Netzübertragungen wurden Grafikformate entwickelt. wenn ein Dokument einem 62 Helper Applications Quelle: /Meissner 96/ Progressives jpeg-Format Erlaubt mehrere »scans« in einem Bild. Je kleiner die Farbtabelle. dann verringert sich die Ladezeit entsprechend. Landschaftsaufnahmen und ähnliches. die Bilder und Grafiken so komprimieren. Übersicht über Sonderzeichen und Codes: http://www. Alles über jpeg: jpeg-Format (joint photograph expert group) http://www. Die älteste Erweiterungsmöglichkeit sind die sogenannten Helper Applications (Hilfsanwendungen) oder External Viewers (externe Betrachter). d. Einzelbilder können in Abhängigkeit voneinander gespeichert werden.7 Die Sprache HTML Abb. december. Kapitel 4. Ist in der Datei festgelegt.2 Erweiterungen von WWW-Browsern (plug ins) WWW-Browser waren ursprünglich nur in der Lage.LE 2 1. daß zuerst jede fünfte Zeile gezeigt wird.htm Der DCT-Kompressionsalgorithmus (discrete cosinus transformation) reduziert die Daten. Für Strichzeichnungen oder missouri. gif-Format (graphics interchange format) Für Grafiken. die bis zu 256 Farben (8 Bit pro Pixel) enthalten kann. ~c675830/jpeg_tests/ Kommt bei fotografischen Motiven der menschlichen Sichtweise entgegen.phlab. obwohl auch der Inhalt des Bildes verändert wird. Bilder mit Schrift. interlaced gif-Format Die Zeilen eines Bildes werden nicht nacheinander dargestellt. com/royalef/ gifabout. CHARSET = "iso-8859-1">. nasa.

html passenden MIME-Type entspricht. sondern übernehmen selbst die Kontrolle über ihren weiteren Ablauf. daß es keine standardisierte Rückkopplung zum aufrufenden WWW-Browser gibt. z.B. Kommen die Daten von einem WWW-Server. External Viewers stellen die Daten nicht innerhalb des Web.de/ ~stlo/links.html http://www1.External Viewers Browsers dar. Es werden keine Programme auf das eigene Computersystem geladen.plug-ins scape sogenannte plug-in-Schnittstellen (Einsteck-Schnittstellen) entwickelt. 63 . Sie können mit dem Netscape Navigator.2 Erweiterungen von WWW-Browsern (plug ins) LE 2 Abb. sondern nur Daten. sonst gibt es eine Zuordnung zu einem Dateinamen-Suffix. ist im Web-Browser festgelegt. . gif und Beispiel jpeg. Nachteilig ist. Welches Programm solch ein Dokument darstellen soll.glover. 1.7. auf folgenden Netzadressen: http:// www. Die Vorgehensweise ist relativ sicher. über definierte Schnittstellen kommunizieren und sind in eine Web-Seite integrierbar.B. wurden von der Firma Net. dem Web-Browser der Firma Netscape. einer Datei eine Kategorie und einen Untertyp zuzuordnen. Es handelt sich bei den plug-ins um Anwendungen. dann ist der MIMETyp im HTTP-Vorspann angegeben. Um diese Nachteile zu vermeiden.tuchemnitz. Ein Bild hat den MIME-Typ Image und Untertypen wie z.1. MIME ist die multipurpose internet multimedia extension und ermöglicht es.gif .7-5: Bilder als Verweisstellen Hinweise zur WebGestaltung erhält man z.B.com/ sucky.

7-6) und Video bzw. s Einsatz eines HTML-Konverters bzw. Einführung in VRML: http:// home. erfolgt beim Start des Navigators. 1.com. s VRML (virtual reality modeling language): Ermöglicht die Beschreibung. Darstellung und das Navigieren in virtuellen 3D-Räumen. Inzwischen gibt es aber auch komplette interaktive Anwendungen. Registrierung genannt. Welche plug-ins bekannt sind.html Der Einsatzzweck bestand ursprünglich darin.LE 2 1. sogenannte Kanäle (channels) zu abonnieren und WWW-Seiten auf seine eigenen Bedürfnisse zu personalisieren.netscape. Filters. Plug-ins werten MIME-Typen aus.tisny. dann gilt das zuletzt eingetragene plug-in. 64 . Mit Hilfe von plug-ins ist es auch möglich. der ein Dokument in ein HTML-Dokument umwandelt.w3. abzuspielen.com/ comprod/products/ navigator/live3D/ intro_vrml. Auch ist es möglich.html Beispiel für VRML: Statistische Karte der USA: http:// www. Radio (Abb. Sind mehrere dem gleichen Typ zugeordnet. Viele plug-ins für Netscape sind heute plattformübergreifend verfügbar. herstellereigene Dokumentformate statt mit einem externen Viewer direkt im Browser zu betrachten. HTML-Seiten zu erstellen: s Einsatz eines Texteditors und Verwendung der HTML-Befehle. zeigt die interne URL about:plugins. die mit Software der Firma Macromedia erstellt wurden.com/ vrml/ usamap2.org/ tools Folgende Möglichkeiten gibt es.3 Erstellen von HTML-Seiten und Bereitstellen auf WWW-Servern Überblick über HTML-Werkzeuge: http://www. s pdf (portable document format): In diesem Format dargestellte Dokumente können angezeigt werden.7. Fernsehen über das Internet zu hören bzw.apnpc.html. 1. Multimedia-Anwendungen.7-6: Beispiel für Radio über das Internet 1. Dieses Eintragen. zu sehen. Die bekanntesten plug-ins sind: s Shockwave: Ermöglicht es.7 Die Sprache HTML Überblick über plug-ins: http:// www.au/ familypc/1997/ 9706/plugin. Plug-ins haben uneingeschränkten Zugriff auf den Web-Client. Abb. Im Gegensatz zu plug-ins haben die meisten Web-Browser einen Interpreter für Java-Programme fest integriert.

ohne daß die Verweise ungültig werden. Folgendes ist zu tun: 1 Alle zur Web-Präsentation gehörenden Dateien sind in ein Haupt. Web-ServerVerwaltungswerkzeug und Web-Server-Software). z. 2 Alle Verweise in den Dateien sollten relativ zum Hauptver. dann müssen sie auf einen Web-Server übertragen werden. Relative Verweise beginnen mit dem Datei.3 Erstellen von HTML-Seiten und Bereitstellen auf Web-Servern s LE 2 Erweiterung von Standardanwendungen. damit sie im Internet allgemein zugänglich sind.B.. daß jede Datei durch den richtigen Dateityp gekennzeichnet ist. Unterverzeichnisse können für Grafiken verzeichnis usw.html befindet sich im Verzeichnis unterverzeichnis und dieses im aktuellen Verzeichnis. Ton. absolute Verweise beginnen mit einem Schrägstrich »/«. s WWW-Browser mit integrierten HTML-Editoren und s vollständige WWW-Entwicklungsumgebungen (Editor. Sind die HTML-Seiten erstellt. der oberste Index für jede Präsentation sollte Dateinamen den Dateinamen index. HREF = ". 3 Die Start-Seite bzw. in dem das aktuelle Verzeichnis ist. wenn die URL keine ex.relative Verweise zeichnis gesetzt werden.B. 4 Überprüfen./datei. HREF = "datei. HREF = "unterverzeichnis/datei. angelegt werden.oder UnterverzeichnisNamen. z. Die konkrete Übertragungsart hängt vom Server ab. 5 Übertragen des gesamten Hauptverzeichnisses an die vorgegebene Stelle auf dem Web-Server.1.html" datei. s HTML-Editoren.html befindet sich im Verzeichnis oberhalb des aktuellen Verzeichnisses – dasselbe Verzeichnis.html" datei.html" datei. Textverarbeitungssystemen.au. 65 .index.7.html plizite Startseitenangabe enthält. da diese Datei von vielen Startseite: Browsern als Voreinstellung geladen wird.html befindet sich im Beispiele aktuellen Verzeichnis.ein Hauptverzeichnis zu legen. Dadurch kann man das Hauptverzeichnis auf verschiedene Server legen. um HTML-Zusätze (add-ins).html erhalten.

com/ zone/www/ report. 40 Zahl der weltweit im Internet verbundenen Computersysteme (in Millionen) Abb.8-1).8 Die Bedeutung des Internet aktuelle Zahlen zum Internet: http://www.000.com http://www. s Die Zahl der Web-Adressen versiebzehnfachte sich 1995 von etwa 235. s Suchmaschinen erfassen heute zwischen 35 und 55 Millionen Web-Adressen. das dann von 200 bis 500 Millionen Anwendern benutzt wird.uw.000 Netzwerke von Universitäten. 1.html http:// www.headcount.8-1: Zahl der weltweit im Internet verbundenen Computersysteme /IEEE Spectrum 98/ 35 30 25 20 15 10 5 0 Jan 93 Jan 94 Jan 95 Jan 96 Jan 97 Jan 98 Jul 93 Jul 94 Jul 95 Jul 96 Jul 97 Jul 98 66 .und Datenleitungen miteinander verbunden (Abb.LE 2 1 Einführung 1. s Rund 45.nw. 1.com/ zone/WWW/ report.html Das Internet durchläuft eine dynamische Entwicklung: s Über 20 Millionen Computersysteme sind über Telefon. Unternehmen und Behörden kommunizieren über das Internet. s 1992 gab es noch unter 100 Domains in Deutschland. s Etwa 100 Millionen Menschen haben Zugang zum Internet. s Das Angebot im WWW verdoppelt sich im Schnitt alle 53 Tage. Ende 1996 waren es bereits 38. s Nach Prognosen sind im Jahr 2000 über 100 Millionen Computersysteme im Internet.000 auf rund vier Millionen. davon über 10 Millionen in Deutschland.

der das Qualifikationsprofil von Alex darstellt. 1. Zum Vergleich: 1997 setzte der Einzelhandel rund 700 Milliarden Mark um. /Lütge 98/. /Kohlen 97/.8 Millionen Einwohner (älter als 16 Jahre) Zugang zum Internet.1. /Spiegel 97/. s verwendete Quellen: /digital 96/. um diese Zahl zu erreichen.5 Millionen benutzen das WWW und n 1. /Hoffman.000 Computersysteme (Netzwerk-Gateways) im deutschen Teil des Internet angemeldet. Das Internet ist auf dem Wege. n 11.9-1 zeigt den Teil der Web-Präsentation. Abb. Kalsbek. /WAZ 96/ 1. s Im Jahr 2000 sollen in Deutschland Waren für 30 bis 50 Milliarden Mark über das Internet verkauft werden. das Fernsehen brauchte 13 Jahre. Als innovative Firma entscheiden sie sich dazu. um genügend Aufträge zu erhalten.9 Fallstudie: Die Firma ProfiSoft im Internet Die Firmengründer Alex und Rob erkennen schnell. um etwas einzukaufen.9 Fallstudie: Die Firma ProfiSoft im Internet LE 2 Ende 1996 waren 650. n 16. s In den USA haben 28. daß sie ihren Bekanntheitsgrad erhöhen müssen. Das Internet schaffte es in nur vier Jahren. 1. s Das Radio existierte 38 Jahre bevor es 50 Millionen Zuhörer hatte.9-1: Web-Präsentation von Alex 67 . sich zu einem gesellschaftlich akzeptierten Medium zu entwickeln.4 Millionen benutzen das Internet.51 Millionen haben das WWW benutzt. auf die Dienstleistungen von ProfiSoft im Internet aufmerksam zu machen. Abb. Novak 96/ /IEEE Spectrum 98/.

chats erlauben →Internet-Benutzern über Internet Relay Chat (IRC) interaktive. besteht aus vier Bytes. Typischer Aufbau: computer. ein Mausklick auf einen Hyperlink bewirkt. plug-ins Software. z. jpeg im →WWW weitverbreitetes Bildformat. durch Punkte getrennt. Überschriften. Latin genormter 8-Bit-Zeichensatz (256 Positionen). Internet Weltweites. zwischen vernetzten Computersystemen.LE 2 Glossar ASCII (American Standard Code of Information Interchange) genormter 7-BitZeichensatz (128 Positionen) zur Darstellung von Ziffern. funktionsbezogene Computernamen im →Internet. Verweise (→Hyperlinks) auf andere Texte enthält. in dem eine Vielzahl von Diensten angeboten und genutzt werden. von Briefen und Nachrichten. Händlern. analysiert. So ausgezeichnete Dokumente werden von →WWW-Browsern interpretiert und dargestellt. wird vom →URL addressiert. Browser →WWW-Browser. DNS (domain name system) →domainName. nonverbale Gespräche in Echtzeit. indiziert und z. insbesondere auf →TCP/IP. nicht öffentliches Netz. Lieferanten. z. Suchmaschine Leistungsfähiges Computersystem. das sich auch für Animationen eignet (→gif. das automatisch nach bestimmten Kriterien Informationen im Internet sucht. 134. Leitseite →Startseite. das im Gegensatz zu →gif beliebig viele Farben darstellen kann. auf das verwiesen wird.html bzw. Hyperlinks Verweise auf andere Dokumente. Absätze. Startseite (home page) Einstiegsseite eines WWW-Dokuments mit →Hyperlinks zu anderen Dokumenten. der den →ASCII-Code um 128 Positionen erweitert. d. wie zwischen Computersystem im →Internet 68 . in →WWW-Browsern meist farb- lich oder unterstrichen hervorgehoben. Hypertext Text. Extranet Erweiterung eines →Intranets hin zu anderen Unternehmen.147. ftp (file transfer protocol) erlaubt im →Internet die Übertragung kompletter Dateien und Softwarepakete (ist das Pendant zur Paketpost) mit »Selbstabholung«.land. institution. e-mail Asynchrone Übertragung elektronischer Post. Oft von Drittanbietern erstellt. die folgendermaßen aufgebaut ist: empfänger@smtp. Provider Stellen Zugänge zum →Internet zur Verfügung. gif im →WWW häufig benutztes Grafikformat mit maximal 256 Farben (→jpeg). dezentralisiertes. IP-Adresse Eindeutig zugewiesene Adresse eines Computersystems im →Internet. in Form von Katalogen speichert und diese für Suchanfragen auswertet. daß zu dem Dokument.B. htm. der Sprungmarken bzw. Latin-1 deckt westeuropäische Sprachen ab (→Unicode). das auf der Technik des →Internet basiert. Intranet Firmeninternes. Der Empfänger benötigt dazu eine e-mail-Adresse. die einen beschränkten Zugriff auf die Informationen des Intranets erhalten. domain-Name Hierarchisch gegliederte. allgemein zugängliches Computernetz. server.1. Sonderzeichen und Steuerzeichen (siehe auch →Latin und →Unicode). →jpeg).80. TCP/IP (transmission control protocol/ internet protocol) Verfahren.B. Buchstaben. inhaltliche Kategorien von WWW-Dokumenten.bereich. newsgroup »schwarze Bretter« für asynchronen Nachrichtenaustausch im →Internet. Ein Nameserver setzt domain-Namen in →IP-Adressen um. Im →Internet wird dazu das SMTP-Übertragungsprotokoll verwendet. die es mit Hilfe von Formatbefehlen (tags) erlaubt. HTML (hypertext markup language) Seitenauszeichnungssprache. png im →WWW benutztes Bildformat. Dateiendung . die →WWW-Browser um Zusatzfunktionen erweitern. verzweigt wird. Als Übertragungsprotokoll wird →TCP/IP verwendet. search engine →Suchmaschine. sowie →Hyperlinks zu kennzeichnen. gateway Computersystem. das Computernetze mit unterschiedlichen Übertragungsprotokollen miteinander verbindet und eine Protokollumsetzung vornimmt.h.B.

Er ist in der Lage. numeriert. Das Zielcomputersystem setzt die Pakete entsprechend ihrer Numerierung wieder zusammen. wird WWW ein WWW-Browser. s e-mail: asynchrone.und Empfängeradresse versehen und einzeln verschickt. mit Absender. d. Im Internet werden verschiedene Dienste angeboten. unter anderem: s WWW (World Wide Web). Leitseite oder home page.Internet-Dienste textbasiertes Informationssystem. s Newsgroup: asynchrone Computer-Konferenzen und »schwarze Bretter«. Anders als bei einem Telefongespräch wird keine feste Verbindung hergestellt. Aufbau: protokoll://domain-Name/Dokumentpfad. in Anspruch nehmen können. Über Browser können nicht nur die WWW-Dienste im Internet.469 Positionen). wird das URL-Adreßschema verwendet: 69 . WWW-Browser Software. um mit Hilfe von Hyperlinks auf andere Dokumente zu verweisen. LE 2 W3 Kurzform für →WWW. jpeg und png. Telnet erlaubt den direkten Zugriff auf andere Computersysteme im →Internet. Ein HTML-Dokument verwendet die Hypertext-Technik. Durch Angabe der →URL wird das Computersystem.Glossar/Zusammenhänge Daten übertragen werden. Statt dessen werden die Daten in Pakete von bis zu 1500 Zeichen zerlegt. ermöglicht außerdem den Zugriff auf die anderen Internetdienste. Damit ein bestimmter Dienst auf dem jeweils gewünschten Computersystem angesprochen werden kann. HTML-Dokumente zu interpretieren und anzuzeigen. Unicode (UCS) genormter 16-Bit-Zeichensatz (65. An den Knotenpunkten des Netzes lesen Wegplanungscomputer (router) die Adressen und leiten das Paket in Richtung Empfänger weiter. URL (uniform resource locator) im →WWW verwendete standardisierte Darstellung von Internetadressen. Um die WWW-Dienstleistungen in Anspruch nehmen zu können. Um die Übertragungszeiten im Netz zu reduzieren. nonverbales »Plaudern« in Echtzeit. über die Benutzer die Dienstleistungen des Internet. Web Kurzform für →World Wide Web. der die Schriftzeichen aller Verkehrssprachen der Welt aufnehmen soll (→ASCII und →Latin). das auf der →Hypertext-Technik basiert. insbesondere des →WWW. Die Einstiegsseite eines HTML-Dokuments heißt Startseite. werden Browser über plug-ins erweitert. Lokale Computernetze werden durch das Internet weltweit verknüpft (Netz der Netze). Verwendet werden heute gif. das die jeweilige Dienstleistung anbietet.und Bildformate verwendet. kurz Browser genannt. Browser stellen eine einheitliche Benutzungsoberfläche für alle Dienste zur Verfügung.h. s chats: interaktives. s Telnet: Fernbedienen eines entfernten Computersystems. die sich damit aus der Ferne bedienen lassen. Damit Browser zusätzliche Formate anzeigen können. benötigt. werden in WWW-Dokumenten besondere Grafik. sondern auch alle anderen in Anspruch genommen werden. World Wide Web →WWW. auch W3 oder Web genannt: ein hyper. elektronische Post für Briefe und Nachrichten. s ftp: Transportdienst für Dateien (elektronische »Paketpost«). WWW (World Wide Web) Informationssystem im →Internet. eindeutig adressiert.

im WWW kann bereits der Latin-Code benutzt werden. in: Die ZEIT.. p.server. Jan. Novak T. Die rasante Entwicklung des Internet in den letzten Jahren wird es in Zukunft zu einem Massenmedium wie heute Fernsehen und Telefon werden lassen. 27 /IEEE Spectrum 98/ The Internet. 1997. 7. in: Digital Magazin. Jan. 1996. Netze.7. S. L.LE 2 Adreßaufbau Zusammenhänge/Literatur Protokoll des gewünschten Dienstes://domain-Name/Dokumentpfad Der domain-Name ist nach dem domain name system (DNS) strukturiert: computer.. 15–16 /Meissner 96/ Meissner R.3. S. 1997. 30. Klick & Kauf.bereich. Für den e-mail-Dienst wird zusätzlich der Empfängername benötigt. Suchmaschinen (search engines) können bei der Suche helfen. D.1997 /Lütge 98/ Lütge G. asynchron über das Netz – unter Umständen auf verschiedenen Wegen – transportiert werden. 206–210 Zitierte Literatur 70 . 36–46 /IEEE Spectrum 97/ Communications. bei dem Daten. 12–14 /Kühnert 97/ Kühnert H. Mischobst – Grafikformate für WWW-Dokumente. die ein anderes Übertragungsprotokoll verwenden.1998. München. Kalsbeek. Internet and Web Use in the U.. Der Adreßaufbau sieht daher folgendermaßen aus: empfänger@smtp. Jan. die aus vier Bytes besteht. Intranets und Extranets benutzen dieselbe Technik wie das Internet. in: IEEE Spektrum. S.land Über einen Nameserver wird jedem domain-Namen eine IP-Adresse zugeordnet. können verschiedene Suchstrategien angewandt werden. in: c’t.S. sind aber nicht öffentlich zugänglich. Heft 7. Um Informationen im Internet zu finden.. in: IEEE Spectrum.. P.. /digital 96/ Der Mausklick in die Zukunft. S. in Pakete aufgeteilt. Codes Suchen & Finden Technik Anschluß Bedeutung Viele Dienste im Internet verwenden zur Informationsdarstellung noch den ASCII-Code. p. werden über gateways an das Internet angeschlossen.. Gut Ding will Weile haben – Internet strategisch nutzen. 6–17 /Hoffman.. pp.37 /Kohlen 97/ Kohlen M.institution. in: CACM. Die durchgedrehte Ligatur. Kalsbeek W. Dec. Der Anschluß an das Internet erfolgt über einen Provider. in: Die ZEIT. in: it Management. Die Technik des Internet beruht auf dem TCP/IP-Übertragungsverfahren. 1996. 1998. Der Unicode wird bisher nur im Betriebssystem Windows NT und in der Programmiersprache Java benutzt. Novak 96/ Hoffmann D.

Erstellen Sie eine Startseite (home page) mit Angaben zu Ihrer Person. Essen. Überprüfen Sie Ihr Ergebnis.. 3/1997 /WAZ 96/ Internet in Deutschland wächst explosionsartig.9. Betrachten Sie die in Abb. Spiegel special. 1. das genau diese Darstellung erzeugt. Konstruktive Aufgaben Muß-Aufgabe 20 Minuten Abb. Machen Sie anschließend Ihre Startseite im WWW bekannt. 263–271 /Spiegel 97/ Der digitale Mensch.9-2: Zu erstellende HTML-Seite 3 Lernziel: Mit Hilfe der angegebenen Befehle multimediale HTML-Dokumente erstellen und auf Web-Servern bereitstellen können. ein HTML-Dokument zu erstellen.. 1995.Literatur/Aufgaben /Schneider 95/ Schneider G. Orientieren Sie sich an der Fallstudie von Kapitel 1. Versuchen Sie. Verwenden Sie die Informationen aus Aufgabe 2 der Lehreinheit 1.9-2 wiedergegebene HTML-Seite. Deutsch und anders. Eine Einführung in das Internet. 7. E.96 /Zimmer 97/ Zimmer D. 1. <HTML> <HEAD> <TITLE> <A1>Top-Seite der Ruhr-Universität Bochum<H1> </ENDTITLE> <BODY> <bold>Diese Zeile soll fett sein</bold> Diese Zeile ist nicht mehr fett Diese Zeile soll kursiv sein ! </ENDBODY> </END> Analytische Aufgaben Klausur-Aufgabe 5 Minuten 2 Lernziel: Mit Hilfe der angegebenen Befehle multimediale HTML-Dokumente erstellen und auf Web-Servern bereitstellen können. einem Bild und einer gesprochenen Information. so daß er syntaktisch korrekt ist. 71 Muß-Aufgabe 60 Minuten . in: Informatik-Spektrum. 18. korrigieren Sie den nachfolgenden HTML-Code. indem Sie Ihr Dokument in einen WebBrowser laden. Ergänzen bzw. S. Westdeutsche Allgemeine Zeitung. Hamburg: Rowohlt-Verlag 1997 LE 2 1 Lernziel: Multimediale HTML-Dokumente bezogen auf die Syntax analysieren können.5.

das ShockWave plug-in unter http://www.de.macromedia. Sie können z. Normaler Text (ein Text Ihrer Wahl).ruhr-uni-bochum. c Recherchieren Sie nach Informationen über die Gestaltung und Erstellung von HTML-Seiten und fügen Sie die gefundenen Verweise in Ihre home page ein. a Versuchen Sie mit Hilfe eines Web-Suchdienstes und eines PersonenSuchdienstes herauszufinden.LE 2 Muß-Aufgabe 45 Minuten Aufgaben 4 Lernziel: Anhand der beschriebenen Suchstrategien systematisch im Internet unter Einsatz von Suchmaschinen Informationen recherchieren können.B. b Recherchieren Sie nach deutsch. d Finden Sie alle Web-Seiten heraus. von denen auf Ihre home page verwiesen wird.com verwenden. Verweis auf die Seite http://www. Kann-Aufgabe 25 Minuten Klausur-Aufgabe 15 Minuten 72 . 6 Lernziel: Mit Hilfe der angegebenen Befehle multimediale HTML-Dokumente erstellen und auf Web-Servern bereitstellen können. Hinweis: Zum Installieren von plug-ins benötigen Sie die entsprechenden Rechte auf dem Computersystem. Diese können bei öffentlich zugänglichen Computersystemen unter Umständen gesperrt sein. Erweitern Sie Ihren Browser um ein plug-in Ihrer Wahl. die mindestens folgende Elemente beinhaltet: Titel: -Dies ist eine Klausuraufgabe. welche Informationen über Personen mit Ihrem Namen im Internet verfügbar sind. Bild : picture.gif. swt.und englischsprachigen Informationen zur Internet-Netiquette und fügen Sie die gefundenen Verweise in Ihre home page ein. Erstellen Sie eine HTML-Seite. 5 Lernziel: Einen WWW-Browser um plug-ins erweitern können. Überschrift : -HTML-Dokumente.

seit er 1984 zu Sun kam.4. Programmieren.4. Die Darstellungsformen Syntaxdiagramm. Feststellen können. s Die Kapitel 1. Interpreter und Programmierumgebungen 85 Das erste Java-Programm: »Hello World« 89 Die erste Java-Anwendung: »Hello World« 89 Notationen für die Syntax einer Programmiersprache 91 Aufbau eines Java-Programms 94 Das erste Java-applet: »Hello World« 95 73 James Gosling Vize-Präsident von Sun Microsystems. Programme entsprechend den Richtlinien durch Einrücken geeignet strukturieren können. Vorhandene Java-applets in Web-Dokumente mit den geeigneten HTML-Befehlen einfügen können. Übersetzer und Compiler zusammenhängen. wie Programme traditioneller Programmiersprachen im Vergleich zu Java übersetzt und ausgeführt werden.4 2. Gosling hat sich mit verteilten Computersystemen befaßt.2 2.4 Grundlagen der Programmierung 74 Programm. beschrieben als Syntaxdiagramm. Programmiersprache.1 2. wie Sprache. Eine Programmierumgebung für Java bedienen können.4. in welchen grundlegenden Aspekten sich problemorientierte Programmiersprachen unterscheiden. Programmiersprachen 74 Java-applets und ihre Einbindung in HTML 81 Compiler.3 2.1 2. übersetzt und ausgeführt werden. Vor seiner Zeit bei Sun konstruierte er eine Mehrprozessorversion für UNIX. Inc.7 »Die Sprache HTML« müssen bekannt sein. verstößt. EBNF.2 2. verstehen anwenden Das Kapitel 1. EBNF. .. wie Java-Anwendungen und Java-applets erfaßt. Darstellen können. Ferner entwickelte er den EmacsTexteditor für UNIX. problemorientierte Programmiersprache.1 »Aufbau und Funktionsweise eines Computersystems« muß bekannt sein. Anhand einer gegebenen Syntax ein syntaktisch richtiges Programm oder Programmstück schreiben können. Erläutern können. Chef-Ingenieur und maßgebender Architekt der JavaTechnik.oder Java-Notation. das Andrew WindowSystem sowie einige Compiler und mail-Systeme. Java-applets im Internet finden und in das eigene Computersystem laden können.LE 3 2 Grundlagen der Programmierung – Einführung s s s s s s s s s s s s Erklären können. s 2 2. übersetzen und ausführen können.3 2. Java-Programme erfassen. Beschreiben können.und Java-Notation anhand von Beispielen ineinander überführen können.6 »World Wide Web (WWW)« und 1. ob ein Programm oder ein Programmausschnitt gegen die vorgegebene Syntax.4.

über die Erwachsene verfügen. An dieser Stelle sind einige Überlegungen zu dem Begriff Sprache angebracht. so ist eine Verständigung nicht oder nur schwer möglich. Sprachumfang verfügt. sich verständlich zu machen. die der Mensch durch Betrachtung der gesamten Lösungsbeschreibung (Kontext) und durch seine Erfahrung vielleicht richtig interpretieren kann. wozu ein Automat jedoch nicht in der Lage ist. um in einer Fachspra- Programm Sprache 74 . die von einem automatischen Prozessor abgearbeitet werden. Menschen kommunizieren untereinander. Ein Programm stellt die Realisierung eines Algorithmus dar. wenn nicht ein Übersetzer zu Hilfe gerufen wird. wenn zwar dieselbe Sprache gesprochen wird. s Für Daten wird eine bestimmte Darstellung (Repräsentation) gewählt. Ein Kind besitzt noch nicht den Wortschatz. Ein Kind ist also mit dem erlernten Repertoire der Sprache in der Lage. Es ist daher eine besondere Umsetzung notwendig. bezeichnet man als Programme. so ist es oft erforderlich. Programmiersprachen Algorithmen.LE 3 2 Grundlagen der Programmierung 2 Grundlagen der Programmierung 2. Eine umgangssprachliche Problemlösung kann von einem automatischen Prozessor nicht abgearbeitet werden. ein Gesprächspartner jedoch nur über einen eingeschränkten Sprachvorrat bzw. Für den Eingeweihten sind die Begriffe verständlich und eindeutig. indem sie eine Sprache benutzen. Im Gegensatz zu einem Algorithmus ist ein Programm konkreter und eingeschränkter. allerdings auf umständliche und schwerfällige Weise. um den Sprachschatz des Kindes in die Umgangssprache zu übersetzen. Deutsch und Englisch). die der andere ebenfalls versteht. die Eltern in Anspruch zu nehmen.B. s Es wird ein bestimmter Formalismus (Programmiersprache) gewählt. in dem man mittels genau definierter Grundelemente den Algorithmus vollständig beschreibt.1 Programm. den Sprachreichtum und die Ausdrucksvielfalt. Dieser Fall liegt beispielsweise zwischen einem Erwachsenen und einem Kleinkind vor. Ein anderes Beispiel ist der Fachdialekt innerhalb von bestimmten Fachgebieten. für den Außenstehenden wirken diese Ausdrücke wie »Fachchinesisch«. Will sich ein Fremder mit einem Kleinkind verständigen. Eine gegenseitige Verständigung kann jedoch auch erschwert werden. Sprechen zwei Gesprächspartner nur unterschiedliche Sprachen (z. da unsere Umgangssprache zu viele Ungenauigkeiten und Mehrdeutigkeiten zuläßt. Programmieren. wobei die verwendeten Satzkonstruktionen oft der Situation nicht ganz angemessen sind.

daß dies eine umständliche und zeitraubende Arbeit ist. Assemblersprachen . Ein solcher Prozessor ist dadurch gekennzeichnet. der es ermöglicht. Hinzu kommt noch. diese Umsetzung vom Konstrukteur des Prozessors vornehmen zu lassen. der nur die Sprachelemente enthält. Jetzt stellt sich natürlich die Frage. Additionen und Vergleiche durchzuführen. daß jeder automatische Prozessor je nach Prozessortyp und Herstellerfirma unterschiedliche Fähigkeiten besitzt. da er die Fähigkeiten des Prozessors am besten kennt. Der Prozessor kann demgegenüber nur sehr wenig direkt verstehen. Der Übersetzungsprozeß geht nämlich nach festen Regeln – die allerdings sehr kompliziert sind – vor sich. automatischen Prozessor. nachdem er sich in Handbüchern darüber informiert hat. ohne Rücksicht auf einen bestimmten automatischen Prozessor. um Programme auf einem Prozessor ausführen zu lassen. 75 Maschinensprachen. wie eine Problemlösung auszuführen ist. den Algorithmus in eine Form zu bringen. Dies ist eine Folge der heutigen technischen Möglichkeiten zur Realisierung solcher Prozessoren. Probleme elegant und einfach zu formulieren. so daß diese Aufgabe algorithmisch formuliert werden kann. Der Mensch will dem Prozessor mitteilen. Einen solchen Algorithmus bezeichnet man als Übersetzer. die der Prozessor »versteht«. Programmieren. Es dürfte einzusehen sein. sondern um einen Automaten bzw. Es stehen sich also zwei Pole gegenüber: der Mensch und der Prozessor.1 Programm. beispielsweise ist er nur in der Lage. Programmiersprachen LE 3 che mit einem besonderen Sprachvorrat formulierte Zusammenhänge in die Umgangssprache umzusetzen. welche Eigenschaften der zur Verfügung stehende automatische Prozessor hat. Dann ist man gezwungen. Früher war dies die einzige Möglichkeit. Entweder man wählt zur Beschreibung des Algorithmus einen Formalismus.2. einen Beschreibungsformalismus zu wählen. daß er nur über einen sehr begrenzten. Die auf die Prozessoren zugeschnittenen Programmiersprachen bezeichnete man als Maschinensprachen und Assemblersprachen. primitiven Sprachvorrat verfügt (ähnlich einem Kleinkind). Die Situation ist aber auch auf andere Art aufzulösen. Es wäre möglich. In einer ähnlichen Situation wie in den beiden letzten Beispielen befindet sich auch die Informatik. Die zweite Möglichkeit besteht darin. Der Mensch verfügt über einen umfangreichen Sprachvorrat. Bei dem Gesprächspartner handelt es sich jedoch nicht um einen Menschen. um sich dem Prozessor verständlich zu machen. wer die Übersetzung von der allgemeinen Beschreibungsform in den Formalismus des jeweiligen Prozessors vornimmt. um Problemlösungen in verbaler oder formaler Art zu beschreiben. Oder jeder Benutzer nimmt die Übersetzung selbst vor. die dem jeweiligen Prozessor angepaßt ist. Es gibt nun im wesentlichen zwei Möglichkeiten.

h. zu transformieren. Man spricht von einer problemorientierten Programmiersprache (auch benutzernahe oder höhere Programmiersprache). die Quell-Programme. auf den primitiven Sprachvorrat eines Prozessors zugeschnitten sind. 2. bei der versucht wird. durch systematischen Einsatz einer gegebenen Programmiersprache ein gestelltes Problem zu lösen. Ein Programm ist ein Algorithmus formuliert in einer Programmiersprache. d. Da die verschiedenen Prozessoren unterschiedlich sind. Um Problemlösungen in einem Formalismus niederschreiben zu können legt man Programmiersprachen fest (Abb. Meist bieten mehrere Firmen Übersetzer für bestimmte Programmiersprachen und bestimmte Prozessoren an.LE 3 Übersetzer 2 Grundlagen der Programmierung Programm Programmieren Abb. die Ziel-Programme. für jeden Prozessortyp einen eigenen Übersetzer zu haben. Der Begriff Übersetzer ist dabei die übergeordnete Bezeichnung für diese Aufgabe. In Abhängigkeit von den Eigenschaften der Quellsprache und den Eigenschaften der Zielsprache werden spezialisierte Begriffe verwendet. wenn die Sprachelemente problemnah und nicht maschinennah. Mensch Umgangssprache komplex mehrdeutig menschliche Tätigkeit Algorithmische Sprache semiformal noch nicht vollständig detailliert Algorithmus Problem Umgangssprache komplex mehrdeutig ? Eltern als Übersetzer menschliche Tätigkeit Programmiersprache exakter Formalismus meist genormt unabhängig von einem bestimmten Prozessor ? Aufgabe des Übersetzers Maschinensprache primitiv abhängig vom jeweiligenProzessor Maschinenprogramm (Objekt-Programm) Programm (Quell-Programm) Kleinkind Kindersprache primitiv abhängig vom jeweiligen Kleinkind Automatischer Prozessor 76 . in gleichbedeutende Sätze einer Zielsprache. Programmieren ist eine Tätigkeit.1-1). ist es erforderlich. 2.1-1: Kommunikation Mensch – Maschine über eine Programmiersprache Fremder Aufgabe eines Übersetzers ist es also. alle Sätze einer Quellsprache.

die eine problemnahe Formulierung eines entworfenen Algorithmus gestatten. ein weites Anwendungsspektrum abzudecken (»general purpose«-Sprachen). Diese Sprachen unterscheiden sich in mehreren Punkten: s Viele Sprachen unterstützen die Programmierung besonderer Anwendungsgebiete (z. die für alle Anwendungsgebiete optimale Sprachkonstruktionen zur Verfügung stellt. Es stellt sich natürlich die Frage. Entsprechend sind auch die in der Sprache vorhandenen Sprachelemente unterschiedlich. im wesentlichen eine Weiterentwicklung der prozeduralen Programmiersprachen. Generation genannt. n Objektorientierte Programmiersprachen.B. n Funktionale und applikative Programmiersprachen. Genügt nicht eine einzige problemorientierte Programmiersprache? Im Prinzip ja. die auf ganz spezielle Anwendungsgebiete zugeschnitten sind (z. linguistische Probleme. handelt es sich bei dieser Sprachklasse um Programmiersprachen. s Die zur Beschreibung von Algorithmen verwendete Notation ist von Sprache zu Sprache unterschiedlich. Steuerung von Werkzeugmaschinen. logik-orientierte Programmiersprachen. s Es gibt Programmiersprachen. auch imperative Sprachen genannt. dann bezeichnet man den Übersetzer als Compiler. aber die ideale Sprache. Bei der Zielsprache kann es sich dabei um eine Maschinensprache oder eine spezielle »Zwischensprache« handeln. gibt es nicht und wird es vielleicht nie geben. die versuchen. warum es verschiedene Sprachen gibt. algebraische Formelsprachen). und es existieren Sprachen. um so aufwendiger wird der Übersetzer. n Deklarative Programmiersprachen.B. Programmieren. Auf ihre Festlegung haben sowohl die Technik.1 Programm. sammeln Ist das Quell-Programm in einer problemorientierten Programmiersprache geschrieben. der historischen Entwicklung. die Computersysteme als auch die historische Entwicklung der einzelnen Sprachen einen starken Einfluß 77 Sprachunterschiede Anwendungsgebiete speziell vs. s Die von den Programmiersprachen unterstützten Konzepte sind unterschiedlich. Programmiersprachen LE 3 Compiler to compile = zusammenstellen. auch Sprachen der 4. allgemein (»general purpose«) Konzepte Notationen . Steuerung zeitabhängiger Vorgänge wie Ampelsteuerung).2. Wie der Name »problemorientiert« schon andeutet. Je mehr Möglichkeiten eine Sprache dem Benutzer bietet. mathematisch-technische Probleme. dem Problemlösungsstil und der zugrundeliegenden Programmierphilosophie. Entsprechend diesen unterschiedlichen Zielsetzungen sind die Programmiersprachen unterschiedlich umfangreich. kaufmännische Probleme. Man unterscheidet: n Prozedurale Programmiersprachen. Es existieren heute über 200 problemorientierte Sprachen für die verschiedensten Anwendungsgebiete. Die unterschiedlichen Konzepte ergeben sich aus dem Anwendungsgebiet. Im folgenden wird nur auf problemorientierte Sprachen eingegangen. n Prädikative.

Manche Sprachen wurden beim Sprachentwurf bereits genau definiert. die vom Sprachentwurf her abgerundet und in sich geschlossen sind.1-2 zeigt die historischen Zusammenhänge zwischen den Programmiersprachen. Alles was sich überhaupt programmieren läßt. Es soll aber ganz deutlich gesagt werden. Dementsprechend werden die Sprachen dann auch mehr oder weniger einheitlich benutzt. die vom jeweiligen Prozessor.B. Die hier aufgeführten Sprachen sind mehr oder weniger streng genormt.h. Außerdem erlaubt es eine gute Programmiersprache. Maschinennahe Programmiersprachen werden daher heute im wesentlichen nur noch für absolute Spezialaufgaben eingesetzt. Die Umsetzung der Lösungsbeschreibung in eine bestimmte Programmiersprache ist dann eine nachrangige Angelegenheit. beim Finden einer geeigneten Lösungsidee. 78 . die mathematische Formelnotation weitgehend zu übernehmen. erschien es sinnvoll. es existieren aber auch Sprachen. d. weniger gut geeignet. Damit sind einige Unterschiede von Programmiersprachen angesprochen. Entsprechend sind Programmiersprachen didaktisch gut bzw. vom Betriebssystem und vom Compiler abhängen. kann im Prinzip auch in jeder beliebigen Programmiersprache ausgedrückt werden. daß sie dem menschlichen Problemlösungsprozeß und dem menschlichen Denken durch geeignete Sprachelemente entgegenkommt. für das die Programme geschrieben werden. s Es gibt Programmiersprachen. um wenig Speicherplatz zu belegen und eine sehr schnelle Abarbeitung zu erreichen. erlauben maschinennahe Sprachen keine problemorientierte Formulierung von Programmen. 2. so daß der menschliche Programmierer bei der Umsetzung der Lösungsidee in die Programmiersprache weitgehend entlastet wird. z. Dennoch gibt es auch bei genormten Sprachen immer noch Besonderheiten. Da diese Prozessoren nur über einen primitiven Sprachvorrat verfügen. daß der Schwerpunkt der Programmierung auf dem Entwurf von Algorithmen liegt. unübersichtlich sind und nach dem heutigen Wissensstand als veraltet gelten.1-1 gibt einen Überblick über die wichtigsten Programmiersprachen in der Reihenfolge ihres Entstehens. 2. bei anderen sorgen internationale Organisationen für Normungsrichtlinien. Abb. Im Gegensatz zu problemorientierten Sprachen orientieren sich maschinennahe Sprachen an den Möglichkeiten der verwendeten Prozessoren. Tab.LE 3 2 Grundlagen der Programmierung maschinennahe Sprachen ausgeübt. Eine gute Programmiersprache zeichnet sich jedoch dadurch aus. Einige Notationen haben sich im Laufe der Zeit als sinnvoll erwiesen und werden in vielen Sprachen weitgehend gleich verwendet. Da die ersten problemorientierten Sprachen zur Programmierung mathematischer Probleme entworfen wurden. mit geeigneten Sprachkonstrukten zu beschreiben. die aus zusammengewürfelten Elementen bestehen. das Anwendungsgebiet.

1-1: Überblick über die zeitliche Entwicklung wichtiger problemorientierter Programmiersprachen . Es entstanden sogenannte hybride Sprachen wie C++. eine der am weitesten verbreiteten Sprachen. Inzwischen breiter genen Umgebungen Anwendungsbereich. 1997 erweitert zu OOCobol mit objektorientierten Konzepten. Obermenge von C. Einsatz bei Expertensystemen. Modula-3 objektorientiert. Viele prozedurale Sprachen wurden im Laufe der Zeit um objektorientierte Konzepte erweitert. Anwendungen in Berücksichtigt C++. dann wurden in der Vergangenheit am häufigsten prozedurale Sprachen eingesetzt. Weiterentwicklung: Java 2 (1998) prozedural 1965-1967 prozedural Pascal (nach dem 1971 franz. SQL2 1992.1 Programm.2. Weiterentwicklung von Modula-2. SQL3 in Arbeit. erweitert im ANSIStandard 1998. Weiterentwicklung: Visual Basic mathematisch-technische und kaufmännische Probleme mathematisch-wissenschaftlich-technische Probleme und Simulationen mathematisch-technische und kaufmännische Probleme systemnahe Programmierung mathematisch-technische und kaufmännische Probleme Anwendungen mit symbolischen Formeln Echtzeitanwendungen Datenbankanwendungen Anwendungs. Weiterentwicklung von Pascal. ADA 95. Weiterentwicklung von Pascal. erste objektorientierte Sprache.Dialogorientiert. besonders in den Datenstrukturen. Weiterentwicklung: Fortran 77. Modula-3. Erweiterung von Algol 60. Konstruktion zuverlässiger.und Smalltalk-80vernetzten und hetero. erweiterbarer und wiederverwendbarer Software. Programmiersprachen LE 3 Name der Sprache Entstanden Sprachkategorie Fortran (Formula Translation) Algol 60 (Algorithmic Language) 1954-1957 1958-1960 prozedural prozedural Anwendungsgebiet mathematischtechnische Probleme mathematischwissenschaftliche Probleme kaufmännische Probleme. sehr verbreitet. Weiterentwicklung von Algol 60. Cobol 1959-1960 (Common Business Oriented Language) Lisp (List Processing) 1959-1962 prozedural (objektorientiert) funktional Basic (Beginner´s 1963-1965 All Purpose Symbolic Instruction Code) PL/1 (Programming Language 1) Simula 67 1964-1967 prozedural kleinere mathematisch. Beginnend mit der Programmiersprache Smalltalk-80 begannen sich nach und nach objektorientierte Konzepte durchzusetzen. 2. Sprachumfang nicht technische Probleme einheitlich festgelegt. Unterscheidet sich wesentlich von Fortran. Weiterentwicklung: Algol 68 Keine klare Definition. OO-Cobol. enthält Zusicherungen. Berücksichtigung von didaktischen Gesichtspunkten Als Nebenprodukt zum Betriebsystem Unix entstanden. Algol oder Cobol. Mathematiker Blaise Pascal) C Modula-2 1974 1976 prozedural prozedural prozedural (objektorientiert) prädikativ prozedural (objektorientiert) deklarativ objektorientiert prozedural und objektorientiert objektorientiert Prolog Ada SQL Smalltalk-80 C++ Eiffel 1977 1979 1970-1980 1970-1980 1980-1983 1986-1988 Oberon Beta Java 1988 1993 1990-1997 objektorientiert objektorientiert objektorientiert Betrachtet man die Verbreitung der Programmiersprachen im Markt. Weiterentwicklung von Simula 67.Konzepte. unsystematischer Aufbau. mangelnde Systematik und Überblickbarkeit. für technischnaturwissenschaftliche Probleme ungeeignet Symbol-Manipulation Bemerkungen Erste problemorientierte Sprache. Modulkonzept. enthielt wichtige Konzepte für die objektorientierte Programmierung. 79 Tab. Objektorientierte Programmierung.und Systemsoftware umfangreiche Softwaresysteme Sehr umfangreich. 1983 genormt. Ada-95 um Objektorientierung erweitert. Knappe einheitliche und geschlossene Definition der Sprache. Fortran 90 Anlehnung an mathematische Formeltradition. Programmieren.und Systemsoftware Anwendungs.

daß sich der Java-Anteil am gesamten Programmiervolumen 1998 auf 12 Prozent beläuft. Java. spielen keine Rolle – abgesehen vielleicht vom Einsatz an Hochschulen. gerechnet. einschließlich der hybriden Sprachen. wie Eiffel. daß die objektorientierten Sprachen. 2. Eine Umfrage bei 100 deutschen Systemhäusern /Stein 98/ hat ergeben. Die dynamische Entwicklung objektorientierter Konzepte wird in naher Zukunft dazu führen. Alle anderen objektorientierten Programmiersprachen wie Eiffel. Für 1999 wird mit einem Anstieg auf das Zweieinhalbfache.LE 3 Abb. eigenständige objektorientierte Sprachen entwickelt. Java gewinnt jedoch kontinuierlich an Bedeutung.h auf 30 Prozent. d. Java hat inzwischen bereits Smalltalk-80 überholt und wird es nach und nach ablösen.1 Java 2 ANSI C++ Bedeutung C++ Java Außerdem wurden neue. Beta.1-2: Genealogie der wichtigsten Programmiersprachen 2 Grundlagen der Programmierung 2000 1999 1998 1997 1996 1995 1994 1992 1990 1988 1986 Miranda 1984 1982 1980 1978 1976 1974 1972 1970 1968 1966 1964 1962 APL 1960 1958 1956 1954 1952 1951 1950 Assembler-Sprachen Lisp Fortran Basic Algol60 Cobol Logo Prolog BCPL Algol68 Simula67 PL/1 Pascal Apl2 Smalltalk-80 ML FP Fortran77 C Ada Modula-2 Eiffel C++ Fortran90 Oberon-2 Oberon Java 1. Oberon und Beta. 80 . Die am meisten verwendete objektorientierte Programmiersprache ist heute eindeutig C++. die prozeduralen Sprachen ablösen. Oberon.0 Ada95 Java 1.

2. Die Sprache war inzwischen verbessert und weitere Sicherheitskomponenten hinzugefügt worden. robuste und sichere objektorientierte Progammiersprache. Dies hatte vor allem markenzeichenrechtliche Gründe. Bei der Firma Sun untersuchte ein Entwicklungsteam mit den Innovatoren Patrick Naughton. Diese historische Entwicklung macht einige Besonderheiten von Java – verglichen mit anderen Programmiersprachen – verständlich.zur Historie legt. Zu diesem Zeitpunkt erlebte das Internet eine rasante Entwicklung.Duke nannt – ein. die später zum »Maskottchen« für Java wurde. Unabhängig von der Programmiersprache stehen aber immer die Konzepte der Programmierung im Mittelpunkt aller Betrachtungen. plattformunabhängige. sowohl in Videorecorder. Im Januar 1995 wurde Oak in Java umbenannt. daß zunehmend Mikroprozessoren in alle elektronischen Konsumgeräte integriert wurden. als auch in Telefone und Waschmaschinen.2 Java-applets und ihre Einbindung in HTML Das Fundament für die Programmiersprache Java wurde 1990 ge. plattformunabhängigen Programmiersprache für das Internet. ein einfaches. Es wurde eine unabhängige Firma »First Person« gegründet. herstellerunabhängiges Betriebssystem zu entwickeln. Ziel des Teams war es daher.2 Java-applets und ihre Einbindung in HTML LE 3 Wegen des hohen Innovationsgrads. In Java kann man zwei Arten von Programmen schreiben: s Anwendungen (applications). »First Person« wurde 1994 aufgelöst. so daß alle Verhandlungen scheiterten. Im Ausblick wird wegen der Marktbedeutung noch auf die Sprache C++ eingegangen. Für die Präsentation setzten sie eine Zeichentrickfigur – Duke ge.2. Auf den Namen Java kam das Team in der Cafeteria – in den USA wird für Kaffee der Name Java verwendet. die selbständig auf einem Compu. um mit Herstellern von Konsumelektronik-Geräten zu verhandeln. Sun erkannte das Potential der sicheren. James Gosling und Mike Sheridan den Konsumentenmarkt. James Gosling erfand unter dem Namen Oak eine dafür geeignete. Es erkannte. Im August 1992 stellte das Team den Projektstatus dem Vorsitzenden von Sun vor. Die Ideen wurden von Sun großartig aufgenommen.Anwendungen tersystem laufen – dies ist die übliche Form bei anderen Programmiersprachen – und 81 . Sun stellte die Sprache für das Internet bereit. der zunehmenden Bedeutung und wegen des breiten Anwendungsspektrums behandele ich in diesem Buch ausführlich die Programmiersprache Java. Der Markt war für diese Ideen aber noch nicht reif.

2-1 gibt URLs an.2-1: Beispiele für Java-applets Gamelan http://www.com 82 . Abb.com Der Java Applet Rating Service (JARS) sucht die besten applets im Web und bewertet sie. lohnt es sich jedoch.meta.cgl.LE 3 applets 2 Grundlagen der Programmierung s Applets. Der Grund für diese Einschränkungen liegt in dem Sicherheitskonzept der Java-applets. Simkin 96/. auf das sie vom Netz geladen wurden. in der Regel nicht zugreifen. welche Mächtigkeit Java besitzt und welche Möglichkeiten sich damit für das Internet eröffnen: Aus einem weitgehend statischen Medium wird ein dynamisches.netscape.jp/openlab/horb Weitere Quellen: http://java. Sie zeigen. Starbuck 96/ Abb. die über das Internet von einem Web-Server geladen und in einem Web-Browser ausgeführt werden – dies unterscheidet Java von anderen Programmiersprachen.html Geschäftsleben http://www.bulletproof.com Spaß und Spiele http://www. daß ein über das Netz geladenes applet keinen Schaden auf dem Client-Computersystem anrichten kann.uwaterloo.com Aktuelle Informationen über Java-Entwicklungen einschließlich applets.go. Sie können auch keine Daten auf der Festplatte des lokalen Computersystems speichern. Shaio.stones.sgi. Es ist durch dieses Konzept sichergestellt. Bevor auf weitere Unterschiede eingegangen wird.com Innovative applets http://ring. Die besten Java-applets (Die Top 1-Prozent) http://www. Kunst http://reality. interaktives Medium. /van Hoff.gamelan.etl. Leslie.sun.com/applets http://www. Applets können – im Unterschied zu Anwendungen – auf lokale Daten des Computersystems.jars. einige applets im Internet anzuschauen. Quellen: /Bartlett.com/WallStreetWeb Ausbildung http://www.com/employees/paul_asd/impression/imppaint. Sowohl Java-Anwendungen als auch Java-applets sind übersetzte und lauffähige Java-Programme. die interessante applets enthalten. 2. 2.ca Startseiten http://www.zoop.

Trifft ein Java-kompatibler WWW-Browser auf einen solchen Befehl. 2. Den HTML-Code kann man sich von jedem Browser anzeigen lassen. das applet zu beschreiben.<applet> zugefügt. Durch einen applet-Befehl werden applets zu einer Web-Seite hin. dann wird dieser Text vom applet angezeigt. 83 . <title>Beispiel zu ImageLoopItem</title> <applet code="ImageLoopItem. z.2. Jeder Parameter hat einen Namen (name) und einen Wert (value). Hinter dem Befehl <applet code> und vor dem applet-Endbefehl </applet> kann der Parameter-Befehl stehen. Im obigen Beispiel heißt der Parameter text und der Wert "die Firma ProfiSoft": Ändert man den Wert in der HTML-Beschreibung.B.2-4 zeigt die Ausführung dieses applets.2-3. in "Alex und Rob". dann lädt er das applet und führt es aus. Jedes applet kann seinen eigenen Satz von Parametern besitzen. 2. 2. Die Erklärung des Befehls <applet code> enthält Abb. Der Parameter-Befehl versorgt das angegebene applet mit Informationen – im Gegensatz zum appletBefehl.2 Java-applets und ihre Einbindung in HTML LE 3 Applets kann man im Internet nicht nur betrachten. seine Parameter anzugeben sowie die Breite und Höhe seiner Benutzungsoberfläche festzulegen. Dieser Befehl dient dazu. Der Autor des applets sollte die Bedeutung der Parameter in seiner Dokumentation beschreiben.2-2: Ausführung eines Java-applets auf einer HTML-Seite <param> Beispiel Abb.class" width=80 height=100> <param name=nimgs value=10> <param name=img value=duke> <param name=pause value=1000> </applet> Abb. <title>Startseite der Firma ProfiSoft</title> <h1> Wir begrüßen Sie: </h1> <applet code="NervousText.2-2 zeigt die Ausführung des applets NervousText in einem Browser.class" width=300 height=50> <param name=text value="die Firma ProfiSoft"> </applet> Beispiel Abb. sondern man kann sie in das eigene Computersystem laden und in eigene WebSeiten integrieren. 2. der vom Browser ausgewertet wird.

der die HTMLDatei enthält. der das applet enthält. Erlaubt sind folgende Angaben: left. bevor die Animation erneut von vorne beginnt. in dem sich diese Dateien befinden. 2.class. bottom. right. Legt die Position des applets auf der HTMLSeite fest. Wird codebase angegeben (siehe unten). Dieser hier angegebene Name kann von anderen applets auf derselben HTML-Seite benutzt werden. middle. duke steht für den Ordner.. texttop. wo sich die Grafikdateien. Der Parameter img (image) gibt an. URL des applets. Somit ist er relativ zum Ordner. . Code muß angegeben werden. die zum Darstellen der Einzelbilder benötigt werden. wieviele Millisekunden die Animation nach dem Abspielen auf dem ersten Bild anhalten soll. die das applet enthält. dann ist der Dateiname relativ zu codebase.gif im gif-Format gespeichert sein. Horizontaler Freiraum um das applet. Breite der applet-Fläche in Pixeln. top. Diese Option erlaubt es.gif. width = Anzahl Pixel height = Anzahl Pixel codebase = URL alt = Text name = Symbolischer Name align = Ausrichtung vspace = Anzahl Pixel hspace = Anzahl Pixel > <param .. In der Regel ist dies der Name des applets mit dem Dateisuffix .. Höhe der applet-Fläche in Pixeln.2-3: Der <applet>-Befehl und seine Parameter <applet code = "Dateinamen" Erklärung Gibt den Dateinamen an. Kann ein Web-Browser Java-applets nicht ausführen. Tn. dann wird alternativ der hier aufgeführte Text angezeigt. Parameterangaben sind abhängig vom jeweiligen applet. Die einzelnen Bilder müssen unter den Namen T1. Der dritte Parameter pause gibt an.. wenn die appletAdresse dieselbe ist wie die HTML-Seite. Muß-Angabe. absmiddle. wenn align = left oder right. wenn align = left oder right.LE 3 2 Grundlagen der Programmierung Abb. Muß-Angabe. 84 . ein applet von irgendwo im Internet auf der eigenen Seite anzuzeigen. . Nur gültig. befinden. absbottom. baseline. Nur gültig. > </applet> In diesem Beispiel gibt der Parameter nimgs (number of images) die Anzahl der Bilder in der Animation an. Vertikaler Freiraum um das applet. Kann fehlen.

das von einem Prozessor des entsprechenden Prozessortyps direkt ausgeführt wird. Abb. Java Java-Compiler 85 . Will man ein Programm auf verschiedenen Prozessortypen – man spricht allgemein von Plattformen – laufen lassen. Allerdings gibt es verschiedene Compilerhersteller. Ein Java-Compiler übersetzt ein Quell-Programm in einen sogenannten Byte-Code. Java hatte von seiner Herkunft her von vornherein das Ziel plattformunabhängig zu sein. traditionelle Programmiersprachen Hinweis: Eine Plattform ist in der Regel eine Kombination aus Betriebssystem und Prozessortyp. Ein solcher Compiler übersetzt das jeweilige Quell-Programm in ein sogenanntes Objekt-Programm. 2. Genau genommen unterscheiden sich die Compiler nicht nur bezüglich des Prozessortyps. Interpreter und Programmierumgebungen Bevor das erste Java-Programm vorgestellt wird.2. daß der erzeugte Byte-Code von keinem Prozessor direkt ausgeführt werden kann. Nur wenige Compilerhersteller bieten Compiler für verschiedene Prozessortypen an.3 Compiler.3 Compiler. Interpreter und Programmierumgebungen LE 3 Abb. sind zunächst einige Betrachtungen zum Übersetzungsvorgang nötig. Der Nachteil davon ist. Traditionelle Programmiersprachen benötigen für jeden Prozessortyp einen Compiler. sondern bezüglich der jeweiligen Plattform. dann benötigt man pro Plattform einen Compiler für die entsprechende Programmiersprache – unter Umständen von verschiedenen Compilerherstellern. 2-2-4: Ausführung des Java-applets »ImageLoopItem« in einem Browser 2.3-1 vergleicht den Übersetzungsvorgang bei einer traditionellen Programmiersprache mit dem für Java. die solche Java-Compiler anbieten. Daher ist nur ein Java-Compiler für alle Plattformen nötig. Für jede Plattform muß das Programm neu übersetzt werden. der unabhängig von einem bestimmten Prozessortyp ist. Er nutzt also nicht die spezifischen Eigenschaften der jeweiligen Prozessortypen aus und ist daher allgemeiner. Je nach Programmiersprache gibt es für jeden Prozessortyp unter Umständen verschiedene Compilerhersteller.

für die es einen Java-Interpreter gibt. geschrieben in traditionellen Programmiersprachen Quell-Programm in Sprache A Compiler für Sprache A und Prozessortyp X Compiler für Sprache A und Prozessortyp Y Compiler für Sprache A und Prozessortyp Z Objekt-Programm (Binär-Code) für Prozessortyp X Objekt-Programm (Binär-Code) für Prozessortyp Y Objekt-Programm (Binär-Code) für Prozessortyp Z Vorteile Optimale Ausnutzung der jeweiligen Prozessoreigenschaften. Programmiersprachen sind oft nicht plattformunabhängig definiert. die beim Laden des Byte-Codes über das Netz den Byte-Code in die Maschinensprache des entsprechenden Prozessortyps übersetzen. Oft gibt es für verschiedene Prozessortypen nur Compiler unterschiedlicher Hersteller. 86 . Der erste Nachteil wird durch just-in-time-Compiler vermieden. 2. allen Prozessortypen. dadurch hohe Abarbeitungsgeschwindigkeit der übersetzten Programme. Für jeden Prozessortyp wird ein Java-Interpreter benötigt. Nachteile Das übersetzte Programm läuft nur auf dem jeweiligen Prozessortyp (nicht plattformunabhängig). Nachteile Die übersetzten Programme laufen langsamer.LE 3 2 Grundlagen der Programmierung Abb. Die Ladezeit wird dadurch länger. so daß pro Prozessortyp die Programme voneinander abweichen. Übersetzte Java-Programme laufen ohne Neuübersetzung auf allen Plattformen. Java ist unabhängig von allen Plattformen exakt definiert. die Ausführungszeit jedoch kürzer.h. geschrieben in Java Quell-Programm in Java Compiler für Java Objekt-Programm (Byte-Code) (plattformunabhängig) Java-Interpreter für Prozessortyp X Java-Interpreter für Prozessortyp Y Java-Interpreter für Prozessortyp Z Java-just-in-timeCompiler für Prozessortyp V Vorteile Für alle Prozessortypen wird nur ein Java-Compiler benötigt. da sie interpretiert werden. die sich teilweise unterschiedlich verhalten. d. Übersetzung von Programmen. Für jeden Prozessortyp muß das Programm mit einem anderen Compiler neu übersetzt werden.3-1: Übersetzung von Programmen Übersetzung von Programmen.

Der Java-Interpreter ist ein Software-System. ohne daß noch einmal eine Analyse vorgenommen wird. Unter einem Interpreter versteht man ganz allgemein ein Programm. Will man ein Programm erstellen. die den Byte-Code in ein Objekt-Programm für einen speziellen Prozessortyp übersetzen. 2.2. liegt bei der Ausführung eines übersetzten Java-Programms zwischen dem Prozessor und dem Byte-Code noch der Java-Interpreter. Sie ersparen sich damit den JavaInterpreter. wenn die Syntax fehlerfrei ist. abgekürzt VM. Einige Web-Browser enthalten sogenannte just-in-time-Java-Compiler. Da man sich diese Abstraktionsschicht als einen gedachten Prozessor vorstellen kann. Bei einem Java-Programm muß die Datei den Dateisuffix . der den Byte-Code ausführt (Abb. spricht man von einer virtuellen Maschine (virtual machine). das jeweils eine Anweisung eines Programms analysiert und sofort ausführt. Dadurch wird aber die Abarbeitung der Programme verlangsamt. Das eingetippte Quell-Programm wird als Datei abgespeichert.java er87 Java-Interpreter VM just-in-timecompiler Erstellen eines Programms Texteditor . dann muß man das Programm in einen Texteditor oder ein Textverarbeitungssystem eintippen.3-2: Ausführung von preter benötigt. Der jeweilige Java-Interpreter selbst wird vom Prozessor ausgeführt. 2. Im Gegensatz dazu analysiert ein Compiler ein Programm vollständig und übersetzt es.3-2). Der Java-Interpreter verdeckt also die Eigenschaften des jeweiligen Prozessortyps und bietet eine höhere »Abstraktionsschicht«. das den erzeugten Byte-Code schrittweise analysiert und dann direkt ausführt.3 Compiler. Anschließend wird die nächste Anweisung analysiert und ebenfalls ausgeführt usw.Abb. 2.3-2 zeigt. Interpreter und Programmierumgebungen LE 3 Es wird daher für jeden Prozessortyp ein spezieller Java-Inter. Anschließend wird beliebig oft das übersetzte Programm ausgeführt. Programmen Traditionelle Programmiersprache Compiler für Prozessortyp X Compiler für Prozessortyp Y Java Java-Compiler Objekt-Programm für Prozessortyp X Objekt-Programm für Prozessortyp Y Byte-Code Byte-Code Java-Interpreter für Prozessortyp X Java-Interpreter für Prozessortyp Y Prozessortyp X Legende: A A Prozessortyp Y Prozessortyp X Prozessortyp Y B: A erzeugt B B: A wird ausgeführt von B Wie Abb.

d.java Java-Byte-Code Dateiname. muß identisch sein mit dem Namen der Quell-Datei.h.3-3). Java-fähiger Web-Browser oder applet viewer HTML-Dateiname. d.class Fehlermeldungen Warnungen Java-Byte-Code Dateiname.class Java-Interpreter java Dateiname Achtung: In Java wird die Groß-/Kleinschreibung beachtet. Java-Anwendung Textverarbeitungssystem oder Texteditor Java-applet Textverarbeitungssystem oder Texteditor Quell-Programm für eine Java-Anwendung Dateiname. die er übersetzen soll.java HTML-Seite mit <APPLET-CODE = "Dateiname. Legende: Angaben in blau gelten für die Verwendung des Java Development Kit (JDK) von Sun.LE 3 2 Grundlagen der Programmierung Compiler Fehler. 2.3-3: Übersetzen und Ausführen eines Java-Programms 88 .html Java-Compiler javac Dateiname. 2. der in Java-Programmen hinter class angegeben ist. die aber nicht zum Abbruch der Übersetzung führen. Der Programmname.class. Warnungen Interpreter Java-Anwendung oder Java-applet halten.h. Der Compiler erzeugt eine Objekt-Datei. Im Fall von Java ist nun noch zu unterscheiden. ob eine eigenständige Java-Anwendung oder ein Java-applet programmiert wurde (Abb. der virtuellen Maschine. damit der Compiler prüfen kann. ausgeführt werden. bei Java mit dem Dateisuffix . Anschließend wird der Compiler gestartet und bekommt die Datei angegeben. die den Programmierer auf bestimmte Dinge hinweisen. Dateiname und DateiName sind unterschiedliche Dateibezeichnungen. Oft zeigt ein Compiler auch Warnungen an. ob Fehler im Programm gefunden wurden.java Java-Compiler javac Dateiname.html Abb. Im Fehlerfall wird kein Objekt-Programm erzeugt. Außerdem gibt der Compiler an.java Quell-Programm für ein Java-applet Dateiname.class" WIDTH = Pixelanzahl HEIGHT = Pixelanzahl> </APPLET> HTML-Dateiname. dann kann es vom Prozessor oder im Falle von Java vom Java-Interpreter. Ist das Programm fehlerfrei übersetzt. ob die angegebene Datei ein geeignetes Quell-Programm enthält. vielmehr müssen zuerst die Fehler im Quell-Programm behoben werden.

benötigt mindestens einen Texteditor. das ein Programmierer schreibt. einen Java-Compiler und einen Java-Interpreter bzw. 2. zu übersetzen und auszuführen. dann wird man das lauffähige Programm auf seinem Computersystem ausprobieren. was die einzelnen Programmzeilen bewirken. dann werden sowohl die HTML-Seite als auch der Java-Byte-Code über das Netz transportiert und vom lokalen Web-Browser interpretiert. die den Text »Hello World!« als Zeichenfolge auf einem zeichenorientierten Bildschirm ausgibt. Viele Programmierumgebungen enthalten einen »applet viewer«.B. bevor erklärt wird.3-4 zeigt die Oberfläche einer solchen Programmierumgebung und beschreibt die wichtigsten Komponenten. mechanisch in den Editor einzutippen.2. die sich auf einem WWW-Server befindet.1 Die erste Java-Anwendung: »Hello World« Das folgende Beispiel zeigt eine einfache Java-Anwendung. die die Einzelkom. das fertige Programm. einen Web-Browser mit integriertem Java-Interpreter.umgebungen ponenten in integrierter Form enthalten und zusätzliche Funktionen zur Verfügung stellen. Abb. Ruft ein InternetBenutzer diese Seite auf. Solche Programmierumgebungen sind teilweise sogar für mehrere Programmiersprachen von einem Hersteller erhältlich.1 Die erste Java-Anwendung: »Hello World« LE 3 Hat man ein Java-applet programmiert und übersetzt. was es tun soll. so daß man nur eine Benutzungsoberfläche und ein einheitliches Umgebungskonzept für mehrere Programmiersprachen hat. Komfortabler als die Verwendung solcher Einzelkomponenten Programmiersind sogenannte Programmierumgebungen. applets auch unabhängig von einem WWW-Browser ablaufen zu lassen. 89 . das Programm »Hello World«. Dazu bietet jeder Web-Browser die Möglichkeit. wie es läuft.4 Das erste Java-Programm: »Hello World« Traditionell ist das erste Programm. 2. wenn er eine neue Sprache lernt. lokale HTMLSeiten anzuzeigen und eingebettete Java-applets auszuführen. 2. Um ein Java-Programm zu erstellen. Tradition ist es ebenfalls. in eine HTML-Seite integriert. Zunächst wird die Java-Anwendung für »Hello World«. anschließend das Java-applet für »Hello World« gezeigt und erläutert. Tut das applet das. applet viewer der es gestattet. wie es in einem Buch steht.4.4. dann wird es z. es zu übersetzen und dann zu sehen.

Projektfenster (hier: links oben): Wahlweise Objects. s Die einzelnen Java-Sprachelemente werden automatisch verschiedenfarbig dargestellt. Option: Save As . Menüoption: Format Options). Packages oder Files s Files: Zeigt die bereits erstellten Dateien an (Doppelklick öffnet die entsprechende Datei im Editorfenster).) kann eingestellt werden (Einstellbar: Menü: Source. 4 Programm übersetzen (Menü: Project. 5 Programm ausführen (Menü: Project. Option: New File): Eintippen des Programms im Editorfenster. Meldungsbereich (hier: unten): s Zeigt Fehler und Warnungen beim Übersetzen an. Eigenschaftsfenster (property list) (hier: links unten): s Zeigt die Eigenschaften der bei Objects gewählten Komponente an.LE 3 2. Ein Package faßt mehrere Klassen zu einer Einheit zusammen. Option Options aufrufen. s Die Formatierung des Textes (Einrückung nach rechts usw. Speichern). Alternativ kann es in einem Browser zum Ablauf gebracht werden. 2 Speichern des Projekts (Menü: File.4 Das erste Java-Programm: »Hello World« Abb. 3 Erfassen eines Programms (Menü: File. Bei einem applet vor der Ausführung Menü Project . Doppelklick auf eine Fehlermeldung zeigt im Editorbereich die fehlerhafte Zeile an! Anwendung der Programmierumgebung: 1 Im Menü File die Menüoption New Project wählen. s Packages: Zeigt die bereits erstellten Packages an (Doppelklick öffnet das entsprechende Package). s Objects: Zeigt die erstellten Klassen und ihren Aufbau (Doppelklick zeigt im Editorfenster den entsprechenden Programmteil an). Im Dialogfenster ProjectType auf Applet einstellen! 90 . s Die Eigenschaften können im rechten Bereich des Eigenschaftsfensters interaktiv geändert werden. dann wird das laufende applet in einen eigenen applet viewer angezeigt. anschließend speichern mit Save As. Im Dialogfenster Empty Project oder andere gewünschte Programmart wählen. Handelt es sich um ein applet. Option: Execute).3-4: Die Programmierumgebung Visual Cafe Editorfenster (source) (hier: rechts Mitte) s Im Editorfenster wird das Java-Programm eingetippt. 2. neuen Ordner in VisualCafe/Projects oder in VisualCafe anlegen. Option: Compile).

den Syntaxvorschriften der jeweiligen Programmiersprache entsprechen.h.4.2 Notationen für die Syntax einer Programmiersprache In der Informatik haben sich verschiedene Beschreibungsformalismen für die Syntax eingebürgert. eine Sprache zu definieren und ein Programm zu analysieren.4.java heissen! { public static void main (String args[]) //Dies ist eine Operation bzw.4-1 dargestellt. Dies wird später gezeigt. Sie sind in Abb.println("Hello World!"). Der Compiler zeigt den oder die Fehler im Quell-Programm an. //Dies ist eine Ausgabeanweisung } } LE 3 Beispiel 1 Nach dem Erfassen. Jedes Programm muß syntaktisch fehlerfrei sein. eine Java-Anwendung zu schreiben.2. d. 2. Meldet der Compiler einen Fehler. bis die Übersetzung fehlerfrei ist.out. Methode { System. Es ist auch möglich. die eine grafische Benutzungsoberfläche besitzt.2 Notationen für die Syntax einer Programmiersprache /* Dies ist ein Kommentar */ //Und dies ist ein Zeilenkommentar class Hello //Hello ist ein Klassenname //Der Dateiname muß Hello. 2. Übersetzen und Starten dieses Programms erscheint in einem zeichenorientierten Bildschirmfenster der Text »Hello World!«. Mit Hilfe solcher Syntaxbeschreibungen ist es einfacher. Die verschiedenen Syntaxnotationen Nicht-terminales Symbol: SyntaxA diagramm: Terminales Symbol: Syntaxclass diagramm: Definition einer Syntaxregel: ClassDeclaration Syntaxdiagramm: public class zeigen folgende Beispiele: EBNF: Java-Syntax: EBNF: Java-Syntax: <A> A class class Beispiele Identifier ClassBody EBNF: Java-Syntax: <ClassDeclaration> ::= public class <Identifier> <ClassBody> ClassDeclaration: public class Identifier ClassBody 91 . dann muß dieser beseitigt werden und solange eine erneute Übersetzung durchgeführt werden.

werden die dort verwendeten Bezeichnungen für nicht-terminale und terminale Symbole unverändert übernommen. Ein senkrechter Strich | trennt alternative Elemente.h. welche Sprachkonstruktion das Syntaxdiagramm beschreibt. Links oben wird in einem Rechteck der Name des Syntaxdiagramms angegeben. durch ::= von seiner Definition auf der rechten Seite getrennt. EBNF und JavaNotation Syntaxdiagramme Ein Syntaxdiagramm besteht aus zwei Teilen. 2. das in einem anderen Syntaxdiagramm definiert ist. d. 92 . ein nicht-terminales Symbol. verbunden durch gerichtete Pfeile. Ein Rechteck steht für ein Sprachkonstrukt. Das eigentliche Diagramm besteht aus Ovalen. indem man der Richtung der Pfeile folgt.LE 3 2. Beispiel: Syntax für eine Zeichenkette (String) StringLiteral " StringCharacters " Beispiele für Zeichenketten entsprechend dieser Syntax: " " //Leere //Zeichenkette "Zeichenkette" //Zeichenkette mit //12 Zeichen StringCharacters StringCharacter StringCharacter InputCharacter ohne " oder \ EscapeSequence EBNF (Extended Backus-Naur-Form) Die sogenannte Backus-Naur-Form (kurz BNF) wurde von den Wissenschaftlern Backus und Naur 1960 zur Beschreibung der Syntax der Programmiersprache Algol 60 entwickelt und später erweitert (extended). die exakt so in dem entsprechenden Programmteil stehen müssen. Noch nicht behandelte oder für den gegenwärtigen Gesichtspunkt irrelevante Teile des Syntaxdiagramms sind grau unterlegt. die nullmal oder mehrmals wiederholt werden können. Syntaxdiagramme werden von links nach rechts gelesen. Nicht-terminale Symbole werden in spitze Klammern < > eingeschlossen. Dieser Name gibt an.4 Das erste Java-Programm: »Hello World« Abb.4-1a: Syntaxdiagramme. Kreisen und Rechtecken. aber dafür auch schwerer zu lesen. Beispiel: <StringLiteral> ::= "[<StringCharacters>]" <StringCharacters> ::= <StringCharacter> {<StringCharacter>} <StringCharacter> ::= <InputCharacter ohne " oder \> | <EscapeSequence> Die EBNF ist kompakter als Syntaxdiagramme. Hinweis: Im Buch werden Syntaxdiagramme meistens vollständig aufgeführt. Man bezeichnet diese Zeichen als terminale Symbole. Man bezeichnet eine solche Sprachkonstruktion als nicht-terminales Symbol. Geschweifte Klammern { } schließen Elemente ein. Um ein Nachschlagen in der Java-Sprachspezifikation zu erleichtern. Ein Kreis oder ein Oval enthält Zeichen. Der EBNF-Formalismus ist folgendermaßen aufgebaut: Das zu definierende nicht-terminale Symbol steht auf der linken Seite. Eckige Klammern [ ] schließen optionale Elemente ein.

2. Hinweis: Um ein Nachschlagen in der Java-Sprachspezifikation zu erleichtern. Jede Alternative auf einer Zeile. A diagramm: Java-Syntax: A: . d. Ein nicht-terminales Symbol wird durch seinen Namen gefolgt von einem Doppelpunkt definiert. Steht hinter dem Doppelpunkt des nicht-terminalen Symbolnamens ein »one of«. Auf neuen. B B. Nicht-terminale Symbole werden kursiv dargestellt. das in dieser Syntaxdefinition definiert wird.4. B. d. Im obigen Beispiel trifft dies auf StringCharacters zu (blau dargestellt). innerhalb einer Alternative steht das nicht-terminale Symbol. 2. Daher müssen Wiederholungen durch eine sogenannte Rekursion beschrieben werden. Joy.4-1b: Syntaxdiagramme. EBNF und JavaNotation Darstellung einer Alternative: SyntaxA diagramm: B C EBNF: <A> ::= <B> | <C> Java-Syntax: A: B C Darstellung einer Option: SyntaxA diagramm: B EBNF: <A> ::= [B] Java-Syntax: A: Bopt Darstellung einer Wiederholung: SyntaxEBNF: <A> ::= <B> {. Abb.h. Der nach. die die EBNF etwas modifiziert: Terminale Symbole werden in Monospace-Schrift dargestellt. <B>}. daß ein Symbol optional ist.und tiefgestellte Index »opt« gibt an.2 Notationen für die Syntax einer Programmiersprache LE 3 Java-Notation In der Java-Sprachspezifikation /Gosling. A . Steele 96/ wird folgende Notation verwendet. jedes Zeichen hat dieselbe Breite: terminales Symbol. 93 .h. werden die dort verwendeten Bezeichnungen für nicht-terminale und terminale Symbole unverändert übernommen. nach rechts eingerückten Zeilen stehen ein oder mehrere Alternativen. Beispiel: StringLiteral: " StringCharactersopt " StringCharacters: StringCharacter StringCharacters StringCharacter StringCharacters: InputCharacter ohne " oder \ EscapeSequence Achtung: Die Java-Notation kennt keine Wiederholungssymbole wie die geschweiften Klammern in der EBNF. dann gilt nur jeweils eines der nachfolgend aufgeführten terminalen Symbole.

8. Kommentare in Programme einzufügen.1 genauer behandelt). die eine festgelegte Bedeutung in der Sprache besitzen und nicht für andere Zwecke benutzt werden dürfen. Ein Programm wird heute in der Regel nicht nur vom Autor des Programms gelesen.. Auf diese zentralen Bausteine eines JavaProgramms wird im nächsten Kapitel im Detail eingegangen.. Jede Programmiersprache erlaubt es. Wortsysmbole Kommentare Java-Kommentare In diesem Buch werden sowohl Syntaxdiagramme als auch die EBNFNotation und die Java-Notation je nach Bedarf verwendet. In Java werden drei verschiedene Arten von Kommentaren unterschieden: s Traditioneller Kommentar: /*Kommentar*/ Alle Zeichen zwischen /* und */ werden vom Compiler überlesen (dies ist auch die übliche Kommentarart in den Sprachen C und C++).LE 3 2. um für den Programmierer die Lesbarkeit seines Programms zu erhöhen. Eine Klasse wird in Java durch das Wort class gekennzeichnet. Es ist daher nötig. der Qualitätssicherung usw. z. sondern auch von anderen Personen.. s Dokumentationskommentar: /**Kommentar*/ Wie der traditionelle Kommentar. Dabei handelt es sich um terminale Symbole wie class.B. import.4. 2. Hinter dem Wort class folgt der Klassenname. Dem menschlichen Leser erleichtern passende Kommentare das Verständnis des Programms erheblich. Kollegen. public. Alles was anschließend folgt und zur Klasse gehört. s Einzeilenkommentar: //Kommentar Alle Zeichen nach // bis zum Zeilenende werden überlesen (übliche Kommentarart in der Sprache C++).3 Aufbau eines Java-Programms Klasse Jedes Java-Programm besteht aus mindestens einer oder mehreren sogenannten Klassen. Kommentare werden vom Compiler überlesen. durch die geeignete Verwendung von Kommentaren in einem Programm. der die Klasse kennzeichnet. 94 . In den Texteditoren der meisten Programmierumgebungen werden Schlüsselworte automatisch durch eine einstellbare Farbe hervorgehoben. Eine gute Dokumentierung erhält man u. wird in ge{. jedoch kann dieser Kommentar von dem Java-Programm Javadoc sowie einigen Programmierumgebungen ausgewertet werden. um eine automatische Dokumentation im HTML-Format zu erstellen (wird im Abschnitt 2. daß ein Programm gut dokumentiert ist.} schweifte Klammern {.. Jede Programmiersprache besitzt eine Reihe von Schlüsselworten oder Wortsymbolen.} eingeschlossen.a. void.4 Das erste Java-Programm: »Hello World« Schlüsselworte.

Immer wenn man etwas Zusammengehöriges zusammenfassen will. wird wiederum in geschweifte Klammern eingeschlossen. der im <applet code>-Befehl dafür angegeben wurde (siehe Abb. klammert man es in geschweifte Klammern. Innerhalb der Operation main steht in dem Programm Hello die Ausgabeanweisung System. Am Ende der Zeile wird auf eine neue Zeile positioniert (println = print line = drucke Zeile). Dem applet steht in der HTML-Seite der Grafikbereich zur Verfügung. steht sonst nichts mehr. s Alle Zeilen innerhalb eines Klammerpaars sind jeweils um vier Zeichen nach rechts eingerückt (läßt sich bei den Editoren einstellen). Alles was anschließend folgt und zur Operation gehört. Eine Klasse kann wiederum mehrere Operationen – in Java Methoden genannt – enthalten. Folgende Richtlinien sollten eingehalten werden.4 Das erste Java-applet: »Hello World« LE 3 Dies ist ein grundlegendes Prinzip in Java. Wird die Anweisung dupliziert und mehrfach hintereinander aufgeführt. s In der Zeile. daß Klammern immer paarweise auftreten. 95 . 2.4. dann erscheinen mehrere Zeilen Text auf dem Bildschirmfenster. Diese Anweisung gibt also einen Text zeichenweise in einer Zeile in einem Bildschirmfenster aus. Ein so gekennzeichneter Text ist in Java eine Zeichenkette (String). in einem Bildschirmfenster aus.4 Das erste Java-applet: »Hello World« Operationen bzw. 2. Ändert man den Text.4-1 angegeben. Methoden Richtlinien Semikolon main Soll ein Java-Programm in einem Web-Browser ausgeführt werden.4. der in " " eingeschlossen ist.2.out. Diese Anweisung gibt den Text. Java-applet dann muß es als applet programmiert werden. übersetzt das Programm neu und startet es. dann wird der geänderte Text angezeigt. eine schließend) stehen immer in derselben Spalte untereinander. Die Syntax dazu ist in Abb. um gut lesbare Programme zu erhalten: s Paarweise zusammengehörende geschweifte Klammern (eine öffnend. Anweisungen werden immer durch ein Semikolon abgeschlossen! Jede Java-Anwendung muß übrigens in genau einer Klasse eine Operation mit dem Namen main besitzen. Fehlt eine Klammer. 2. dann meldet der Compiler einen Fehler. Das bedeutet auch. in der eine geschweifte Klammer steht. Der Web-Browser startet das applet (wenn die gerade betrachtete HTML-Seite ein applet enthält) und beendet es (wenn die entsprechende HTML-Seite verlassen wird). da diese Operation beim Start der Anwendung zuerst ausgeführt wird.println("Hello World!").2-3). im Beispiel 1 heißt die Operation main.

h. Eine Werkzeugleiste (tool bar) oder ein Komponentenfenster enthält alle verfügbaren Komponenten. die auf dem Container angeordnet werden können. y.40 Dazu muß ein Textfeld (textfield) dem Container hinzugefügt. 20. b = false. positive y-Werte nach unten.4-2: Das ties genannt.4-2). Beispiele für Interaktionselemente sind einzeilige Textfelder (textfields). »hinzuaddiert« (add(textField1)) werden. wenn der angezeigte Text nicht vom Benutzer geändert werden kann (reine Ausgabe). wenn der angezeigte Text vom Benutzer geändert werden kann.LE 3 2. d. y – Die neue y-Koordinate des Feldes. width. während es sich bei einer Java-Anwendung entweder um eine grafische oder um eine zeichenorientierte Benutzungsoberfläche handelt. einem Behälter. Ein Container kann selbst andere Container enthalten. Alle Werte sind in Pixel anzugeben. d.4 Das erste Java-Programm: »Hello World« Die Interaktion mit dem Benutzer geschieht bei einem applet immer über eine grafische Benutzungsoberfläche. +Y Jedes Textfeld besitzt bestimmte Eigenschaften.0 +X ve x-Werte verlaufen nach rechts. Alle Pixel-Angaben sind ganze Zahlen. width – Die neue Breite des Feldes.h. 2. liegt über ihm ebenfalls ein Koordinatensystem. mehrzeilige Textbereiche (textareas) und Druckknöpfe (buttons). Die grafische Benutzungsoberfläche von Java besteht aus einem Aufbau der Benutzungs. Durch Selektie96 . die pro Textfeld gesetzt werden können. 2. Außerdem muß dieses Textfeld innerhalb des Containerbereichs positioniert werden. s Editierbarer Text: setEditable (b) mit folgendem Parameter: b = true. Diese Eigenschaften können durch Anweisungen im Programm gesetzt werden. Außerdem können die Schriftart (font) und die Schriftgröße der angezeigten Schrift festgelegt sowie die Hintergrundfarbe des Textfeldes eingestellt werden. Positi0. auf dem verschiedene oberfläche Interaktionselemente (controls) angeordnet werden können. in Java properAbb. s Anzuzeigender Text: setText(t) wobei t der anzuzeigende Text ist. height – Die neue Höhe des Feldes. einem sogenannten Grafikeditor. Grafikeditor Viele Programmierumgebungen erlauben es jedoch auch. die Interaktionselemente durch direkte Manipulation auf dem Container zu positionieren. Über einem Grafikbereich liegt in Java ein Koordinatensystem.10 bereich ist. Da ein Container ein Grafik10. Java-Koordinatensystem dessen Ursprung in der oberen linken Ecke liegt (Abb. Der Text »Hello World« soll in einem Textfeld angezeigt werden. mit einem spezialisierten Zeichenprogramm. Beispiele für Java-Koordinatensystem Eigenschaften von Textfeldern sind: s Feldgrenzen: setBounds (x.Container (container). height) mit folgenden Parametern: x – Die neue x-Koordinate des Feldes.

2. In einem Eigenschaftsfenster werden die Eigenschaften der selektierten Komponente angezeigt und können dort direkt geändert werden. 2.applet.4-4).4 Das erste Java-applet: »Hello World« LE 3 ren. das im Wechsel mit der Containersicht angesehen werden kann. Parallel zu diesen Aktivitäten erzeugt die Programmierumgebung das zugehörige Java-Programm. 2. Die Ausführung erfolgt in einem WWW-Browser oder einem applet viewer. Abb.Beispiel 2a gendermaßen aus: /* A basic extension of the java. Alle Änderungen können auch direkt im Java-Programm vorgenommen werden (Abb. Ziehen und Loslassen wird eine Komponente auf dem Container positioniert.4. den viele Programmierumgebungen enthalten (Abb. 2. Abb.4-3: Beispiel für die grafische Erstellung eines applets mit einer Programmierumgebung Nach der Fertigstellung des applets wird es ebenfalls übersetzt und ausgeführt.2.4-4: Das gestartete applet in einem applet viewer Das von einer Programmierumgebung erzeugte Programm sieht fol.4-3).Applet class */ 97 .

Sie entspricht der main-Operation bei einer Java-Anwendung. Font. public class HelloApp extends Applet { public void init() { … // This code is automatically generated by Visual Cafe when you // add components to the visual environment. Nach dem generierten Kommentar folgen zwei Zeilen. textField1. die mit dem Wort import beginnen. Startet der WebBrowser ein applet.TextField().applet. mit public gekennzeichnet werden. dann stellt man fest.TextField textField1. Nur mit public gekennzeichnete Klassen können vom Web-Browser in Anspruch genommen werden. 98 . daß der Web-Browser diese Klasse sehen darf. Das Wort public (öffentlich) gibt an.*.49).awt. textField1. Auch Java-Anwendungen können Programmteile importieren. Auch Klassen in Anwendungen können »öffentlich« gemacht werden.setText("Hello World!").setBackground(new Color(12632256)).setEditable(false). wird noch eine geeignete HTML-Seite benötigt.awt.awt. Anschließend folgt die Klasse class HelloApp.setForeground(new Color(255)).4 Das erste Java-Programm: »Hello World« import java. add(textField1). 20)). textField1.setBounds(48. setSize(426. Damit das applet ausgeführt werden kann. Die Klasse enthält die applet-spezifische Operation init.*. … //{{INIT_CONTROLS setLayout(null). textField1.24. //}} } import class init Vergleicht man das applet-Programm mit dem Anwendungsprogramm. Hier wird angegeben. //}} } //{{DECLARE_CONTROLS java. Java-Programmierumgebungen generieren in der Regel automatisch eine solche Seite. import java. setFont(new Font("Dialog". dann wird zunächst die init-Operation ausgeführt. textField1 = new java. d. welche bereits in Java vorhandenen Programmteile in diesem applet verwendet werden sollen.193.LE 3 2. In der init-Operation werden im allgemeinen Voreinstellungen vorgenommen und die Benutzungsoberfläche aus Interaktionselementen zusammengebaut.266). textField1.h.BOLD. daß fast alles anders ist.

das in einer Programmiersprache A (Quellsprache) abgefaßte Programme ohne Veränderung der Semantik in Anweisungen einer Sprache B (Zielsprache) transformiert. applikativ. →nichtterminales Symbol. üblich zur Beschreibung der Syntax von Programmiersprachen. die sich im wesentlichen in folgenden Punkten unterscheiden: s Anwendungsgebiet. wurden problemorientierte Programmiersprachen sprachen entwickelt. Verwaltungssystem. Programme müssen von einem →Compiler in die Maschinensprache des jeweiligen Prozessors umgesetzt werden. Syntaxdiagramm Grafische Darstellung der Backus-Naur-Form (→EBNF). Damit ein Programmierer Problemlösungen problemnah program. die als Programme realisiert und durch Computersysteme ausgeführt werden. logik-orientiert. s Grad der Allgemeinheit. das Quell-Programme. Problemorientierte Programmiersprache Programmiersprache. das als Platzhalter dient und durch Syntaxregeln letztendlich vollständig auf Sequenzen →terminaler Symbole zurückgeführt wird. Interpreter Analysiert Anweisung für Anweisung eines Programms und führt jede analysierte Anweisung sofort aus. imperativ (die meisten Sprachen). Es gibt über 200 solche Sprachen. Bibliotheksverwaltung und Fehlerverfolgungssystem. Sonderfall eines →Übersetzers. →Compiler. n prädikativ. Programmierumgebung Integration von Einzelkomponenten wie Texteditor.class" WIDTH=426 HEIGHT=266></APPLET> </BODY> </HTML> Compiler Ein kompliziertes Programm. Übersetzer Programm. bevor er die nächste analysiert (→VM). n funktional. um dem Programmierer eine effiziente und komfortable Programmerstellung in einer oder mehreren Programmiersprachen unter einer einheitlichen Benutzungsoberfläche zu ermöglichen. die den Java-Byte-Code zur Laufzeit analysieren und interpretieren. Terminales Symbol Nicht weiter zerlegbares Symbol einer Sprache. Virtuelle Maschine →VM. deren Sprachvorrat und Sprachkonstruktion problemnahe Formulierungen von Algorithmen ermöglicht. in Objekt-Programme (Sprachvorrat des automatischen Prozessors) umwandelt.Programmiermieren kann. geschrieben in einer →problemorientierten Programmiersprache. s Unterstützte Konzepte: n prozedural. damit eine automatische Abarbeitung möglich ist.→Interpreter. Programmieren Konzeption und Entwurf von Algorithmen. EBNF (Extended Backus-Naur-Form) Formalismus zur Beschreibung der Syntax von Programmiersprachen (→Syntaxdiagramm). Nicht-terminales Symbol Symbol. n objektorientiert (zunehmende Bedeutung).Glossar/Zusammenhänge LE 3 Beispiel 2b Generierte HTML-Seite für das applet HelloApp: <HTML> <HEAD> <TITLE>Autogenerated HTML</TITLE> </HEAD> <BODY> <APPLET CODE="HelloApp. VM Bezeichnung für Java. 99 .

geschrieben in problemorientierten Sprachen. müssen sie durch Einsatz von Kommentaren geeignet dokumentiert und durch die Verwendung von Einrückungen optisch strukturiert werden. Analytische Aufgaben Muß-Aufgabe 10 Minuten 1 Lernziel: Erläutern können. dann spricht man von einem Interpreter. in: Informatik-Spektrum (1993) 16.. Ein Vertreter wird eingeladen. Simkin S.16–17 Ziel ist es. Werden Programme nicht vollständig übersetzt und dann ausgeführt. Java Programming Explorer.. müssen durch einen Übersetzer in eine maschinennahe Sprache transformiert werden. 100 . werden Compiler genannt.. S. Eine Firma arbeitet auf zwei verschiedenen Plattformen. Sprachen für das Software-Engineering. Alle im Buch aufgeführten Beispielprogramme befinden sich auf der CDROM 1.. In Java erzeugt ein Compiler einen sogenannten Java-Byte-Code. In beiden Formalismen wird festgelegt. Notationen. Simkin 96/ Bartlett n.. Laden Sie diese Programme in Ihr Computersystem und verwenden Sie sie als Vorlage für Ihre Programme. um auf jeder Plattform je ein Java. sondern Anweisung für Anweisung analysiert und jede Anweisung ausgeführt. benötigt man geeignete Beschreibungsformalismen für die Syntax einer Programmiersprache.LE 3 Zusammenhänge/Literatur/Aufgaben Übersetzer Syntax Programmierumgebungen Lesbarkeit deklarativ. The Java Language Specification. Reading: Addison-Wesley 1996 /Ludewig 93/ Ludewig J.. s Konzeptionelle Geschlossenheit. Programme werden heute mit Programmierumgebungen erstellt. s Bedeutung. Leslie. Steale 96/ Gosling J.und ein C++-Programm zu demonstrieren. Steale G. in: Java Spektrum 4/98. Leslie A. s Verbreitung. Damit Programme gut lesbar sind. Joy. Scottsdale AZ: Coriolis Group 1996 /Gosling. die problemorientierte Programme in maschinennahe Programme umwandeln.. Übersetzer. S. wie Programme traditioneller Programmiersprachen im Vergleich zu Java übersetzt und ausgeführt werden. das »Lernen durch Beispiele« zu unterstützen. Da Programmiersprachen exakt formuliert sein müssen.. 286–294 /Stein 98/ Stein G. wie nicht-terminale Symbole auf Sequenzen aus terminalen Symbolen durch Syntaxregeln zurückgeführt werden. Joy B. Programme. s Grad der Normung. der von einer virtuellen Maschine (VM) interpretiert wird. Häufig verwendet werden die EBNF-Notation und Syntaxdiagramme. damit sie ein Prozessor ausführen kann. n s Zitierte Literatur /Bartlett. Java 2000: Studie zur Marktbedeutung von Java.

textField1. //}} } LE 3 Muß-Aufgabe 5 Minuten Klausur-Aufgabe 20 Minuten b Schreiben Sie das Programm noch einmal auf und strukturieren Sie es nach den vorgestellten Richtlinien. //}} }} //{{DECLARE_CONTROLS java.setBackground(new Color(12632256)). übersetzt und ausgeführt werden. so daß dieses Programm übersetzt und in einem Browser ausgeführt werden kann. textField1. EBNF und Java-Notation anhand von Beispielen ineinander überführen können.setForeground(new Color(255)). ob ein Programm oder ein Programmausschnitt gegen die vorgegebene Syntax. imports java. add(textField1). Programme entsprechend den Richtlinien durch Einrücken geeignet strukturieren können. wie Java-Anwendungen und Java-applets erfaßt. 3 Lernziele: Feststellen können. um ein selbst geschriebenes Java-applet mittels eines Browsers anschauen zu können.24. Eine Marketingfirma möchte für einen Kunden im Internet werben. beschrieben als Syntaxdiagramm. verstößt.TextField(). EBNF. VariableDeclarator Konstruktive Aufgaben Muß-Aufgabe 20 Minuten 101 .oder Java-Notation. Font.awt.setEditable(false).awt. Der Kunde interessiert sich dafür. setSize(426.49). Es liegen folgende Spezifikationen in Java-Notation vor: FieldDeclaration: FieldModifiersopt Type VariableDeclarators . 20)). a Markieren und verbessern Sie die Fehler in folgendem Java-Quellprogramm. textField1 = new java.setText("Hello World!") textField1.BOLD. 2 Lernziel: Beschreiben können.266). Class HelloApp extend Applet { public void main() { //{{INIT_CONTROLS setLayout(null). wie ein individuell für ihn geschriebenes Java-applet entsteht.193.Aufgaben Was muß der Vertreter für seine Vorführung tun und beachten? Gehen Sie hierbei auf die prinzipiellen Unterschiede der beiden Programmiersprachen ein. Erklären Sie dem Kunden die Vorgehensweise. textField1. setFont(new Font("Dialog". 4 Lernziel: Die Darstellungsformen Syntaxdiagramme.*. VariableDeclarators: VariableDeclarator VariableDeclarators . textField1.awt.TextField textField1.setBounds(48.

eine Eingabe ist hier nicht erlaubt. Muß-Aufgabe 40 Minuten Klausur-Aufgabe 30 Min 102 . Das zweite Textfeld soll eine Größe von 80 x 8 Pixeln besitzen. 6 Lernziele: Java-Programme erfassen. von textField1 in textField2) und Änderung der Koordinatenwerte oder durch grafische Erweiterung der Benutzungsoberfläche mit einer geeigneten Programmierumgebung. Das applet soll Baumstrukturen darstellen können und die Einträge als Verweis (Verknüpfung über Mausklick) navigierbar machen. eine Eingabe ist erlaubt. in die das unter a erstellte applet eingebunden ist. a Erstellen Sie ein applet mit zwei Textfeldern auf der Oberfläche. Programme entsprechend den Richtlinien durch Einrücken geeignet strukturieren können. Anhand einer gegebenen Syntax ein richtiges Programm oder Programmstück schreiben können. Achten Sie auf korrekte Syntax und Strukturierung. a Verwenden Sie den vorhandenen Quell-Code des Beispiels 2a HelloApp so. Anhand einer gegebenen Syntax ein richtiges Programm oder Programmstück schreiben können. Das erste Textfeld soll eine Größe von 100 x 10 Pixeln besitzen. Das zweite Textfeld soll den Text »nur lesbar« enthalten. b Strukturieren Sie durch Einrücken das Programm gemäß den angegebenen Richtlinien. Die Darstellung eines treeview entspricht der Darstellung des Explorers von Windows. Programme entsprechend den Richtlinien durch Einrücken geeignet strukturieren können. c Fügen Sie das applet anschließend Ihrer Startseite hinzu. a Suchen Sie im Internet ein »treeview«-applet.B.LE 3 Aufgaben VariableDeclarator: VariableDeclaratorId VariableDeclaratorId = VariableInitializer VariableDeclaratorId: Identifier VariableDeclaratorId [ ] VariableInitializer: Expression ArrayInitializer Geben Sie diese in EBNF-Notation und als Syntaxdiagramm an. Kommentieren Sie das applet ausreichend. Ändern Sie den Ausgabetext von "Hello World!" in einen eigenen Ausgabetext. Umbenennen der Bezeichner für die Textfelder (z. Java-applets im Internet finden und in das eigene Computersystem laden können. Muß-Aufgabe 45 Minuten 5 Lernziele: Vorhandene Java-applets in Web-Dokumente mit den geeigneten HTML-Befehlen einfügen können. Eine Programmierumgebung für Java bedienen können. b Verwenden Sie das gefundene applet in Ihrer home page zur Navigation. 7 Lernziele: Vorhandene Java-applets in Web-Dokumente mit den geeigneten HTML-Befehlen einfügen können. b Erstellen Sie eine möglichst kleine HTML-Seite. Fügen Sie ein oder mehrere weitere Textfelder mit einem anderen Ausgabetext hinzu. entweder durch Kopieren der Anweisungen. daß Sie daraus ein eigenes Programm entwickeln. übersetzen und ausführen können.

Sequenzdiagramm) auswählen und zeichnen können. Vorgegebene Java-Programme auf die Einhaltung der behandelten Syntax prüfen können. Zuerst die Theorie: Objekte und Klassen 104 Intuitive Einführung 104 Objekte 106 Klassen 113 Dann die Praxis: Objekte und Klassen in Java 117 Deklaration von Klassen 118 GUI-Klassen 123 Erzeugen und Referenzieren von Objekten 124 Senden von Botschaften und Ausführen von Operationen 131 Löschen von Objekten 136 Visualisierung von Objekten 136 103 2.5 2. Objekt.1 2.5.6.5 2.6. Die grundsätzliche Struktur eines Java-Programms erläutern können.LE 4 2 Grundlagen der Programmierung – Objekte und Klassen (Teil 1) s s s s s s s s s Die Begriffe Klasse.6. Anhand von Beispielen die dynamischen Abläufe bei der Erzeugung und Referenzierung von Objekten zeichnen – insbesondere durch Darstellung des Arbeitsspeichers und als UMLDiagramme – und erläutern können.6.5.1 2. Attribut.5. so daß lauffähige Java-Programme entstehen.6 .4 müssen bekannt sein. Das Entwurfsprinzip »Trennung GUI – Fachkonzept« erklären können.2 2.4 2.2 bis 2.3 2.3 2.6 2.6.2 2. Operation und Botschaft anhand von Beispielen erklären können. Anhand von Beispielen die dynamischen Abläufe beim Versenden von Botschaften an Objekte zeichnen – insbesondere durch Darstellung des Arbeitsspeichers und als UML-Diagramme – und erläutern können. Kollaborations-. Aus einem Pflichtenheft ein Klassendiagramm in UML-Notation erstellen und dieses Diagramm anschließend in ein Java-Programm transformieren und um Operationsanweisungen ergänzen können. Das behandelte Programm »Kundenverwaltung« auf analoge Aufgaben übertragen und modifizieren können. verstehen anwenden s Die Kapitel 2.6. Objekt-. Für gegebene Beispiele geeignete Diagramme in UML-Notation (Klassen-.

Schwimmbad vorhanden. Die Konzepte wurden in Smalltalk-80 – wie in Programmiersprachen üblich – textuell repräsentiert. Die Firma Nobel & Teuer hat gerade den Auftrag erhalten. sind durch ein UML-Piktogramm gekennzeichnet. Historisch betrachtet leiten sich die Grundkonzepte der objektorientierten Software-Entwicklung aus der Programmiersprache Smalltalk-80 her. Wohnfläche.1 Intuitive Einführung Die Begriffe der objektorientierten Software-Entwicklung werden am Beispiel der Immobilienfirma Nobel & Teuer eingeführt. Sie legt verschiedene Diagrammarten mit den entsprechenden Symbolen fest. Auf den beigefügten CD-ROMs befinden sich mehrere solcher Werkzeuge. Anstelle von Daten spricht man auch von Attributwerten (Abb. 2. Das Klassenkonzept wurde von der Programmiersprache SIMULA 67 übernommen und weiterentwickelt.5. 2.rational. Die grundlegenden Konzepte der Objektorientierung (kurz: OO) werden im folgenden dargestellt.5 Zuerst die Theorie: Objekte und Klassen In den folgenden Kapiteln wird eine Fallstudie »Kundenverwaltung« vorgestellt und erläutert. Heute gibt es für die Darstellung der Konzepte auch grafische Notationen. die beginnt. Parallel zu dieser Fallstudie wird auf der beigefügten CD-ROM 1 eine analoge Fallstudie »Seminarorganisation« entwickelt. Sie wurde in den Jahren 1970 bis 1980 am Palo Alto Research Center (PARC) der Firma Xerox entwickelt. Verkaufspreis. Im folgenden wird dafür die UML (Unified Modeling Language) verwendet /UML 97/. Die Firma Nobel & Teuer vermittelt exklusive Einfamilienhäuser.5-1). Adresse des Landhauses.com Der »UML Notation Guide« befindet sich auf der CD-ROM 2 Objekt Attributwerte 104 . ein Landhaus zu verkaufen. Jedes Einfamilienhaus ist ein Objekt. Über dieses »Landhaus«-Objekt werden von Nobel & Teuer folgende Daten gespeichert: Haustyp. die multimedial präsentiert wird. Name des Besitzers. Anzahl der Bäder. Smalltalk-80 ist die erste objektorientierte Programmiersprache. sich als Standardnotation durchzusetzen. Zusätzlich können interaktive Animationen durchgeführt werden. 2. Historie UML: http:// www. die exakt der UML-Notation entsprechen. Gartenfläche. Baujahr.5 Zuerst die Theorie: Objekte und Klassen Die objektorientierte Programmierung (OOP) stellt zum Teil neue Konzepte für die Entwicklung von Software-Systemen zur Verfügung. Alle Diagramme in diesem Buch.LE 4 Hinweis 2. Zum Erfassen und Bearbeiten dieser Diagramme gibt es Software-Werkzeuge.

[DM] anfragen Verkaufspreis :Einfamilienhaus Haustyp = ”Stadthaus” Besitzer = ”Urban” Adresse = ”Bochum” Wohnfläche = 200 [qm] Anzahl Bäder = 2 Hat Schwimmbad = ”nein” Garten = 400 [qm] Baujahr = 1990 Verkaufspreis = 1 Mio.5. die aber alle von der gleichen Art sind. 2.1 Intuitive Einführung LE 4 Abb. dann muß der Verkaufspreis verfügbar sein. 2. Anzahl Bäder = 3 Hat Schwimmbad = ”ja” der in Smalltalk und Java dafür verwenGarten = 5000 [qm] det wird.5-3: EinfamilienhausObjekte :Einfamilienhaus Haustyp = ”Landhaus” Besitzer = ”Dr.5-2).5-3). Baujahr = 1976 Außer dem Objekt »Landhaus« bietet Verkaufspreis = 2 Mio. Anzahl Bäder = 3 Dies bezeichnet man als GeheimnisHat Schwimmbad = ”ja” Garten = 5000 [qm] prinzip. [DM] die Firma Nobel & Teuer noch andere anfragen Verkaufspreis Einfamilienhäuser an (Abb.5-2: Operation eines Objekts Geheimnisprinzip Abb. 2. Wohnfläche = 400 [qm] Üblich ist auch der Begriff Methode. [DM] anfragen Verkaufspreis :Einfamilienhaus Haustyp = ”Bungalow” Besitzer = ”Herzog” Adresse = ”Stiepel” Wohnfläche = 250 [qm] Anzahl Bäder = 2 Hat Schwimmbad = ”nein” Garten = 1500 [qm] Baujahr = 1986 Verkaufspreis = 1. [DM] anfragen Verkaufspreis 105 . Es wird eine Funktion benötigt. d. Die Attributwerte bzw.5-1: Attributwerte eines Objekts Kommt ein potentieller Käufer zu Nobel & Teuer. In der objektorientierten Welt Haustyp = ”Landhaus” Besitzer = ”Dr. Ein Objekt enthält Attributwerte. auf :Einfamilienhaus die nur über die Operationen zugegrifHaustyp = ”Landhaus” fen werden kann. Kaiser” Adresse = ”Königstein” Daten des Objekts sind verkapselt. Besitzer = ”Dr. Kaiser” spricht man statt von einer Funktion Adresse = ”Königstein” von einer Operation (Abb. 2. [DM] fahr mit dem allgemein üblichen Begriff Methode. wird dieser Begriff für die Bezeichnung einer Operation nur im direkten Zusammenhang mit Java verwendet. Wegen der VerwechslungsgeBaujahr = 1976 Verkaufspreis = 2 Mio. die auf das Objekt »Landhaus« angewendet :Einfamilienhaus wird. Kaiser” Adresse = ”Königstein” Wohnfläche = 400 [qm] Anzahl Bäder = 3 Hat Schwimmbad = ”ja” Garten = 5000 [qm] Baujahr = 1976 Verkaufspreis = 2 Mio.5 Mio. Alle drei Objekte besitzen zwar unterschiedliche Attributwerte. Abb. der für ein systematisches Vorgehen steht.2. Wohnfläche = 400 [qm] von außen nicht sichtbar.h. 2.

Kunde. Objekt Eigenschaften. 2. die sich kennen. Außerdem besitzen alle Objekte die gleiche Operation »anfragen Verkaufspreis«.B. Die gewünschten Verkaufspreis Ausgabedaten werden an den Sender anfragen Verkaufspreis der Botschaft zurückgegeben. Eine Klasse definiert die Attribute Klasse und Operationen ihrer Objekte. insbesondere einer Beobachtung. Bestellung) oder der Vorstellungswelt (z.B. [DM] anfragen Verkaufspreis 2 Mio. 2. In der objektorientierten Software-Entwicklung ist ein Objekt ein individuelles Exemplar von Dingen (z.5-5: Botschaft :Einfamilienhaus Haustyp = ”Landhaus” Besitzer = ”Dr.5-5). die es von allen anderen Objekten unterscheidet. Hat Schwimmbad Garten Eine Botschaft aktiviert eine OperatiBotschaft Baujahr on gleichen Namens. Personen (z. Ein Objekt (object) ist allgemein ein Gegenstand des Interesses. bestehen Verbindungen (links).5-4).B. Verhalten.5 Zuerst die Theorie: Objekte und Klassen Man spricht hier von den Attributen »Haustyp«. Kaiser” Adresse = ”Königstein” Wohnfläche: 400 [qm] Anzahl Bäder: 3 Hat Schwimmbad = ”ja” Garten: 5000 [qm] Baujahr: 1976 Verkaufspreis: 2 Mio. Roboter. 2. »Besitzer« usw. Objekt-Identität 106 .LE 4 Attribut 2. juristische und natürliche Personen). steht der Objektbegriff im Mittelpunkt.5.B. Zwischen Objekten. Abb. Mitarbeiter) oder Begriffen der realen Welt (z. Auto). Außerdem besitzt jedes Objekt eine Objekt-Identität. Ein Objekt besitzt einen bestimmten Zustand und reagiert mit einem definierten Verhalten auf seine Umgebung. Ein Objekt kann ein oder mehrere andere Objekte kennen. Abb.5-4: Klasse Einfamilienhaus Einfamilienhaus Wie kann die Operation »anfragen Haustyp Verkaufspreis« für das Objekt »LandBesitzer haus« ausgeführt werden? Dazu wird Adresse Wohnfläche dem Objekt eine Botschaft geschickt Anzahl Bäder (Abb. Untersuchung oder Messung. Diese Objekte werden daher zur Klasse »Einfamilienhaus« zusammengefaßt (Abb.2 Objekte Wie die Bezeichnung »objektorientiert« bereits nahelegt. 2. anfragen Verkaufspreis 2.

d. die Winkel zu manipulieren.5-7: Objekt »Mitarbeiter Edelmann« UML-Notation . Die Zustände dieses Objekts werden durch zwei Attributwerte. Y [m] 4 Ellenbogen einstellen Grundposition Unterarm Oberarm 2 Hand melden Aktuelle Position Beispiel 1 Abb. Objekt »Oberarm des Roboters«.5-6: Objekt »Oberarm des Roboters« 3 aktueller Winkel 45 90 minimaler Winkel 0 maximaler Winkel 1 45º Schulter aktueller Winkel X [m] 1 2 3 4 5 einstellen Neue Position initialisieren Min & Max Winkel Objekt »Mitarbeiter Edelmann«. dann steht dieser vor dem Doppelpunkt. 2. Der obere Teil enthält den unterstrichenen Klassennamen (mit vorangestelltem Doppelpunkt).5. zu dem das Objekt gehört.5-8). Daten und die jeweiligen Verbindungen zu anderen Objekten bestimmt. Vier Operationen ermöglichen es.5-6 zeigt. 2.B. Eine Änderung oder Abfrage des Zustands eines Objekts ist nur über ändern Name seine Operationen möglich.5-9). 2. Man spricht daher von der Gehalt Verkapselung der Daten bzw. 2. Das Verhalten (behavior) eines Objekts wird durch eine Menge Operationen von Operationen beschrieben. von der 5000 Einhaltung des Geheimnisprinzips (Abb. Instanz. z.2. Wenn die Klasse aus dem Kontext er107 Beispiel 2 Abb. Die Begriffe Exemplar. instance und class instance wer. das Verhalten durch zwei Operationen bestimmt (Abb. 2. die Name Attributwerte und Verbindungen Edelmann sind außerhalb des Objekts nicht sichtbar.h. 2. daß das Objekt »Oberarm des Roboters« durch drei Attributwerte gekennzeichnet ist. Besitzt das Objekt einen eigenen Namen. einLandhaus: Einfamilienhaus.5-7). In der UML-Notation wird ein Obändern Gehalt jekt durch ein zweigeteiltes Rechteck dargestellt (Abb.Synonyme den synonym für den Begriff Objekt verwendet.2 Objekte LE 4 Der Zustand (state) eines Objekts wird durch seine Attributwerte Attributwerte bzw. Abb.

LE 4 Abb. Der Klassenname beginnt immer mit einem Großbuchstaben. Um bestimmte Sachverhalte zu betonen. Abb. Operationen werden in der UML-Notation für Objekte nicht aufgeführt. wird bei Objekten der obere Rechteckteil blau unterlegt. 2. 2. 2.5-8: Verkapselung der Daten 2.5-9: UMLNotation Objekt :Klasse einObjekt einObjekt: Klasse Attribut 1 = Wert 1 Attribut 2 = Wert 2 Attribut 3 sichtlich ist. Auch können nicht interessierende Attributwerte weggelassen werden. Im unteren Teil des Rechtecks werden die relevanten Attribute des Objekts mit den Attributwerten angegeben. Dieser Teil des Rechtecks kann entfallen.5-10: Objekte derOberarm: Roboterarm aktueller Winkel = 45 maximaler Winkel = 90 minimaler Winkel = 0 :Mitarbeiter Name = ”Edelmann” Gehalt = 5000 108 . Solche Abwandlungen der Notation sind nach der UML erlaubt. dann genügt auch der unterstrichene Objektname.5 Zuerst die Theorie: Objekte und Klassen Objekt Operation 1 Daten Operation 2 Bo c ts ha ft Auswahl einer Operation Abb.5-10 zeigt Beispiele für diese Notation. Um in diesem Buch Objekte deutlich von Klassen unterscheiden zu können. der Objektname immer mit einem Kleinbuchstaben. 2. wird auch an anderen Stellen bisweilen Farbe eingesetzt. getrennt durch ein Gleichheitszeichen. Abb.

109 .” usw. zweitesTextfeld: TextField Background = white Bound X = 192 Bound Y = 60 Bound Width = 228 Bound Height = 27 Editable = true Text = “zweites Textfeld..2. 2. Abb..” usw. einDruckknopf: Button Background = lightGrey Bound X = 36 Bound Y = 228 Width = 168 Height = 25 Label = ”ein Druckknopf.5-11 zeigt ein Beispiel einer Benutzungsoberfläche. ersterTextbereich: TextArea Background = white Bound X = 36 Bound Y = 108 Bound Width = 252 Bound Height = 99 ScrollbarVisibility = Scrollbars_both Text = ”ein Textbereich. Abb.” usw..5-12 die Objekte in UMLNotation..” usw.5. 2.” usw. 2....5-11 zweiterFührungstext: Label Alignment = left Background = white Bound X = 36 Bound Y = 60 Bound Width = 156 Bound Height = 16 Text = ”zweiter Führungstext.” usw.... Abb.. erstesTextfeld: TextField Background = white Bound X = 192 Bound Y = 24 Bound Width = 228 Bound Height = 27 Editable = true Text = ”erstes Textfeld. 2.. 2.5-12: Objektsymbole zu Abb.2 Objekte LE 4 Die Interaktionselemente auf der grafischen Benutzungsoberfläche Beispiel 3a eines Programms sind ebenfalls Objekte.5-11: Beispiel einer Benutzungsoberfläche mit Objekten ersterFührungstext: Label Alignment = left Background = white Bound X = 36 Bound Y = 24 Bound Width = 156 Bound Height = 16 Text = ”erster Führungstext. Abb.

einen Schnappschuß des laufenden Programms darzustellen. :Kunde :Kunde Firmenname = ”Tankbau KG” Firmenadresse = ”44867 Bochum. 2. Sie können daher als Objekte modelliert werden. Poststr. /4/ Firmenname und Firmenadresse müssen zusammen geändert werden können (ändern Adresse). Objekt :Klasse1 Verbindung (link) :Klasse2 :Klasse4 :Klasse3 Attribut1 = Wert1 Attribut2 = Wert2 110 . /3/ Alle Daten müssen einzeln geschrieben werden können. 12” Auftragssumme = 0 Objektdiagramme Will man neben den Objekten auch ihre Verbindungen zu anderen Objekten darstellen. Die Kunden »KFZ-Zubehör GmbH« und »Tankbau KG« sind individuelle und identifizierbare Exemplare der Gruppe Kunden. Um die Kunden geeignet verwalten zu können. Südstr. Beispiel 4a Fallstudie Abb. dann kann man dazu Objektdiagramme verwenden (Abb.5-14a: UML-Objekt. /2/ Alle Daten müssen einzeln gelesen werden können. Die Anforderungen an die erste Aufbaustufe dieses KV-Programms werden in einem Pflichtenheft zusammengefaßt: /1/ Firmenname und Firmenadresse jedes Kunden sollen gespeichert werden.5-14a). 23” Auftragssumme = 0 Firmenname = ”KFZ-Zubehör GmbH” Firmenadresse = ”44137 Dortmund. 2. Die ersten Kunden »KFZ-Zubehör GmbH« und »Tankbau KG« lassen sich durch folgende Eigenschaften beschreiben (Abb. 2. Abb. Es erlaubt eine Momentaufnahme bzw. /5/ Die Auftragssumme ist mit dem Wert »0« vorzubesetzen. 2.und Kollaborationsdiagramme Objektdiagramm (object diagram) Ein Objektdiagramm beschreibt Objekte und ihre Verbindungen (links) untereinander. Verbindungen zwischen Objekten werden durch einfache Linien beschrieben.5-13). soll ein Kundenverwaltungsprogramm (KV-Programm) geschrieben werden.LE 4 2. daß in der Praxis ein Objekt über viele Attribute verfügen kann.5 Zuerst die Theorie: Objekte und Klassen Das Beispiel zeigt.5-13: Objekte des KVProgramms Die Firma ProfiSoft erhält ihre ersten Aufträge.

5-14b: UML-Objekt. Zwischen diesem Kunden-Objekt und den Auftrags-Objekten besteht dann eine Verbindung (Abb. sind mit {new}. sind {transient}. Objekte. besser Zusammenarbeitsdiagramm (collaboration diagram) Ein Kollaborationsdiagramm erweitert das Objektdiagramm um Botschaften. 2.2. die während der Ausführung gelöscht werden. 1:Operation1() :Klasse1 {transient} 3:Operation4() :Klasse4 Abb.2 Objekte LE 4 Kollaborationsdiagramm. 2. dargestellt als »Strichmännchen«. Als Auslöser einer Operation kann ein Akteur – in der Regel der Benutzer – eingetragen werden. die während der Ausführung neu erzeugt werden. An jede Verbindung (link) kann eine Botschaft in Form eines Pfeils.und Kollaborationsdiagramme 2:Operation2() :Klasse2 {new} 2. Objekte.5-16: Objektdiagramm mit Verbindungen zwischen einem Kunden und seinen Aufträgen :Auftrag Nummer = 3 Art = ”Programmierung” Anzahl Stunden = 45 Stundensatz = 180 Auftragsdatum = 10. Poststr. 2. 2. Es zeigt diejenigen Objekte.1.1.99 111 . 2. die während der Ausführung sowohl erzeugt als auch wieder gelöscht werden.5-15).12” Auftragssumme = 0 Abb.5-16). die für die Ausführung einer bestimmten Operation relevant sind.5-15: Objektdiagramm von zwei Roboterarm-Objekten Der Kunde »KFZ-Zubehör GmbH« kann zwei Aufträge erteilt haben. :Auftrag Nummer = 1 Art = ”Beratung” Anzahl Stunden = 8 Stundensatz = 250 Auftragsdatum = 5.1:Operation3() :Klasse3 {new} Bei der Modellierung eines Roboters stehen die Objekte »Oberarm« Beispiele und »Unterarm« in einer Verbindung (Abb. einer laufenden Nummer und dem Operationsnamen angetragen werden.5.99 :Kunde Firmenname = “KFZ-Zubehör GmbH” Firmenadresse = ”44137 Dortmund. derOberarm: Roboterarm aktueller Winkel = 45 maximaler Winkel = 90 minimaler Winkel = 0 derUnterarm: Roboterarm aktueller Winkel = 30 maximaler Winkel = 45 minimaler Winkel = –45 Abb. Objekte. Die Reihenfolge und Verschachtelung der Operationen wird durch eine hierarchische Numerierung angegeben. mit {destroyed} gekennzeichnet.

die es von allen anderen Objekten unterscheidet.LE 4 Objekt-Identität 2.5-17: Identität und Gleichheit von Objekten :Firma Name = ”KFZ-Zubehör GmbH” :Firma Name = ”Technotronic” Gleichheit :Firma Name = ”Beratung & Mehr GmbH” :Firma Name = ”Beratung & Mehr GmbH” relevante Eigenschaften Für die Modellierung von Objekten ist es wichtig. wenn sie dieselben Attributwerte besitzen. Zwei Objekte sind gleich. meldet sich Herr Schulze in einem Seminar an. 2. Keine zwei Objekte besitzen dieselbe Identität. Für die Modellierung des internen Objekts Schulze in einem Seminarverwaltungsprogramm der Firma »Teachware« sind die Hobbies von Herrn Schulze völlig uninteressant.B. während interne Objekte für ein Software-System relevant sind. dann müssen für das jeweilige Modell (hier: Seminarverwaltung) die relevanten Eigenschaften ermittelt werden. Die ent112 Beispiel . zwischen externen und internen Objekten zu unterscheiden /Heide Balzert 99/. während die Firmen »KFZ-Zubehör GmbH« und »Technotronic KG« beide eine Tochterfirma mit dem Namen »Beratung & Mehr GmbH« besitzen (Gleichheit).5 Zuerst die Theorie: Objekte und Klassen Jedes Objekt besitzt eine unveränderliche Objekt-Identität. In der Abb.5-17 haben die Firmen »KFZ-Zubehör GmbH« und »Tankbau KG« eine gemeinsame Tochterfirma »Dienstleistungen GmbH« (Identität). Externe Objekte gibt es in der realen Welt. :Firma Name = ”KFZ-Zubehör GmbH” :Firma Name = ”Tankbau KG” Identität :Firma Name = ”Dienstleistungen GmbH” Abb. Herr Schulze ist in seiner Freizeit ein begeisterter Tennisspieler und spielt regelmäßig in seinem »Tennisclub Tennis 2000 e. Der Mitarbeiter Schulze der Firma »KFZ-Zubehör GmbH« will sich weiterbilden und besucht ein Seminar der Firma »Teachware«. auch wenn sie zufällig identische Attributwerte besitzen. Beim Übergang von der realen Welt in die objektorientierte Modellierung tritt folgender Effekt auf: In der realen Welt sind Objekte aktiv.V«. Wird aus dem externen Objekt das interne Objekt abgeleitet. 2. z. aber unterschiedliche Identitäten haben.

2. auf die diese Klasse bzw.Attribute but muß ein Typ (type) zugeordnet werden.3 Klassen Eine Klasse ist allgemein eine Gruppe von Dingen.2. Analog lassen sich erstesTextfeld und zweitesTextfeld der Klasse TextField. Beispiele für Typen sind Zeichenketten (String). Für das Schreiben von einzelnen Attributwerten wird als Operationsname setAttributname verwendet. Typen werden in der UML-Notation getrennt durch Doppelpunkt hinter den Attributnamen angegeben.7 werden Typen ausführlich behandelt. z. Im Beispiel 4a haben die Objekte »KFZ-Zubehör GmbH« und »Tank.3 Klassen LE 4 sprechenden internen Objekte sind dagegen passiv. Zeichen (char) und Gleitkommazahlen (float). Ein Typ legt fest. um Objekte zu erzeugen (object factory). Die meisten Programmierumgebungen besitzen eine Online-Hilfe. werden über den Teilnehmer Schulze Daten und Vorgänge gespeichert. ersterTextbereich der Klasse TextArea und einDruckknopf der Klasse Button zuordnen. Sie gehören zur Klasse Label.5-19). In der objektorientierten Welt spezifiziert eine Klasse die Ge. 2. die einen direkten Zugriff auf diese Informationen ermöglicht. Das Verhalten (behavior) einer Klasse wird durch die Botschaften beschrieben. Jedem Attri.5. Jede Botschaft aktiviert eine Operation gleichen Namens. Eine Klasse besitzt einen Mechanismus.B. Diese Klassen gehören in Java zu der Klassenbibliothek AWT (abstract window toolkit). für das Lesen der Operationsname getAttributname.Beispiel 4b bau KG« die gleichen Attribute und Operationen. deren Objekte reagieren können.5-18. Als zusätzliche Operationen sind die Konstruktionsoperationen Kunde() und Kunde(Name:String) hinzuge113 .7).5-12) besitzen ersterFührungstext und Beispiel 3b zweiterFührungstext die gleichen Attribute und Operationen.14 und 2. Im Kapitel 2. demselben Verhalten (Operationen) und denselben Beziehungen. Attribute müssen noch genauer spezifiziert werden.5. In den meisten Programmiersprachen sind eine Anzahl von Typen vordefiniert. Die Klassen zeigt Abb. 2. Lebewesen oder Begriffen mit gemeinsamen Merkmalen. Beziehungen (relationships) sind Vererbungsstrukturen und Assoziationen (siehe Kapitel 2. welche Attributwerte einem Attribut zugeordnet und welche Operationen auf diesen Werten ausgeführt werden können. ganze Zahlen (int). Jedes erzeugte Objekt gehört zu genau einer Klasse. Die Attribute und Operationen sind in der zugehörigen Dokumentation beschrieben.Klasse meinsamkeiten einer Menge von Objekten mit denselben Eigenschaften (Attributen). Sie gehören daher Fallstudie zur Klasse Kunde (Abb. Im Beispiel 3a (Abb. 2.

Adresse: String) setFirmenname(Name: String) setFirmenadresse(Adresse: String) setAuftragssumme(Summe: int) getFirmenname(): String getFirmenadresse(): String getAuftragssumme(): int 114 . 2. Left. Button() Button(String) addActionListener(ActionListener) getLabel() setLabel() usw. Button Background : Color Bound X : int Bound Y : int Bound Width : int Bound Height : int Label : String usw. Right) Bound X : int Bound Y : int Bound Width : int Bound Height : int Text : String usw.LE 4 Abb. TextField() TextField(String) addActionListener(ActionListener) getText() isEditable() setEditable(boolean) setText() usw. TextField Background : Color Bound X : int Bound Y : int Bound Width : int Bound Height : int Editable : (true. ScrollbarsHorizontal only. TextArea Background : Color Bound X : int Bound Y : int Bound Width : int Bound Height : int ScrollbarVisibility : (Scrollbars_both. ScrollbarsVertical only) Text : String usw. 2. ScrollbarsNone. false) Text : String usw.5-18: Klassen für ausgewählte Interaktionselemente 2.5 Zuerst die Theorie: Objekte und Klassen Label Alignment : (Center.5-19: Klasse Kunde Kunde Firmenname: String Firmenadresse: String Auftragssumme: int Kunde() Kunde(Name: String) aendernAdresse(Name: String. TextArea() TextArea(String) append(String) getText() setText() getScrollbarVisibility() usw. Label() Label(String) getAlignment() getText() setAlignment setText(String) usw. Abb.

Operationen. z.h. Im mittleren Teil sind die Attributnamen und ihre Typen angegeben.5-21). neue Objekte einer Klasse zu erzeugen bzw.B. im unteren Teil die Operationsnamen. mit dem beliebig viele. Die Klassenbeschreibung dient sozusagen als eine Schablone. die angibt. Beim Aufruf dieses Konstruktors muß dann in Klammern der konkrete Firmenname angegeben werden. dann wird im allgemeinen ein leeres Objekt erzeugt. jeweils linksbündig. 2. getrennt durch einen Doppelpunkt. Wenn die Firma ProfiSoft einen neuen Kunden akquiriert. zu »konstruieren«. Zusätzlich kann ein Adjektiv angegeben werden. Weitere Informationen werden textuell festgelegt. Konstruktoren können im Klammerpaar aber auch Parameter angeben. d. Beispiele: Mitarbeiter. hinter dem Klammer115 Schablone Konstruktoren Klassenname Notation Klassen-Diagramm UML-Notation . setAuftragssumme(Summe: int). Kunde("Tankbau KG"). z. z. Jede Klasse muß mindestens eine Konstruktoroperation besitzen. identische Abdrücke erstellt werden können. Mehrere Parameterangaben werden durch Kommata getrennt. die es ermöglichen. Öffentliche Veranstaltung. Klassen werden grafisch und textuell beschrieben.B. bezeichnet man als Konstruktoroperationen. Erfolgt keine Wertübergabe.B. Dem Operationsnamen folgt ein Klammerpaar (). Eine Klasse ist durch ein Substantiv im Singular zu benennen.2. dann stehen diese im Klammerpaar. dann werden in Klammern hinter dem Operationsnamen der Name und der zugehörige Typ des Parameters – getrennt durch Doppelpunkt – angegeben. In der UML-Notation wird eine Klasse durch ein dreigeteiltes Rechteck dargestellt (Abb. Übergibt eine Operation Ergebnisse an den Botschaftssender. In ihnen wird festgelegt. Abb. dann muß Beispiel von der Klasse Kunde ein neues Objekt erzeugt werden. Die grafische Darstellung der Klassen und ihrer Beziehungen zueinander wird als Klassendiagramm bezeichnet.5. Es wird ein Objekt erzeugt und das Attribut Firmenname mit dem Wert "Tankbau KG" vorbelegt. wie ein Objekt dieser Klasse aussehen soll. Werden Attributwerte über eine Operation an ein Objekt übergeben. Im oberen Teil steht zentriert und fett der Klassenname. Veranstaltung. wie ein neues Objekt der Klasse erzeugt wird (siehe unten). In der grafischen Darstellung werden der Klassenname und in der Regel noch Attributnamen und ihre Typen sowie Operationsnamen angegeben. Kunde. Kunde(Name:String). 2. Im einfachsten Fall besteht ein Konstruktor aus dem Klassennamen gefolgt von einem Klammerpaar (). Besitzt die Operation Parameter. die Attribute des Objekts erhalten keine Attributwerte.5-20 veranschaulicht den Vergleich einer Klasse mit einer Schablone anhand eines Prägestempels.3 Klassen LE 4 kommen. dann steht nur das Klammerpaar. dann wird der Typ des Ergebnisses. kurz Konstruktoren (constructors) genannt. Wird an diese Operation eine Botschaft geschickt.

dann können sie weggelassen werden. Abb.5-22 beschreibt die Klasse Roboterarm. Sind noch keine Attribute bzw. 2.LE 4 Abb. Parameter2: Typ2) Operation4(): Ergebnistyp3 Namensfeld Attributliste Operationsliste paar angegeben. 116 .5-21: UML-Notation Klasse Nur Klassennamen: Klasse Nur Attribute: Klasse Attribut1 Attribut2 Nur Operationen: Klasse Operation1() Operation2() Ausführliche Darstellung: Klasse Attribut1: Typ1 = Anfangswert1 Attribut2: Typ2 = Anfangswert2 Attribut3: Typ3 Klasse() Operation1() Operation2(Parameter1: Typ1) Operation3(Parameter1: Typ1. Sind Attribute und Operationen noch nicht festgelegt oder im Moment nicht relevant. dann kann auch nur der Operationsname mit leerem Klammerpaar angegeben werden. Liegen die Parameter noch nicht fest. 2. so können sie – vorläufig – entfallen.5-20: Klasse als Schablone 2 Grundlagen der Programmierung Mi emaN nrednä emaN tlaheG ta rb ei te r tlaheG nrednä Mitarbeiter() Mitarbeiter() Mitarbeiter-Objekt ändern Name Name Mitarbeiter-Objekt ändern Name Name Gehalt Gehalt ändern Gehalt ändern Gehalt Abb. Operationen bekannt. 2.

. kann es dort alle benötigten Operationen vorfinden.5-23 beschreibt diesen Zusammenhang in einer Notation. Abb.5-23: Objekt kennt seine Klassen Umgekehrt »weiß« eine Klasse im allgemeinen nicht. die sich an die Weizenbaumdiagramme anlehnt (vgl. /Jacobson et al.. 2.B. Auf dieser Grundlage ist es dann einfach. zu welcher Klasse es gehört. 117 . sich zunächst die Objekte und Klassen zu überlegen und z.Objekt kennt sten objektorientierten Programmiersprachen kann ein Objekt zur seine Klasse Laufzeit ermitteln. sind die Operationen der Klasse zugeordnet. ein Java-Programmgerüst zu schreiben. Objekt einObjekt: Klasse Attribute Werte Klasse .. zu welcher Klasse es gehört. WinkelMax: int) Roboterarm LE 4 Abb. 2. Operationen . in der UML-Notation darzustellen. Objekte nicht Diese manchmal notwendige Eigenschaft muß dann im Einzelfall »von Hand« hinzugefügt werden. Da jedes Objekt seine Klasse kennt. welche Ob. Damit ein sicheres Verständnis über die dynamischen Abläufe erreicht wird. In den folgenden Abschnitten wird für die Fallstudie »Kundenverwaltung« schrittweise ein Java-Programm entwickelt.6 Dann die Praxis: Objekte und Klassen in Java Roboterarm aktueller Winkel: int maximaler Winkel: int minimaler Winkel: int Roboterarm() einstellen Grundposition(Winkel: int) melden Aktuelle Position(): int einstellen Neue Position(Winkel: int) initialisieren Min & Max Winkel(WinkelMin: int. 92/). jedoch gleiche Operationen besitzen. Da alle Objekte zwar unterschiedliche Attributwerte.2. Auf den beigefügten CD-ROMs sind entsprechende SoftwareWerkzeuge vorhanden. In Java geschieht dies durch die Operation getClass(). welche Objekte von ihr erzeugt wurden. Bei den mei. ist es immer sinnvoll. 2. 2.Klasse kennt jekte sie »besitzt« bzw.6 Dann die Praxis: Objekte und Klassen in Java Bevor man ein Java-Programm schreibt.5-22: Klasse Roboterarm Jedes Objekt »weiß«. Abb. Eine Reihe von Software-Werkzeugen erstellt aus einer UML-Notation automatisch ein Java-Programmgerüst..

6-2). Initialisierungswert zuzuweisen. Attribute Typ Syntax Geheimnisprinzip Beispiele Jede Attributdeklaration (field declaration) wird durch ein Semikolon abgeschlossen.6. hintereinander geschrieben werden. 2. Die Syntax einer Klassendeklaration zeigt Abb. Außerdem ist es möglich. dann gibt es dafür eine Abkürzungsvorschrift: Die Attributnamen können. Eine Klassendeklaration besteht wie eine Klasse in der UML-Notation aus drei Teilen: s dem Klassennamen (Identifier) und s dem Klassenrumpf (Class Body). s int: ganze Zahlen. s float: Gleitkommazahlen. private String Firmenadresse. private int Auftragssumme = 0. private String Firmenname. Firmenadresse.LE 4 2. Die Attribute müssen in Java durch einen Typ (type) spezifiziert werden. Besitzen mehrere Attribute den gleichen Typ. wie Objekte von ihr erzeugt werden können (Abb. Konstruktoren unterscheiden sich von anderen Operationen durch ihren Operationsnamen.6-1. Im Gegensatz zur UML-Notation stehen in Java die Typangaben vor den Attributnamen. 2.6 Dann die Praxis: Objekte und Klassen in Java werden grundlegende Vorgänge aus verschiedenen Perspektiven grafisch dargestellt. Klassen müssen in einem Java-Programm deklariert werden. 118 . Man spricht daher von Klassendeklarationen (class declarations). s char: Zeichen. Beispiele private String Firmenname. In Java sind beispielsweise folgende Typen vordefiniert: s String: Zeichenketten (Achtung: großes S).1 Deklaration von Klassen Zentrale Bausteine eines Java-Programms sind Klassen. daß diese Attribute »Privatbesitz« der jeweiligen Klasse sind. 2. jedem Attribut einen Voreinstellungsbzw. der wiederum im wesentlichen aus zwei Teilen besteht: n den Attributdeklarationen (Field Declarations) und n den Operationsdeklarationen (Method Declarations). durch Kommata getrennt. Objekterzeugung Jede Klasse muß durch einen oder mehrere Konstruktoren festlegen. Damit andere Klassen die Werte von Attributen nicht sehen können – und das Geheimnisprinzip eingehalten wird – wird durch das Schlüsselwort private vor der Typangabe festgelegt. private int Auftragssumme.

6. 2. Operationsname = Damit von anderen Java-Programmen eine Botschaft an den Kon. sollte als Konvention die von oben nach unten aufgeführte Reihenfolge eingehalten werden.2. ClassBody Klassenrumpf Hinweis: Obwohl die Reihenfolge der aufgeführten Sprachkonstrukte im Klassenrumpf beliebig sein kann. mit welchen Werten die Attribute des zu erzeugenden Objekts initialisiert werden sollen.1 Deklaration von Klassen LE 4 ClassDeclaration Klassen-Deklaration class Identifier Super Interfaces ClassBody public abstract final Damit eine Java-Klasse von anderen Java-Programmen benutzt werden kann. Type Identifier VariableDeclaratorId[] . Initialisierung 119 . muß vor seinem Operationsnamen public angegeben werden.6-1: Java-Syntax für Klassen Der Operationsname eines Konstruktors ist der Klassenname.Klassenname struktor gesandt werden kann. Abb. private public protected = final Expression ArrayInitializer static transient Hinweis: Noch nicht behandelte oder für den gegenwärtigen Gesichtspunkt irrelevante Teile der Syntaxdiagramme sind grau unterlegt. muß sie als »öffentlich« (public) deklariert werden. public In runden Klammern kann eine Parameterliste aufgeführt werden. { FieldDeclaration StaticInitializer ConstructorDeclaration MethodDeclaration } FieldDeclaration Attribut-Deklaration . Vor dem Schlüsselwort class muß dann public stehen. in der angegeben wird.

eingeschlossen in geschweifte Klammern.6 Dann die Praxis: Objekte und Klassen in Java ConstructorDeclaration Konstruktor-Deklaration ( FormalParameterList ) Throws SimpleTypeName public protected private { ExplicitConstructorInvocation BlockStatements } SimpleTypeName muß der Name der Klasse sein. In einem Operationsrumpf können Anweisungen stehen. Abb.LE 4 2. Jeder Konstruktor und jede Operation besteht aus einem Operationsrumpf. dem Attribut Firmenname zugewiesen wird. 2. in der sich der Konstruktor befindet. Operationen sind in Java ähnlich wie Konstruktoren aufgebaut. Im Beispiel wird festgelegt. der als Parameter eingegeben wird. Damit eine Opera120 . MethodDeclaration Operations-Deklaration Type public protected private Identifier ( FormalParameterList ) void { Throws BlockStatements Operationsrumpf } abstract static final synchronized native Hinweis: Noch nicht behandelte oder für den gegenwärtigen Gesichtspunkt irrevelante Teile der Syntaxdiagramme sind grau unterlegt. } //Konstruktor der Klasse Kunde //Das Attribut Firmenname //erhält den Wert von Name zugeordnet Java-Regel Operationen Die Parameterliste besteht aus Attributen mit vorangestelltem Attributtyp (hier: String Name).6-2: Java-Syntax für Konstruktoren und Operationen Beispiel public Kunde (String Name) { Firmenname = Name. daß der Wert des Attributs Name. Jede Anweisung wird durch ein Semikolon abgeschlossen. Der Name der Operation ist jedoch frei wählbar.

//Angabe des Ergebnisattributs } Beispiele Bei einer Operation mit einem Ergebnisattribut wird im Operationsrumpf der Name des Ergebnisattributs oder ein direkter Ergebniswert. Wird durch eine Operation ein einzelnes Attribut gelesen. set sollte die Operation getAttributname lauten.2.1 Deklaration von Klassen LE 4 tion von anderen Java-Programmen aufgerufen werden kann. In Java kann nur ein Wert parameter eines Attributs an die auslösende Botschaft übergeben werden.B. dann Konventionen get. } //Operation mit einem Ergebnisparameter und keinem //Eingabeparameter public String getFirmenadresse() { return Firmenadresse. z. muß sie als public gekennzeichnet werden. Firmenadresse.6. hinter dem Schlüsselwort return angegeben.8 Operationen werden ausführlich im Abschnitt 2. 0. Wird durch eine Operation ein einzelnes Attribut gesetzt. Abschnitt 2. Wird eine Operation durch eine Botschaft aktiviert. Eine Operation kann auch Daten an eine Botschaft als Ausgabe. dann kann Eingabeparameter die Botschaft Eingabedaten an die Operation übergeben. private int Auftragssumme = 0. Für die Fallstudie »Kundenverwaltung« ergibt sich folgende Klasse Beispiel Fallstudie Kunde: /*Programmname: Kundenverwaltung1 * Fachkonzept-Klasse: Kunde */ public class Kunde { //Attribute private String Firmenname.8 behandelt. Der Typ dieses Ergebnisattributs wird vor dem Operationsnamen angegeben.Ausgabedaten bzw. //Operation mit einem Eingabeparameter und keinem //Ausgabeparameter public void setFirmenadresse(String Adresse) { Firmenadresse = Adresse. Die möglichen Eingabedaten werden durch Aufzählung der Attributnamen (mit vorangestelltem Attributtyp) in der formalen Parameterliste (Formal Parameter List) festgelegt – analog wie bei Konstruktoren. Ergebnisdaten zurückgeben. dann steht vor dem Operationsnamen das Schlüsselwort void. Übergibt eine Operation keine Ergebnisse. »Kundenverwaltung« 121 . dann sollte die Operation setAttributname heißen.

} } FachkonzeptKlasse Abb. } public String getFirmenadresse() { return Firmenadresse. 2. } //Lesende Operationen public String getFirmenname() { return Firmenname. } //Schreibende Operationen public void setFirmenname (String Name) { Firmenname = Name.6 Dann die Praxis: Objekte und Klassen in Java //Konstruktor public Kunde(String Name) { Firmenname = Name. um die erzeugten Objekte zu manipulieren. 122 .6-3 zeigt. String Adresse) { Firmenname = Name. } public void setAuftragssumme(int Summe) { Auftragssumme = Summe. } public void setFirmenadresse (String Adresse) { Firmenadresse = Adresse. Eine Fachkonzept-Klasse realisiert die im Pflichtenheft festgelegten fachlichen Anforderungen. um erstens Objekte von der Fachkonzept-Klasse zu erzeugen und zweitens.LE 4 2. Damit ist für die Fallstudie »Kundenverwaltung« die Fachkonzept-Klasse fertiggestellt. sie stehen nicht in der UML-Klasse. Die Anweisungen in den Operationsrümpfen müssen in Java hinzugefügt werden. wie man systematisch von einer Klasse in UML-Notation zu einer Java-Klasse gelangt. } public int getAuftragssumme() { return Auftragssumme. } //Kombinierte Schreiboperation public void aendernAdresse (String Name. von der aus Botschaften verschickt werden. Firmenadresse = Adresse. Es wird jetzt aber noch mindestens eine weitere Klasse benötigt.

//Typ4 muß ergänzt werden //Konstruktor(en) Klasse() { //Standardkonstruktor } //Operationen (Methoden) void Operation1() { //Anweisungen der Operation1 ergänzen } void Operation2(Typ1 Parameter1) { //Anweisungen der Operation2 ergänzen } void Operation3(Typ1 Parameter1.Entwurfsprinzip: steht heute in der klaren Trennung zwischen Benutzungsober. der Doppelpunkt entfällt: UML Attribut1: Typ1 = Anfangswert1 Java Typ1 Attribut1 = Anfangswert1.Trennung GUI – Fachkonzept fläche und Fachkonzept (Abb. der Doppelpunkt entfällt.2 GUI-Klassen LE 4 UML-Klasse Klasse Attribut1: Typ1 = Anfangswert1 Attribut2: Typ2 = Anfangswert2 Attribut3: Typ3 Attribut4 Klasse() Operation1() Operation2(Parameter1: Typ1) Operation3(Parameter1: Typ1.2 GUI-Klassen Ein grundlegendes Prinzip beim Entwurf von Software-Systemen be.6-4). 2.2. vor den Operationsnamen wird void geschrieben: UML Operation2(Parameter1: Typ1) Java void Operation2 (Typ1 Parameter1). Hat eine Operation einen Ergebnistyp. dann wird der Ergebnistyp vor den Operationsnamen geschrieben: UML Operation4(): Ergebnistyp Java Ergebnistyp3 Operation4(). Eine dieser zusätzlichen Klassen stellt in der Regel die Verbin. In Java müssen die restlichen Angaben dann ergänzt werden: Klasse Attribut1 Attribut2 Operation1() Operation2() Java-Klasse class Klasse { //Attribute Typ1 Attribut1 = Anfangswert1.6. 2. Parametername und Typangabe sind in Java ebenfalls vertauscht. im folgenden kurz GUI-Klasse Von UML-Klassen zu Java-Klassen genannt. Typ4 Attribut4. 123 . Typ2 Attribut2 = Anfangswert2. Parameter2: Typ2) Operation4(): Ergebnistyp3 Hinweis: Beim Zeichnen von UML-Klassen werden oft nur die Attribute und Operationsnamen angegeben. Typ2 Parameter2) { //Anweisungen der Operation3 ergänzen } Ergebnistyp3 Operation4() { //Anweisungen der Operation4 ergänzen } } //Ende der Klasse Folgende Besonderheiten sind zu beachten: Attributname und Typangabe sind in Java vertauscht.6.Abb. 2. Typ3 Attribut3.6-3: dung zur Benutzungsoberfläche her.

Um spätere Datenänderungen vornehmen zu können. Eine GUI-Klasse baut die Benutzungsoberfläche. 2.class. Dies ist erlaubt und in manchen Fällen auch sinnvoll. Der Java-Compiler erzeugt aber von jeder Klasse. dann muß die GUI-Klasse ein neues Objekt der Fachkonzept-Klasse erzeugen und die eingegebenen Daten dorthin übertragen. mehrere Klassen in einer Datei zu speichern. Da sich eine Klasse Informationen nur in Attributen merken kann. müssen für diese Referenzen ebenfalls Attribute angegeben werden. Um am Klassennamen eindeutig zu erkennen.h. sind drei Schritte erforderlich: 1 Es müssen Attribute. Zusätzlich muß der Dateiname mit dem Namen der publicKlasse übereinstimmen.. liest die Eingaben von den Benutzern und gibt Ergebnisse aus. d. von den FachkonzeptKlassen werden keine Botschaften zu den GUI-Klassen geschickt. GUI–Klasse 2 GUI–Klasse 1 Interaktion Benutzer GUISystem . speichern. In der Regel benötigt man für ein Java-Programm mehrere Klassen. d. auf. deklariert werden. Diese Attribute werden im folgenden kurz Refe124 Referenz-Attribute . die den FachkonzeptKlassen Botschaften schicken.3 Erzeugen und Referenzieren von Objekten Um Objekte zu erzeugen und zu referenzieren. sondern zwischen dem GUI-System und den Fachkonzept-Klassen befinden sich GUI-Klassen.. die die Referenzen speichern sollen.LE 4 2. daß nur eine Klasse public ist. 2.6-4: Trennung Benutzungsoberfläche Fachkonzept mehrere Klassen in 1 Datei Java-Konvention Namenskonvention GUI-Klasse Die Fachkonzept-Klassen dürfen nicht direkt mit dem GUI-System kommunizieren. Voraussetzung ist jedoch. um welche Art von Klasse es sich handelt. In Java ist es aber auch möglich.. Jede Klasse sollte normalerweise in einer eigenen Datei abgespeichert werden.h.6 Dann die Praxis: Objekte und Klassen in Java . Wird beispielsweise vom Benutzer ein neuer Kunde eingegeben.6. Zeiger auf die erzeugten Fachkonzept-Objekte merken. In der Regel kennen die Fachkonzept-Klassen die GUI-Klassen nicht. muß sich die GUI-Klasse Referenzen bzw. eine gesonderte Datei mit der Endung . Alle anderen Klassen dürfen das Schlüsselwort public nicht besitzen. Fachkonzept-Klasse 2 Fachkonzept-Klasse 1 Botschaften Botschaften Abb. bestehend aus Führungstexten. sollten GUI-Klassen am Ende immer den Zusatz GUI angehängt bekommen. Textfeldern usw. In Java sollte jede Klasse in einer eigenen Datei abgespeichert werden.. die in einer Datei abgelegt ist.

da Referenzen zwischen Objekten durch Verbindungslinien dargestellt werden (siehe Abb. z. Um die Vorgänge zu verdeutlichen. im Fall der Klasse Kunde also: Kunde ersterKunde. KundeGUI ersterKunde: Kunde zweiterKunde: Kunde KundeGUI() init() start() public void start() { .. z.B.. 125 . privat sein soll. UML-Notizsymbol Die Anweisungen von start() sind in einem Notizsymbol dargestellt. Alle drei Schritte werden jetzt am Beispiel der »Kundenverwaltung« detailliert betrachtet.6-5: Die Klasse KundeGUI Es wird außerdem angenommen. new Speicheradresse Referenz-Attribut zuweisen Referenz-Attribute deklarieren In der objektorientierten Programmierung hat es sich eingebür. a oder konventionen erster. zweiterRoboterarm. private Kunde ersterKunde. daß die Klasse KundeGUI den Standardkonstruktor KundeGUI() sowie die Operationen init() und start() besitzt. z.6-5 in der UMLKlassendarstellung auch die Referenz-Attribute aufgeführt. d. In der Operation start() werden zwei Kundenobjekte erzeugt. dann muß vor den Klassennamen private geschrieben werden. sind in Abb.2. zweiterKunde. 2. Anstelle der Typbezeichnung wird jedoch der Klassenname angegeben. ersterRoboterarm. ersterKunde = new Kunde (”KFZ”).. } Abb. 2.h. von anderen Klassen nicht zu sehen sein soll.6. 2.3 Erzeugen und Referenzieren von Objekten LE 4 renz-Attribute genannt.B.6-1).B. zweiter usw. in der es erzeugt wird. zweiterKunde = new Kunde (”Tankbau”). . zweiterKunde. Ein Notizsymbol in der UML enthält textuelle Informationen. einKunde. ersterKunde. 1 Deklarieren von Referenz-Attributen a Für die Referenz-Attribute geeignete Namen wählen. auf die die Referenz-Attribute später zeigen sollen. zweiter Kunde. gefolgt vom Klassennamen zu bezeichnen. 2. auf die die Referenz-Attribute später zeigen sollen. aPerson. Die Syntax entspricht dabei der Syntax für die Attributdeklaration (Abb. Sie werden wie »normale« Attribute am Anfang der entsprechenden Klasse deklariert. c Wenn das zu erzeugende Objekt in der Klasse. irgendein Objekt einer Klasse mit dem Präfix ein. Mit der Deklaration von Referenz-Attributen ist noch keine Erzeugung der Objekte verbunden. Normalerweise ist dies nicht der Fall. 2 Die Objekte müssen mit dem new-Operator erzeugt werden.Namensgert.. b Als Typ wird die Klasse angegeben. 3 Die Speicheradressen der erzeugten Objekte müssen in den deklarierten Referenz-Attributen gespeichert werden.5-14). Dabei ist das Präfix immer kleingeschrieben.

sondern werden vom Compiler automatisch ergänzt. 2.. :KundeGUI d ersterKunde = null d zweiterKunde = null … c Folgende Aktionen laufen bei der ersten Objekterzeugung ab: a Die Java-VM ruft den Konstruktor KundeGUI() auf. start() Hinweis: Genaugenommen werden aus Klassen Objekte der Java-Klasse Class erzeugt... ersterKunde = new Kunde("KFZ . um Zusatzinformationen in Diagrammen darstellen zu können. Halde KundeGUI Kunde ersterKunde a Botschaft new KundeGUI() Kunde zweiterKunde KundeGUI() e Referenz auf eigene Klasse setzen c b Erzeugen eines Objekts init() .6 Dann die Praxis: Objekte und Klassen in Java Objekte erzeugen u.. In der Klasse KundeGUI wird dadurch die Konstruktoroperation KundeGUI() aktiviert.6-6: Die dynamischen Vorgänge im Arbeitsspeicher beim Erzeugen von Objekten (Teil 1) Um sich die Vorgänge besser vorstellen zu können. 2 Objekte durch Aufruf der entsprechenden Konstruktoren erzeugen. daß auf der Halde genügend Speicherplatz gesucht und für alle Attribute des neuen Objekts reserviert wird. 2. nachdem von der Klasse KundeGUI ein Objekt erzeugt wurde. mit eingebetteten Bildern.LE 4 2. b Jeder Konstruktor enthält implizit Anweisungen zum Erzeugen eines Objekts. 126 . ist es sinnvoll.B.6-6 ist nur eine Anweisung dargestellt) müssen nicht programmiert werden. . 2.6-6 zeigt die Arbeitsspeicherbelegung. Halde Animation auf CD-ROM Abb. zweiterKunde = new Kunde("Tankbau KG") f Speicheradresse des neuen Objekts . Ein Notizsymbol wird mit gestrichelten Linien einem oder mehreren anderen Symbolen zugeordnet. new Kunde("Tankbau KG").. c Diese Anweisungen sorgen dafür. Abb.."). Der gewünschte Konstruktor wird mit dem vorangestellten Operator new aufgerufen. Dieser Bereich wird Halde (heap) genannt... Generell werden alle Klassen und Objekte in einem speziellen Arbeitsspeicherbereich gespeichert. Diese Anweisungen (in der Abb. Joy. new KundeGUI(). z. Steele 97/. die zusätzliche Informationen über die Klasse speichern /Gosling. sich die Abläufe im Arbeitsspeicher anzusehen.U. new Kunde("KFZZubehoer GmbH").

g Nach dem Erzeugen des Objekts werden die Anweisungen im Konstruktor – falls vorhanden – ausgeführt. e Der Konstruktor bewirkt. d. erhalten einen Standardwert. d. 2.6-7): a Wird von der Java-VM als nächstes die Botschaft start() an das neu erzeugte Objekt gesandt. hier an die VM. die keinen vorgegebenen Initialisierungswert besitzen. 3 Speicheradresse des neu erzeugten Objekts dem Referenz-Attribut zuweisen. Attribute. Diese Angabe bewirkt. dann werden die Anweisungen von start() ausgeführt.2. da jedes Objekt seine eigene Klasse kennt. "KFZ" wird in der Speicherzelle Firmenname abgelegt. Für Referenz-Attribute ist dies der Wert null. 127 . von welcher Klasse es erzeugt wurde. Analog verlaufen auch die anderen Objekterzeugungen (Abb. d.6. f Der Konstruktor setzt eine Referenz von der Speicherzelle :Kunde auf die Speicheradresse der Klasse Kunde. e Da jedes Objekt wissen muß. daß die entsprechende Klasse in den Arbeitsspeicher geholt wird. daß der Konstruktor Kunde(String Name) der Klasse Kunde ausgeführt wird. Ist sie vorhanden. setzt der Konstruktor automatisch eine Referenz von der Speicherzelle :KundeGUI auf die Speicheradresse von KundeGUI. dann wird über die Referenz auf die eigene Klasse verzweigt. Firmenname und Firmenadresse sind vom Typ String und erhalten als Initialisierung eine leere Zeichenkette. In diesem Fall wird die Anweisung Firmenname = Name ausgeführt. in die Speicherzelle :KundeGUI wird die Speicheradresse von KundeGUI eingetragen. daß Speicherplatz für alle Attribute des neuen Objekts von Kunde angelegt und die Attribute initialisiert werden. h Der im Konstruktoraufruf übergebene Parameter Name = "KFZ" wird dem Attribut Firmenname zugeordnet. an den Aufrufer des Konstruktors. da bei den Referenz-Attributen ersterKunde und zweiterKunde von KundeGUI die Klasse Kunde angegeben ist. i Bevor der Konstruktor beendet wird.3 Erzeugen und Referenzieren von Objekten LE 4 d Initialisierte Attribute erhalten einen Wert. gibt er die Speicheradresse des neu erzeugten Objekts an den Botschaftssender zurück. d Die Klasse Kunde befindet sich bereits im Arbeitsspeicher.h. der angibt.h. b In der Klasse KundeGUI wird die Operation start() gesucht. Auftragssumme erhält den Wert 0 . sonst gibt es eine Fehlermeldung. daß das Attribut noch auf kein anderes Objekt zeigt. c Die Anweisung ersterKunde = new Kunde("KFZ") bewirkt. f Bevor der Konstruktor beendet wird. gibt er die Speicheradresse des neu erzeugten Objekts an den Botschaftssender zurück.h.

. :Kunde Firmenname = “KFZ . 2. s Kollaborationsdiagramme (collaboration diagrams) (Abb..6-8)....” h Firmenadresse Auftragssumme = 0 e d "KFZ."). 2." "KFZ " Referenz auf eigene Klasse setzen i Speicheradresse des neuen Objekts j Der Botschaftssender ist die Anweisung ersterKunde = new Kunde("KFZ"). 2. UML-Darstellung dynamischer Abläufe Um dynamische Abläufe grafisch übersichtlich und kompakt darzustellen.. 2.LE 4 Abb.6-7: Die dynamischen Vorgänge im Arbeitsspeicher beim Erzeugen von Objekten (Teil 2) 2. b start() .... a start() :KundeGUI ersterKunde = null zweiterKunde = null .6 Dann die Praxis: Objekte und Klassen in Java Halde KundeGUI Kunde ersterKunde Kunde zweiterKunde KundeGUI() Erzeugen eines Objekts init() . s Sequenzdiagramme (sequence diagrams) (Abb. zweiterKunde = new Kunde("Tankbau KG") Botschaft ..5-14 b). 128 . die zurückgegebene Speicheradresse wird in der Speicherzelle des Referenz-Attributs ersterKunde gespeichert.. Kunde f j String Firmenname String Firmenadresse int Auftragssumme = 0 Kunde (Name: String) Erzeugen eines Objekts g Firmenname = Name aendernAdresse .. c ersterKunde = new Kunde("KFZ .. gibt es in der UML drei verschiedene Möglichkeiten: s Objektdiagramme (object diagrams) (Abb.. Analog verläuft dieser Vorgang bei der Erzeugung des Objekts zweiterKunde..5-14 a)..

zeigt Abb. Der Erzeugungsvorgang eines Objekts wird nicht im Detail dargestellt.h. die Botschaften austauschen. Abb.6-8: UML-Sequenzdiagramm :Klasse2 Neu erzeugtes Objekt Operation5("Text") Operation2(100) Objekt wird gelöscht Balkenlänge gibt Dauer der Aktivität an Das Objektdiagramm zeigt einen Schnappschuß eines Programms auf Objektebene.6. Sie soll so gewählt werden.2.3 Erzeugen und Referenzieren von Objekten LE 4 Ein Sequenzdiagramm (sequence diagram) dient zur schematischen Veranschaulichung von zeitbasierten Vorgängen. Die Reihenfolge der Objekte ist beliebig. 129 . Kennzeichnend für diese Darstellungsform ist eine Zeitachse. die zum Aktivieren der Operationen dienen. Bereits existierende Objekte Akteur erstesObjekt :Klasse1 Operation1() Klasse3() Botschaft neuesObjekt :Klasse3 Objekt schickt Botschaft an sich selbst Operation3() Abb. d. werden durch gestrichelte vertikale Geraden dargestellt (Objektlinien). 2. Auf diese gestrichelte Linie kann verzichtet werden. Nach dem Beenden der Operation zeigt eine gestrichelte – blaue – Linie mit offener Pfeilspitze. Existiert ein Objekt während der gesamten Ausführungszeit. Die erste vertikale Linie bildet in vielen Sequenzdiagrammen ein Akteur – in der Regel der Benutzer – dargestellt als »Strichmännchen«. Wird ein Objekt erst im Laufe der Ausführung erzeugt. Das Kollaborationsdiagramm erlaubt es. Jede Botschaft wird als gerichtete Kante (mit gefüllter Pfeilspitze) vom Sender zum Empfänger gezeichnet. Am oberen Ende der Linie wird ein Objektsymbol gezeichnet. Referenz-Attribute werden nicht aufgeführt. Der Pfeil wird mit dem Namen der aktivierten Operation beschriftet. dann zeigt eine Botschaft auf dieses Objektsymbol. Referenzen werden als Verbindungen. dann ist die Linie von oben nach unten durchgezogen.6-9. Eine Objektlinie beginnt nach dem Erzeugen des Objekts und endet mit dem Löschen des Objekts. die vertikal von oben nach unten führt. Jede Linie repräsentiert die Existenz eines Objekts während einer bestimmten Zeit. den Botschaftenfluß darzustellen. einschließlich der Erzeugung von zweiterKunde. als Linien dargestellt. Das Objektdiagramm nach Ausführung der oben beschriebenen Schritte. Das Löschen des Objekts wird durch ein großes »X« markiert. daß der Kontrollfluß zur aufrufenden Operation zurückgeht. In das Sequenzdiagramm werden die Botschaften eingetragen. 2. daß ein möglichst übersichtliches Diagramm entsteht.6-10 zeigt das Kollaborationsdiagramm für die Fallstudie »Kundenverwaltung«. 2. Eine aktive Operation wird durch ein schmales Rechteck auf der Objektlinie angezeigt. Objekte.

2. 2. Abb..LE 4 Abb. abstrakte Darstellung der Objekterzeugung KundeGUI ersterKunde: Kunde zweiterKunde: Kunde 1: KundeGUI() KundeGUI() init() start() :KundeGUI ersterKunde = null zweiterKunde = null Abstraktere. die die zeitliche Reihenfolge angibt Botschaft 1: KundeGUI() Weg der Botschaft :Kunde {new} Firmenname = “KFZ .6-10: Kollaborationsdiagramm der Fallstudie »Kundenverwaltung« Nummer. 2. semantisch gleichwertige Darstellung im Kollaborationsdiagramm: 1: KundeGUI() :KundeGUI {new} Eine noch genauere zeitliche Darstellung – allerdings unter Verzicht auf Attributangaben – erlaubt das Sequenzdiagramm (Abb..” Firmenadresse Auftragssumme = 0 zweiterKunde: Kunde Firmenname = “Tankbau KG” Firmenadresse Auftragssumme = 0 Abb.” Firmenadresse Auftragssumme = 0 :KundeGUI 2: Kunde(”KFZ …”) {new} Neu erzeugtes Objekt :Kunde {new} 3: Kunde (”Tankbau …”) Firmenname = “Tankbau KG” Firmenadresse Auftragssumme = 0 Bei dieser Diagrammform wird das Detail der Objekterzeugung nicht dargestellt.. Abb. 2. Abb. Die Botschaft zur Erzeugung eines Objekts wird an das Objekt angetragen.6-11: Ausführliche vs. obwohl in Wirklichkeit die Botschaft an die Klasse geschickt wird.6-8).6 Dann die Praxis: Objekte und Klassen in Java Verbindung (link) :KundeGUI ersterKunde: Kunde Firmenname = “KFZ . 2. 2. die dann das Objekt erzeugt.6-12 zeigt das Sequenzdiagramm für die »Kunden130 ..6-11 verdeutlicht nochmals die Bedeutung der abstrakteren Darstellung im Kollaborationsdiagramm.6-9: Objektdiagramm der Fallstudie »Kundenverwaltung« 2.

Beispiel Fallstudie »Kundenständig dargestellt. unterschiedliche Aspekte darzustellen. 2. public class KundeGUI extends Applet { ersterKunde: Kunde zweiterKunde: Kunde Fuehrungstext: Label Textbereich: TextArea KundeGUI() init() start() stop() Klasse KundeGUI 131 . 2.6-13 wird die Klasse KundeGUI in UML-Notation voll. so daß sie nur in Sonderfällen zur Veranschaulichung herangezogen wird.6-12: Sequenzdiagramm der Fallstudie »Kundenverwaltung« start() Kunde("KFZ . verwaltung« Die zugehörige Java-Klasse sieht folgendermaßen aus: Abb. 2. 2.4 Senden von Botschaften und Ausführen von Operationen Nach dem Erzeugen von Objekten werden durch das Senden von Botschaften und das Ausführen von Operationen die eigentlichen Aufgaben erledigt.4 Senden von Botschaften und Ausführen von Operationen WebBrowser KundeGUI() :KundeGUI LE 4 Abb.6-12 wird zunächst vereinfacht davon ausgegangen.*.6.awt. Eine solche Darstellung wird aber schnell unübersichtlich.6. Ähnlich wie beim Kollaborationsdiagramm wird auch hier der Objekterzeugungsvorgang verkürzt dargestellt. 2. In der Abb.") ersterKunde :Kunde Kunde("Tankbau KG") zweiterKunde :Kunde verwaltung«.2.*.6-13: Die KundeGUI /*Programmname: Kundenverwaltung1 * GUI-Klasse: KundeGUI (Java-applet) */ import java. daß der WebBrowser das Objekt :KundeGUI erzeugt. import java. In der Abb. Die verschiedenen Diagrammarten gestatten es also..applet. Die genaueste Darstellungsform ist sicher die Skizzierung der Abläufe im Arbeitsspeicher..

0.setFont(new Font("Dialog". Fuehrungstext.LE 4 2. //}} //Operationen public void init() { //Erzeugen der Interaktionselemente und //Zuordnung von Attributwerten //{{INIT_CONTROLS setLayout(null). 12").SCROLLBARS_VERTICAL_ONLY). 132 .getFirmenname().0. Fuehrungstext = new Label("Kundenverwaltung"). zweiterKunde.6 Dann die Praxis: Objekte und Klassen in Java //Attribute //Deklarieren von zwei Kundenobjekten private Kunde ersterKunde.60. int MerkeZahl.270). MerkeText = ersterKunde. 12)). //Anzeigen der Attributinhalte im Textbereich MerkeText = ersterKunde.getAuftragssumme(). Suedstr.24. add(Textbereich). //}} } public void start() { //Attribute zum Merken der Ergebnissse der Botschaften String MerkeText.aendernAdresse("Tankbau & Partner KG". Textbereich.168. //Adresse eintragen ersterKunde. Fuehrungstext. Textbereich.BOLD. //Mit "\n" wird auf eine neue Zeile gewechselt Textbereich. "44867 Bochum.156). add(Fuehrungstext). //Auftragssumme eintragen ersterKunde. Textbereich = new TextArea("". Textbereich.append(MerkeText). //Erzeugen von 2 Objekten durch Aufruf des Konstruktors ersterKunde = new Kunde("KFZ-Zubehoer GmbH"). TextArea Textbereich.setForeground(new Color(0)).setAuftragssumme(15000). setSize(430.28). Poststr. //Mit append wird der Text an den vorhandenen Text //angehängt Textbereich.setFirmenadresse("44137 Dortmund.360.TextArea.setBounds(36. zweiterKunde = new Kunde("Tankbau KG"). 23").setBounds(36. MerkeZahl = ersterKunde. //Umwandlung einer ganzen Zahl in eine Zeichenkette MerkeText = String.valueOf(MerkeZahl). //Deklarieren der Interaktionselemente Führungstext und Textbereich //{{DECLARE_CONTROLS Label Fuehrungstext.getFirmenadresse(). Font.append("\n").append(MerkeText+"\n"). //Adresse ändern zweiterKunde.

6-14: Ausgabe des JavaProgramms »Kundenverwaltung« Die Klasse KundeGUI besteht im wesentlichen aus den beiden Operationen init() und start().6-14. } public void stop() { Textbereich. In der Operation start() erfolgt die Kommunikation zwischen der Benutzungsoberfläche und der Fachkonzept-Klasse. einem Punkt und an. //Anzeigen der Attributinhalte -. Eine Botschaft setzt sich zusammen aus dem Namen des Objekts.append(zweiterKunde. Textbereich.6-14 zeigt. wie sie die Abb. 2.getAuftragssumme(). Botschaft an das die Botschaft gesandt werden soll.2. 2. Abb.append(zweiterKunde.Operation schließend dem Namen der Operation. 2. 133 . In Klammern können dann noch Parameterwerte an die Operation übergeben werden. } } LE 4 Die Ausführung des Java-Programms »Kundenverwaltung« mit den Klassen KundeGUI und Kunde führt zu der Ausgabe der Abb. In einem solchen Fall fügt der Compiler automatisch den Standardkonstruktor KundeGUI() {} der Klasse hinzu.append("Auftragssumme: " + MerkeText+"\n"). die ausgeführt werden soll.6.getFirmenname()+"\n"). aufgebaut.getFirmenadresse() +"\n"). MerkeZahl = zweiterKunde. In der Operation init() wird die Benutzungsoberfläche.Kurzform Textbereich. Textbereich.append("Stop"+"\n"). Der Konstruktor fehlt.Objekt.valueOf(MerkeZahl). //Umwandlung einer ganzen Zahl in eine Zeichenkette MerkeText = String.append(MerkeText+"\n"+"\n").4 Senden von Botschaften und Ausführen von Operationen Textbereich.

u. 2. 168. 270) Fuehrungstext :Label Label (”Kundenverwaltung”) setBounds (36. eine eigene Operation aufruft. Neben Botschaften an die Ob- Abb. 28) setFont (. 360.. angegeben. Sie besteht aus einem Führungstext (label) und einem mehrzeiligen Textbereich (text area). Der Objektname und der Punkt entfallen. In der init-Operation von KundeGUI wird die Benutzungsoberfläche aufgebaut.9 Botschaft an sich selbst 2. mit Textbereich ein Referenz-Attribut der Klasse TextArea. d.. Es ist auch möglich.6 Dann die Praxis: Objekte und Klassen in Java Auf die Parameterübergabe wird im Detail in Kapitel 2. Mit Führungstext wird ein Referenz-Attribut der Klasse Label deklariert. Label und TextArea sind von Java zur Verfügung gestellte Klassen. 156) setForeground (new Color(0)) add (Textfeld) 134 .U. In einem solchen Fall wird nur der Operationsname. daß ein Objekt eine Botschaft an sich selbst sendet. mit Parametern.h.9 eingegangen. 24.LE 4 Kapitel 2.) setBounds (36..6-15: Sequenzdiagramm der Operation init() :KundeGUI WebBrowser init() set Layout (null) Botschaft an sich selbst setSize (430..) add (Fuehrungstext) Textbereich :TextArea TextArea (. 60.

WebBrowser :KundeGUI start() Textbereich :TextArea ersterKunde :Kunde zweiterKunde :Kunde Abb. z.6 eingegangen. 2. Diese Operationen werden der Klasse KundeGUI durch die Klasse Applet zur Verfügung gestellt. Auf die Operation stop() wird in Abschnitt 2. 2. Man sieht.B. daß das Objekt KundeGUI die Kommunikation zwischen den Fachkonzept-Objekten und dem GUI-Objekt Textfeld durchführt. 135 . Den Ablauf der Anweisungen in der init-Operation zeigt Abb. Analog sehen die Abläufe beim Ausführen der Operation start() aus (Abb.6-16). setLayout(null).6-16: Sequenzdiagramm der Operation start() setAdresse("Dortmund") aendernAdresse("Tankbau & Partner") getAuftragssumme(15000) getFirmenname() append(MerkeText) append("\n") getFirmenadresse() append (MerkeText + "\n") getAuftragssumme() append (MerkeText + "\n" + "\n") get Firmenname() usw.4 Senden von Botschaften und Ausführen von Operationen LE 4 jekte Führungstext und Textbereich werden auch Botschaften an sich selbst gesendet.6.6-15. 2.6.2.

java.h.zeichneObjekt(einObjekt.zeichneObjekt: //Konstruktor public Kunde(String einObjekt. 2.java ist in den Ordner zu kopieren.this. in dem das zu visualisierende Programm steht.. sich vorzustellen. die es ermöglicht bei eigenen Programmen ein angenähertes Sequenzdiagramm automatisch in einem separaten Fenster anzuzeigen.Erzeuger.6 Visualisierung von Objekten Erfahrungsgemäß hat man am Anfang Schwierigkeiten.5 Löschen von Objekten In Java muß sich der Programmierer nicht um das Löschen von Objekten kümmern.LE 4 2. immer wenn ein neues Objekt erzeugt werden soll.init().6. 2 Jede Klasse. 5 Im applet viewer wird dann ein zusätzliches Fenster mit den Objektvisualisierungen angezeigt (Abb. Folgende Schritte sind durchzuführen.this). Die JavaVM prüft.6-17). muß im Konstruktor folgendermaßen modifiziert werden: Der Konstruktor erhält zwei zusätzliche Parameter und einen Aufruf Visusalisierung. auf die keine Referenz mehr zeigt. Daher befindet sich auf der CD-ROM eine Datei Visualisierung. wann und in welcher Reihenfolge Objekte erzeugt werden. 4 Bei jedem Konstruktoraufruf. d. Alle diese Objekte werden automatisch gelöscht. 2.this. um die Visualisierung vorzunehmen: 1 Die Datei Visualisierung. Object Erzeuger."Tankbau KG"). In unregelmäßigen Abständen findet automatisch eine Speicherbereinigung (garbage collection) statt. deren Objekte visualisiert werden sollen." und der Name this: //Erzeugen von zwei Objekten durch Aufruf des Konstruktors ersterKunde = new Kunde("ersterKunde".6. 136 .6 Dann die Praxis: Objekte und Klassen in Java 2. werden beim Konstruktor zwei zusätzliche Parameter angegeben: Der Name des Referenz-Attributs in "."KFZ-Zubehoer GmbH"). zweiterKunde = new Kunde("zweiterKunde". Visualisierung. ob es im Haldenspeicher Objekte gibt. } 3 In der GUI-Klasse muß die Visualisierung in der init()-Operation initialisiert werden durch: Visualisierung. String Name) { Firmenname = Name.

die diese Operation benötigt. Sind keine Parameter angegeben. Kollaborationsdiagramm (collaboration diagram) Erweiterung des →Objektdiagramms um Botschaften. Exemplar →Objekt. Methode →Operation. heap →Halde. Instanz →Objekt.6-17: Objektvisualisierung des Programms Kundenverwaltung1 (Abb. 2. Durch eine hierarchische Numerierung.6-14) Attribut Beschreibt. Der Konstruktorname entspricht dem Klassennamen gefolgt von einer Parameterliste in runden Klammern. in dem →Objekte und →Klassen gespeichert werden (siehe auch →Speicherbereinigung). Halde (heap) Besonderer Speicherbereich im Arbeitsspeicher. Botschaft Aufforderung eines Senders (→Klasse oder →Objekt). Ist nicht veränderbar. →Operationen und Beziehungen zwischen Klassen in grafischer Form dar (→UML). Von einer Klasse können Objekte (Instanzen. Geheimnisprinzip Auf die →Attributwerte eines →Objekts kann nur über die →Operationen des Objekts zugegriffen werden. Objekt Ausprägung physikalischer Komponenten oder abstrakter Sachverhalte. →Attribute. auch wenn ihre →Attributwerte identisch sind. Klassendiagramm (class diagram) Stellt die objektorientierten Konzepte →Klasse. OO objektorientiert (→objektorientierte Programmierung). Objekt-Identität Eigenschaft. die gleiche oder ähnliche Strukturen und Verhaltensmuster aufweisen. Vererbung. Konstruktor spezielle →Operation zum Erzeugen von →Objekten. Erlaubt eine Momentaufnahme eines laufenden Programms (→UML). Objektorientierte Programmierung Anwendung der Konzepte →Klasse. garbage collection →Speicherbereinigung. Kommuniziert nicht direkt mit der Benutzungsoberfläche (→GUI-Klasse). Klasse Beschreibt in Form einer Schablone eine Kategorie von →Objekten. die Angabe des Operationsnamens und der Botschaftsrichtung durch einen Pfeil sind Ablaufsequenzen darstellbar (→UML). Besteht aus dem Namen der Operation und den Argumenten. 137 . Objektdiagramm (object diagram) Grafische Darstellung von →Objekten und ihren Verbindungen (links). die individuell sind und durch Eigenschaften und Verhalten beschrieben werden. die ein →Objekt von allen anderen unterscheidet. Fachkonzept-Klasse Realisiert die fachlichen Anforderungen an ein Programm. Polymorphismus und dynamisches Binden bei der Programmierung. Parameter dienen zum Initialisieren von Attributwerten. Exemplare) erzeugt werden. Attributwert Aktuell einem →Attribut zugeordneter Wert aus seinem Wertebereich. →Operation. eine Dienstleistung durch Ausführung einer →Operation zu erbringen. welche Daten die →Objekte der →Klasse enthalten. Für andere Klassen und Objekte sind die Attribute und Attributwerte einer Klasse oder eines Objekts unsichtbar.Glossar LE 4 Abb. OOP →objektorientierte Programmierung. →Botschaft. GUI-Klasse Bindeglied zwischen der Benutzungsoberfläche und der →Fachkonzept-Klasse. dann wird ein Objekt erzeugt und die Attribute des Objekts werden mit Standardwerten vorbelegt. →Objekt. →Attribut. 2.

Operationen kommunizieren mit der Umwelt über Ein-/Ausgabeparameter. darunter auch die von Java. s Sequenzdiagramme. Zur grafischen Darstellung gehören →Klassendiagramme. Attributwerte sind die aktuellen Werte. die es seiner Umwelt oder sich selbst zur Verfügung stellt. Durch das Geheimnisprinzip kann auf Attributwerte nur über Operationen zugegriffen werden. In ihr sind unter anderem folgende Diagrammarten definiert: s Klassendiagramme. 3 Operationen (auch Methoden genannt) beschreiben das Verhalten eines Objekts. zeitbasierte Darstellung mit vertikaler Zeitachse von →Botschaften zwischen →Objekten und →Klassen. Sequenzdiagramm (sequence diagram) Grafische. Pflichtenheft Legt Anforderungen an ein Software-System in verbaler. von denen folgende fünf Konzepte behandelt wurden: 1 Ein Objekt (auch Exemplar oder Instanz genannt) ist ein individuelles Exemplar von Dingen. →Objektdiagramme. Objekte werden durch Konstruktoren erzeugt und im Arbeitsspeicher auf der sogenannten Halde (heap) gespeichert. 5 Durch Botschaften kommunizieren Objekte und Klassen untereinander. umgangssprachlicher Form fest. die Dienstleistungen. Objekte und Klassen durch gestrichelte. s Objektdiagramme (als Teil der Klassendiagramme). 138 . Konzepte Die objektorientierte Programmierung (OOP) basiert auf einer Reihe von Grundkonzepten. Speicherbereinigung (garbage collection) Die Laufzeitumgebung einiger Programmiersprachen.h.LE 4 Glossar/Zusammenhänge Operation Ausführbare Tätigkeit im Sinne einer Funktion bzw. löschen automatisch alle Objekte. Personen oder Begriffen. wenn keine Referenz mehr auf sie vorhanden ist. 4 Klassen fassen Objekte mit gleichen Attributen und Operationen zu einer Einheit zusammen. Als grafische Notation wird die UML verwendet. In Java werden Objekte automatisch durch eine Speicherbereinigung (garbage collection) gelöscht. →Kollaborationsdiagramme und →Sequenzdiagramme. In der objektorientierten Software-Entwicklung (OO) werden verschiedene Diagrammarten benutzt. UML (Unified Modeling Language) Notation zur grafischen Darstellung objektorientierter Konzepte (→objektorientierte Programmierung). eines Algorithmus. 2 Attribute beschreiben die Eigenschaften eines Objekts. Botschaften werden durch horizontale Linien. vertikale Linien repräsentiert (→UML). die die Attribute besitzen. beschreibt das Verhalten eines →Objekts bzw. In der Regel wird die →Halde einer automatischen Speicherbereinigung unterzogen. um unterschiedliche Aspekte darzustellen. d. d. Es besitzt eine Objekt-Identität. s Kollaborationsdiagramme. auf die keine Referenzen mehr zeigen. einer →Klasse.h.

. sind die Anforderungen an ein Programm in einem Pflichtenheft festzulegen... Santa Clara: Rational Software Corporation.. s Wird durch eine Operation ein einzelnes Attribut gelesen.Zusammenhänge/Literatur LE 4 Vorgehensweise Bevor mit der Programmierung begonnen wird. Object-Oriented Software Engineering – A Use Case Driven Approach. werden erst anschließend festgelegt und beschrieben. Ausgehend von der UML-Darstellung der Klassen erfolgt die Umsetzung in ein Java-Programm (Abb. /Gosling. Joy. Heidelberg: Spektrum Akademischer Verlag 1999 /Jacobson et al.1. 2.. plus jeweiligem Klassenname benannt werden. Bonn: AddisonWesley-Verlag 1997 /Heide Balzert 99/ Balzert Heide. die die fachlichen Anforderungen beschreiben. die die Verbindung zum Benutzer herstellen. wobei zunächst nur die Fachkonzept-Klassen modelliert werden.h... 92/ Jacobson I. Im Pflichtenheft sind die Anforderungen in folgender Form durchzunumerieren. die Klassen. erster. Java – die Sprachspezifikation. Version 1. Zur Klarstellung von Zusammenhängen können auch weitere Diagrammarten verwendet werden. Folgende Konventionen und Empfehlungen sollten beachtet werden: s Attribute immer als private deklarieren (»Privatbesitz« der Objekte der jeweiligen Klasse. Steele 97/ Gosling J. s Nicht näher beschriebene Objekte einer Klasse sollten mit ein. /1/ Anforderung 1 /2/ Anforderung 2 . Joy B. Jonsson P. dann sollte die Operation getAttributname lauten. GUI-Klassen. Lehrbuch der Objektmodellierung – Analyse und Entwurf. Wokingham: Addison Wesley 1992 /UML 97/ Unified Modeling Language. Steele G. s Jede Klasse sollte in Java in einer eigenen Datei (. d. Övergaard G..6-3). dann sollte die Operation setAttributname lauten. November 1997 Pflichtenheft Klassendiagramm FachkonzeptKlassen GUI-Klassen Konventionen und Empfehlungen 139 . Geheimnisprinzip). a usw. Christerson M.java ) gespeichert werden. s GUI-Klassen sollten das Klassen-Suffix GUI besitzen. /n/ Anforderung n Anhand der Anforderungen ist ein Klassen-Diagramm in UML-Notation zu erstellen. s Wird durch eine Operation ein einzelnes Attribut gesetzt.

Wie läßt sich das Programm verbessern? public class Taschenrechner { public void init() { TextField einEingabefeld. } public float berechneErgebnis(String Eingabe) { // .. bevor Sie die folgenden analytischen und konstruktiven Aufgaben bearbeiten.LE 4 Aufgaben Alle Wissens. private String A2. Betrachten Sie den folgenden Ausschnitt aus einem Java-Programm. return ergebnis.und Verstehens-Aufgaben befinden sich auf der beigefügten CD-ROM 1. Diese Aufgaben sollten Sie zunächst zufriedenstellend lösen. // . } public int getA1() { return A1. Anhand von Beispielen die dynamischen Abläufe beim Versenden von Botschaften an Objekte zeichnen – insbesondere durch Darstellung des Arbeitsspeichers und als UML-Diagramme – und erläutern können. } } Muß-Aufgabe 30 Minuten 2 Lernziele: Anhand von Beispielen die dynamischen Abläufe bei der Erzeugung und Referenzierung von Objekten zeichnen – insbesondere durch Darstellung des Arbeitsspeichers und als UML-Diagramme – und erläutern können. Nehmen Sie diese Beispiele als Ausgangspunkt für die folgenden Programmieraufgaben. Gegeben sei folgendes Java-Programm: public class KlasseA { private int A1 = 0. public KlasseA(String eineKette) { A2 = eineKette. Außerdem sollten Sie sich alle Programmierbeispiele dieser Lehreinheit von der CD-ROM 1 in Ihre Programmierumgebung kopieren. Sie sollen nicht alles Neu machen.... sondern Vorhandenes modifizieren und erweitern (learning by analogy). } } 140 . Sie sollten alle Programme übersetzen und ausführen. Analytische Aufgaben Muß-Aufgabe 5 Minuten 1 Lernziel: Das Entwurfsprinzip »Trennung GUI – Fachkonzept« erklären können.

so daß dieses Programm übersetzt werden kann: /*Programmname: Kundenverwaltung2 * Fachkonzept-Klasse: Kunde */ class Kunde { //Attribute public String Firmenname = Firmenadresse. c Stellen Sie den Arbeitsspeicher (analog zu Abb.Aufgaben public class KlasseB { public void start(String arg) { KlasseA erstesA. } Klausur-Aufgabe 30 Minuten 141 . } public void setzeFirmenadresse (String Adresse) { Firmenadresse = Adresse. 3 Lernziel: Vorgegebene Java-Programme auf die Einhaltung der behandelten Syntax prüfen können. b Erklären Sie anhand des Klassendiagramms die dynamischen Vorgänge bei der Ausführung des Programms.getA1(). } } LE 4 a Zeichnen Sie für das gegebene Programm ein Klassendiagramm in UML-Notation. Zahl = erstesA. String Adresse) { Firmenname = Name Firmenadresse = Adresse } //Schreibende Operationen public void setzeFirmenname (String Name) { Firmenname = Name. public int Auftragssumme = 0. unter der Voraussetzung. //Konstruktor public void Kunde(String Name) { Firmenname = Name. } //Kombinierte Schreiboperation public void setAendernAdresse (String Name. daß zunächst start() eines Objektes der KlasseB aufgerufen wird. erstesA = new KlasseA("Test"). return Name. 2.6-7) während der Ausführung des Programms dar. Markieren und verbessern Sie die Syntaxfehler im vorgegebenen Quellcode. int Zahl.

Sequenzdiagramm) auswählen und zeichnen können. damit sich Dritte Ihre Lösung ansehen können. 5 Lernziel: Für gegebene Beispiele geeignete Diagramme in UML-Notation (Klassen-. } } b Überarbeiten Sie den Quellcode unter Beachtung der beschriebenen Konventionen und Empfehlungen. so daß lauffähige JavaProgramme entstehen. Objekt-. Kollaborations-. a Fügen Sie in die Klasse Kunde des Kundenverwaltungsprogramms ein Attribut Ansprechpartner mit den zugehörigen Zugriffsoperationen ein. übersetzen Sie das Programm und führen Sie es aus. Wandeln Sie folgende UML-Klasse in eine Java-Klasse um (ohne Zugriffsoperationen auf die Attribute zu formulieren): Konto Inhaber: String Typ: String Zugang: String Guthaben: float PIN: String setKonto(String Name. String Zugangsweg) pruefeZugang(): int pruefeKreditlinie(float Kredit): int Muß-Aufgabe 10 Minuten 142 . } //Lesende Operationen public String gibFirmenname() { return Firmenname. c Ergänzen Sie neben der Fachkonzept-Klasse auch die GUI-Klasse entsprechend.LE 4 Aufgaben public void setzeAuftragssumme(int Summe) { Auftragssumme = Summe. Setzen Sie auf derselben Seite für jede Quelldatei des Projekts einen hyperlink. d Integrieren Sie das modifizierte Applet in eine von ihrer Homepage erreichbare HTML-Seite. } public string gibFirmenadresse() { } public void holeAuftragssumme() { return Auftragssumme. bei dem der Firmenname und die Firmenadresse angegeben werden können. Konstruktive Aufgaben Muß-Aufgabe 30 Minuten 4 Lernziel: Das behandelte Programm »Kundenverwaltung« auf analoge Aufgaben übertragen und modifizieren können. String Kontotyp. b Ergänzen Sie die Klasse Kunde um einen weiteren Konstruktor.

die Programmiersprache mit »Java«. Verwenden Sie bei der Ausgabe der Artikel in einen Textbereich den Befehl "\t". die drei Artikel anlegt und diese dann anzeigt. b Zeichnen Sie die in der Tabelle angegebenen Artikel als Objekte in ein Objektdiagramm ein. um innerhalb einer Zeile einen Tabulator-Sprung vorzunehmen. b Zeichnen Sie ein Objektdiagramm. das die im Pflichtenheft gemachten Angaben in Form einer Fachkonzept-Klasse modelliert. Kollaborations-. Diese beiden Werte können schon bei der Erzeugung eines Kontos übergeben werden. die zu dem unter b spezifizierten Endzustand führen (Anlegen neuer Objekte usw. Dafür soll eine Artikelverwaltung programmiert werden. /4/ Ein neuer Artikel kann nur angelegt werden.-Preis 29. /3/ Die Kurzbeschreibung. d Ergänzen Sie das Klassendiagramm um eine GUI-Klasse. Bei Attributen ist immer ein passender Typ.90 54. Die Anforderungen an das Programm sind in folgendem Pflichtenheft zusammengestellt: /1/ Artikelnummer. Programme im Markt anzubieten. die Programmiersprache und der Verkaufspreis müssen einzeln gespeichert werden können. bei dem ein Kunde Norbert Meier über ein Konto mit der Nummer 0815 und einem Guthaben von 2000 DM verfügt. /3/ Zu einem Konto werden Kontonummer und Kontostand verwaltet.Aufgaben 6 Lernziel: Für gegebene Beispiele geeignete Diagramme in UML-Notation (Klassen-. Übersetzen Sie das Programm und führen Sie es aus. Dadurch kann jeder Artikel in einer Zeile ausgegeben werden. 143 . eventuell mit Voreinstellung. e Transformieren Sie die UML-GUI-Klasse in eine Java-applet-GUI-Klasse und ergänzen Sie die Operationsrümpfe entsprechend. c Transformieren Sie das Klassendiagramm in eine Java-Fachkonzeptklasse und ergänzen Sie die Operationsrümpfe entsprechend. Die Firma ProfiSoft entschließt sich. Verwenden Sie die UML-Notation. /2/ Alle Daten müssen einzeln gelesen werden können. wenn Artikelnummer und Artikelbezeichnung bekannt sind. c Zeichnen Sie ein Kollaborationsdiagramm und ein Sequenzdiagramm.50 LE 4 Muß-Aufgabe 40 Minuten Muß-Aufgabe 60 Minuten a Entwerfen Sie ein Klassendiagramm in UML-Notation. /2/ Zu einem Kunden wird sein Name verwaltet. außerdem kann ein Konto über die Operation »anlegen Konto« angelegt werden. 7 Lernziel: Aus einem Pflichtenheft ein Klassendiagramm in UML-Notation erstellen und dieses Diagramm anschließend in ein Java-Programm transformieren und um Operationsanweisungen ergänzen können. Sequenzdiagramm) auswählen und zeichnen können. eine Kurzbeschreibung und der Verkaufspreis eines jeden Artikels sollen gespeichert werden.90 99.). a Modellieren Sie folgenden Sachverhalt in einem Klassendiagramm: /1/ Es sollen Kunden verwaltet werden. Objekt-. Bis heute werden die Artikel »von Hand« in einer Tabelle erfaßt: Artikelnr Bezeichnung 4711 4712 8726 Diashow Bildbeschriftung 100 Piktos Sprache Beschreibung Java Java Java Erlaubt Dia-Show auf HTML-Seite Erlaubt Beschriftung von Bildern 100 Piktogramme für HTML-Seite Verk. Artikelbezeichnung. anzugeben. /5/ Der Verkaufspreis ist mit 0 vorbelegt. die verwendete Programmiersprache.

eventuell mit Voreinstellung. das die Abläufe darstellt. 3-stellig. wenn folgende Daten vorliegen: Startnummer. /4/ Die Rasse ist mit QH (Quarterhorse) vorbelegt. Geburtsjahr des Pferdes. Name des Reiters. 144 . Das vom Auftraggeber vorgegebene Pflichtenheft sieht folgendermaßen aus: /1/ Für jede Nennung zu einem Turnier sind folgende Daten zu speichern: Startnummer. Die Firma ProfiSoft erhält den Auftrag. d Transformieren Sie die UML-GUI-Klasse in eine Java-applet-GUI-Klasse und ergänzen Sie die Operationsrümpfe entsprechend. 121). Klausur-Aufgabe 45 Minuten 8 Lernziel: Aus einem Pflichtenheft ein Klassendiagramm in UML-Notation erstellen und dieses Diagramm anschließend in ein Java-Programm transformieren und um Operationsanweisungen ergänzen können. z. Rasse. die eine Nennung anlegt und anzeigt. ein Programm zur Verwaltung von Western-Reitturnieren zu entwickeln. Geburtsjahr des Pferdes. damit sich Dritte Ihre Lösung ansehen können.und Sequenzdiagramm. Setzen Sie auf derselben Seite für jede Quelldatei des Projekts einen hyperlink. Geschlecht des Pferdes. Bei Attributen ist immer ein passender Typ. g Integrieren Sie das erstellte applet in eine von ihrer Homepage erreichbaren HTML-Seite. b Transformieren Sie das Klassendiagramm in eine Java-Fachkonzeptklasse und ergänzen Sie die Operationsrümpfe entsprechend. anzugeben. Turnierdisziplin. H = Hengst. /2/ Eine Nennung kann nur erfolgen. Name des Reiters und Name des Pferdes. e Zeichnen Sie ein Sequenzdiagramm. W = Wallach). auf folgende Daten zusätzlich schreibend zugegriffen werden können: Rasse. Geschlecht des Pferdes (1 Buchstabe. das die im Pflichtenheft gemachten Angaben in Form von einer Fachkonzept-Klasse modelliert. das die Abläufe darstellt. S = Stute. Name des Pferdes.B. Verwenden Sie die UML-Notation. Turnierdisziplin (ganze Zahl. c Ergänzen Sie das Klassendiagramm um eine GUI-Klasse. a Entwerfen Sie ein Klassendiagramm in UML-Notation. /3/ Auf alle Daten muß lesend.LE 4 Aufgaben f Zeichnen Sie ein Kollaborations.

Die Konzepte Klassenattribut – Objektattribut und Klassenoperation – Objektoperation unterscheiden können.5 müssen bekannt sein. CASE-Werkzeuge zur Darstellung der UML-Notation einsetzen können. Vorgegebene Java-Programme auf die Einhaltung der behandelten Syntax prüfen können. In Java-Programmen die Konzepte Klassenattribute und -operationen problemgerecht einsetzen können. Assoziationen mit der maximalen Kardinalität 1 in Java programmieren können. 145 . verstehen anwenden s Die Abschnitte 2.1 bis 2. Eigene Programme gut dokumentieren und verbalisieren können. so daß lauffähige Java-applets und Java-Anwendungen entstehen.LE 5 2 Grundlagen der Programmierung – Objekte und Klassen (Teil 2) s s s s s s s s s s s s s s s s Aufbau und Start eines Java-applets und einer Java-Anwendung darstellen können. Dynamische Abläufe durch Sequenz. Java-applets wie die »Kundenverwaltung« in analoge Java-Anwendungen transformieren können.2. Die behandelten Programme auf analoge Aufgaben übertragen und modifizieren können. Aus einem Pflichtenheft ein Klassendiagramm in UML-Notation erstellen und dieses Diagramm anschließend in ein Java-Programm transformieren und um Operationsanweisungen ergänzen können.und Kollaborationsdiagramme sowie durch Arbeitsspeicherdarstellungen veranschaulichen können. Die Prinzipen »Integrierte Dokumentation« und »Verbalisierung« erklären und ihre praktische Umsetzung darstellen können. Die problemgerechten Kardinalitäten identifizieren und in der UML-Notation beschreiben können. Die Eigenschaften und Einsatzbereiche von Assoziationen und ihre Realisierung in Java erklären können. in welchen Situationen und warum Klassenattribute und Klassenoperationen verwendet werden.6. Die Richtlinien und Konventionen für Bezeichner und die Formatierung beim Schreiben von Programmen einhalten können. Erklären können.

nachdem die Klassendatei geladen und ein Objekt der von Applet abgeleiteten Klasse erzeugt wurde.6.6.6 Dann die Praxis: Objekte und Klassen in Java 2. Verbalisierung. Die Klasse KundeGUI verfügt dadurch auch über die Operationen der Klasse Applet.8. 2. Das Starten eines applets wird dadurch erreicht.2 2.1 2. Zusätzlich können interaktive Animationen durchgeführt werden.6.7 2.8 2. ein applet viewer ein Objekt von der Klasse erzeugt.8. hier: KundeGUI.7.1 2.6-17: Die Klasse Applet und ihre wichtigsten Operationen init() Die Klasse KundeGUI wurde als applet programmiert. die multimedial präsentiert wird. Ein applet wird immer von der Klasse Applet abgeleitet.8.6. Parallel zu dieser Fallstudie wird auf der beigefügten CD-ROM eine analoge Fallstudie »Seminarorganisation« entwickelt.6-17). die eine Reihe von Operationen zur Verfügung stellt (Abb.6. 2. 2. hier: class KundeGUI extends Applet.8 2. daß der WebBrowser bzw.LE 5 2. 146 . Im Beispiel KundeGUI wird in init() die Benutzungsoberfläche aufgebaut und initialisiert. Bilder oder Schriften geladen oder Parameter ausgewertet werden.B.3 2. 2.7 2.4 Hinweis Dann die Praxis: Objekte und Klassen in Java 146 Aufbau und Start eines applets 146 Klassenattribute 148 Klassenoperationen 149 Aufbau und Start einer Java-Anwendung 151 Assoziationen und Kardinalitäten 154 Zuerst die Theorie: Assoziationen und ihre Kardinalitäten 154 Dann die Praxis: Assoziationen in Java 157 Zur Software-Technik: Integrierte Dokumentation.7 Aufbau und Start eines applets Applet Applet() init() start() stop() destroy() Abb.7. CASE 163 Prinzip der integrierten Dokumentation 164 Prinzip der Verbalisierung 166 Schreibtischtest und debugging 170 Einsatz eines CASE-Werkzeugs 172 In den folgenden Kapiteln wird eine Fallstudie »Kundenverwaltung« vorgestellt und erläutert.6 2.6-18.10 2. die von der Klasse Applet abgeleitet wurde. Eine detaillierte Darstellung des Startvorgangs zeigt Abb. Innerhalb von init() können z. Anschließend ruft der Browser die Operation init() auf.2 2.9 2. Java stellt für die Programmierung eines applets die Klasse Applet zur Verfügung.8.6 Dann die Praxis: Objekte und Klassen in Java 2. Objektattribute initialisiert. Schreibtischtest. s init() wird während der Lebensdauer eines applets genau einmal aufgerufen.

um die eigentliche Ausführung des applets zu eines Javastarten.class”) 3 KundeGUI 5 Kunde 6 Verifizierer 7a :KundeGUI init() 7b start() 7c Ist die Initialisierung abgeschlossen. der die Bytecodes auf strukturelle Korrektheit überprüft.B.2. dann wird das applet nicht komplett zerstört. Beim erneuten Aufruf der Seite wird es dann durch Aufruf der Operation start() erneut gestartet. die Deklaration Kunde ersterKunde. ob der Code Referenzen auf andere Klassen enthält. 3 Die Java-VM aktiviert mit der Botschaft loadClass("KundeGUI. 7 Nachdem alle Klassen geladen und geprüft sind. Der Browser ruft für dieses Objekt die Operation init() und nach deren Abarbeitung start() auf. In einem applet viewer gibt es dafür start() die Menüoption Starten. 4 Der Klassenlader lädt die angegebene Klasse in die Halde des Arbeitsspeichers.class).6-18: Start tion start() auf. erzeugt die VM ein Objekt der Klasse. daß das stop() applet gestoppt wird. dann wird auch die Klasse Kunde geladen usw. die noch zu laden sind. Enthält die Klasse KundeGUI z.class (Achtung: Name der übersetzten Klasse. sondern lediglich gestoppt. Lädt der Browser eine andere Web-Seite. ob die Datei während des Ladens oder des Transports über das Netz beschädigt wurde. z. Endung . Während der Lebensdauer eines applets können die Operationen start() und stop() also mehrfach aufgerufen werden. der für das Laden von Klassen von der Festplatte oder über das Netz in den Arbeitsspeicher zuständig ist. KundeGUI. WebBrowser 1 <APPLET CODE> ”KundeGUI.B. 2 Der Web-Browser startet die in den Browser integrierte Java-VM (virtual machine) und übergibt ihr den Namen der im APPLET CODE angegebenen Klasse. 6 Nach dem Laden wird der Verifizierer (verifier) aktiviert. 5 Der Klassenlader prüft. wenn eine andere Web-Seite geladen wird. die von der Applet-Klasse abgeleitet ist. s Durch Aufruf der Operation stop() bewirkt der Browser. Im Gegensatz zur Initialisierung kann das Starten eines applets applets mehrfach erfolgen.6.Abb. s 147 . ruft der Browser die Opera.class” Java-VM Klassenlader 4 2 loadClass (”KundeGUI. z. 2.B.class") den sogenannten Klassenlader (class loader). Dies geschieht immer dann.7 Aufbau und Start eines applets LE 5 Beim Start eines Java-applets laufen folgende Vorgänge ab: 1 Der Web-Browser findet im HTML-Code einen HTML-Befehl: APPLET CODE.

9. in denen es sinnvoll ist.7. Ist dies der Fall.6 Dann die Praxis: Objekte und Klassen in Java destroy() Wenn ein applet nicht mehr benötigt wird. weil z. dann spricht man von Klassenattributen und Klassenoperationen. Deshalb spricht man genau genommen auch von Objektattributen und Objektoperationen. 2.0 1.7.1993 2.3 1.B.3 148 .6-19 zeigt den Lebenszyklus eines applets. Klassen eigene Attribute und Operationen zuzuordnen.1974 :Student 7001234 Helga Weiß 7.6. In Abb. Name Geburtsdatum Datum Vordiplom Immatrikulation Noten Anzahl 2 :Student 7002345 Hans Meyer 4. 2. 2.6-20: Klassenattribute Student Matrikel-Nr. Abb.8 Klassenattribute Attribute und Operationen legen die Eigenschaften und das Verhalten von Objekten fest. Ein Klassenattribut beschreibt die Eigenschaften einer Klasse. Es gibt jedoch eine Reihe von Situationen. dann ruft der Browser die Operation destroy() auf.LE 5 2.6-19: Lebenszyklus eines applets 2.1971 15.6-20 hat die Klasse Student zwei ObjekAbb. s Browser erzeugt applet-Objekt applet existiert Browser ruft init() applet initialisiert Browser ruft start() applet gestartet Browser ruft start() Browser wechselt Web-Seite oder applet wird als Piktogramm dargestellt (stop()) applet gestoppt Browser wird beendet oder Seite wird gelöscht (destroy()) applet existiert nicht mehr Browser kehrt zur Web-Seite zurück oder applet wird nicht mehr als Piktogramm dargestellt Abb. während Attribute üblicherweise Eigenschaften eines einzelnen Objekts beschreiben.7 2. 2. der Browser beendet wird.

Anzahl Klassenattribute werden in Java Java immatrikulieren durch das Schlüsselwort static geerstellen Studienbescheinigung eintragen Note kennzeichnet. eine Klasse ist vor ihren Objektoperationen nicht geschützt.9 Klassenoperationen Eine Klassenoperation ist eine Operation. daß eine Objektoperation direkt auf Klassenattribute der eigenen Klasse zugreifen kann. Ihre Aufgabe ist es.6. 2. auf Klassenattribute ausschließlich über Klassenoperationen zuzugreifen.6-21).2. static int Anzahl. 2. ermitteln Durchschnittsnote erstellen Studentenliste (siehe Abb. Beispiel 149 . Klassenattribut MatrikelNr Um Klassenattribute von den (ObName jekt)-Attributen unterscheiden zu Geburtsdatum können. die der jeweiligen Klasse zugeordnet ist und nicht auf ein einzelnes Objekt der Klasse angewendet werden kann. Betrachtet man als Beispiel die Operation exmatrikulieren() (Abb.Beispiel se Aufgabe ist unabhängig von einem ausgewählten Objekt.h. so handelt es sich um eine Objektoperation.6-21: Student (noch) keine Objekte gibt. erstellen ListeVordiplom 2. wenn eine der folgenden Situationen zutrifft: 1 Die Operation manipuliert Klassenattribute ohne Beteiligung eines einzelnen Objekts. das vor der Typanexmatrikulieren gabe steht. wenn nur ein Attributwert für alle Objekte einer Klasse existiert. Gleichzeitig dekrementiert sie die Anzahl der Studenten (Klassenattribut). und werden im Rahmen der Operation zusätzlich Klassenattribute manipuliert. einen Studenten zu löschen. Die Anzahl der Objekte (also 2) ist kein Attribut der Objekte. Ein Beispiel ist »ändern Farbe« für alle Rechtecke (Abb. In diesem Fall handelt es sich um eine Objektoperation. Sie liegt vor. Es wird davon ausgegangen. 2. Bezieht sich die Operation allerdings auf ein einzelnes Objekt.6-22). 2. Sie wirkt auf mehrere Objekte oder alle Objekte derselben Klasse oder manipuliert Klassenattribute der eigenen Klasse.9 Klassenoperaationen LE 5 te. Klassenattribute existieren auch dann. wird ein Klassenattribut in Immatrikulation Datum Vordiplom der UML-Notation unterstrichen darNoten gestellt (Abb. wenn es zu einer Klasse Abb. Ein Klassenattribut liegt also vor.6. sondern der Klasse.B. 2. d. Die.6-1).6-22). z. weil sie sich auf ein Objekt bezieht. Die Alternative würde darin bestehen.

Vor die Klassenoperation wird der Klassenname gesetzt.6-22: Klassenoperation 2. In Java ist es auch möglich. UML-Notation Um deutlich zu machen. wird eine solche Operation in der UML-Notation unterstrichen dargestellt (analog wie Klassenattribute). es wird geprüft. Dies widerspricht aber dem Konzept der Klassenoperation und sollte unterbleiben. Bei einer solchen Selektion wird die Eigenschaft der Objektverwaltung einer Klasse ausgenutzt. da dadurch die Verständlichkeit des Programms leidet! Die »Kundenverwaltung« wird so erweitert. Die Operation erstellen Studentenliste() druckt die Daten eines jeden Objekts der Klasse Student. die in diesem Jahr das Vordiplom bestanden haben. daß durch eine Objektverwaltung bekannt ist. welche Objekte von einer Klasse erzeugt wurden. daß die Anzahl der Kunden in der Klasse Kunde mitverwaltet wird. 7001234 ermitteln. ob deren Attributwerte vorgegebene Bedingungen erfüllen. die Klassenoperation über ein Objekt Java aufzurufen.LE 5 Abb.6 Dann die Praxis: Objekte und Klassen in Java Rechteck Mittelpunkt Länge Breite Farbe ändern Farbe Student MatrikelNr Name Geburtsdatum Immatrikulation Datum Vordiplom Noten Anzahl immatrikulieren erstellen Studienbescheinigung eintragen Note exmatrikulieren ermitteln Durchschnittsnote erstellen Studentenliste erstellen ListeVordiplom Kapitel 2. Hierzu ist es allerdings nötig. Die Klasse Kunde ist folgendermaßen zu ergänzen: 150 Beispiel . 2.h. d. Sie wird ohne eine Referenz auf ein bestimmtes Objekt aufgerufen. – Den Studenten mit der Matrikel-Nr.19 2 Die Operation bezieht sich auf alle Objekte der Klasse. daß eine Operation Klassenattribute manipuliert oder sich auf mehrere Objekte der Klasse bezieht. Das Ergebnis einer Selektion ist im allgemeinen eine Menge von Objekten. 3 Häufig müssen die Objekte einer Klasse nach bestimmten Kriterien durchsucht werden. Beispiel Beispiele – Studenten ermitteln. Eine Klassenoperation wird in Java durch das Schlüsselwort static gekennzeichnet.

Dies ist bei applets aus Sicherheitsgründen nur beschränkt möglich. } } LE 5 Von der Klasse KundeGUI aus kann das Klassenattribut folgendermaßen abgefragt werden: ersterKunde = new Kunde("KFZ-Zubehoer GmbH"). //Bei jeder Objekterzeugung wird AnzahlKunden um Eins //erhöht AnzahlKunden = AnzahlKunden + 1. private int Auftragssumme = 0.6.10 Aufbau und Start einer Java-Anwendung /*Programmname: Kundenverwaltung2 * Fachkonzept-Klasse: Kunde * mit Zählung der Kundenanzahl */ public class Kunde { //Klassenattribut private static int AnzahlKunden = 0..2.10 Aufbau und Start einer Java-Anwendung Eine Java-Anwendung unterscheidet sich in verschiedenen Punkten von einem Java-applet. auf dem sie läuft. s Eine Java-Anwendung kann auf alle Ressourcen des Computersystems zugreifen. //Objektattribute private String Firmenname. s Eine Java-Anwendung kann eine grafische oder eine textuelle Benutzungsoberfläche besitzen.6-23.6. Eine detaillierte Darstellung des Startvorgangs zeigt Abb. 2. 2.. 151 . } . //Lesende Operationen //Klassenoperation zum Lesen des Klassenattributs public static int getAnzahlKunden() { return AnzahlKunden. s Vergleichbar mit der Objektoperation init() eines applets ist die Klassenoperation main() einer Anwendung. Firmenadresse. //Konstruktor public Kunde(String Name) { Firmenname = Name. //AnzahlKunden ermitteln und ausgeben //Botschaft an die Klasse Kunde.getAnzahlKunden(). nicht an ein Objekt! MerkeZahl = Kunde.

von der Festplatte oder über das Netz in die Halde des Arbeitsspeichers. Abb 2. 4 Der Klassenlader prüft.39 ff/ . java KundeGUI.h. d. z. (in der Abbildung blau eingezeichnet). Aus demselben Grund können auch nur andere Klassenoperationen und keine Objektoperationen aufgerufen werden. S. der die Bytecodes auf strukturelle Korrektheit überprüft.6-23: Start einer JavaAnwendung Um eine grafische Java-Anwendung zu erhalten. einKundeGUI = new KundeGUI(). daß die Klasse KundeGUI nicht geladen ist.6 Dann die Praxis: Objekte und Klassen in Java Beim Start einer Java-Anwendung laufen folgende Vorgänge ab: 1 Die Java-VM (virtual machine) beginnt mit dem Aufruf der Klassenoperation main() einer angegebenen Klasse. 5 Nach dem Laden wird der Verifizierer (verifier) aktiviert. main() von KundeGUI auszuführen. z. ob der Code Referenzen auf andere Klassen enthält.B.LE 5 2. Yellin 97. dann wird die Klassenoperation main() von KundeGUI aufgerufen. ob die Datei während des Ladens oder des Transports über das Netz beschädigt wurde.class”) KundeGUI Kunde Verifizierer main() KundeGUI() einKundeGUI :Kunde 8 In der main()-Operation sollte anschließend ein Objekt von der eigenen Klasse erzeugt werden. Ihr muß angegeben werden. z. müssen in der Klasse KundeGUI des Java-applets einige Änderungen vorgenommen werden: 1 Die Operation main() ist eine Klassenoperation. Im Gegensatz zum Start eines Java-applets wird von der Java-VM kein Objekt der Klasse KundeGUI erzeugt! Java-VM java KundeGUI Klassenlader loadClass (”KundeGUI. 7 Ist die Initialisierung für die Klasse KundeGUI abgeschlossen. aus Objektattributen und Objektoperationen Klassenattribute und Klassenoperationen durch Voranstellen des Schlüsselworts static zu machen. gibt es noch keine Objektattribute. Enthält die Klasse KundeGUI z. dann ruft sie einen Klassenlader (class loader) auf. die Deklaration Kunde ersterKunde.B. dann wird auch die Klasse Kunde geladen usw. Da noch kein Objekt der Klasse existiert. welche Klasse die ausführende main()Operation enthält. a Eine Möglichkeit besteht darin. KundeGUI. Daher kann innerhalb dieser Operation nur auf Klassenattribute zugegriffen werden. die noch zu laden sind. 2 Stellt die Java-VM bei dem Versuch. 152 Quelle:/Lindholm.class. werden die Klassenattribute erzeugt und mit den voreingestellten Standardwerten initialisiert. 6 Nachdem alle Klassen geladen und geprüft sind. fest.B. 3 Der Klassenlader lädt die Binärdarstellung der angegebenen Klasse.B.

Bei einer JavaAnwendung kann diese Klasse nicht verwendet werden. Da ein Fensterobjekt nach dem Erzeugen unsichtbar ist. Für die Klasse KundeGUI sieht diese Alternative folgendermaßen aus: Beispiel public class KundeGUI { //Referenz-Attribut als Klassenattribut static KundeGUI einKundeGUI. Eine Klasse mit ähnlichen Eigenschaften ist die Klasse Frame. b Aus der Operation init() wird der Konstruktor der GUI-Klasse. Sie stellt ein »einfaches« Fenster zur Verfügung. 153 Beispiel .applet kann entfallen. Bei der JavaAnwendung muß die Festlegung der Fenstergröße durch die Operation void setSize(int width.6. int height) erfolgen. In der ersten Zeile der Klassendeklaration muß extends Applet umgewandelt werden in extends Frame. sind folgende Modifikationen in der entsprechenden GUI-Klasse erforderlich: a Jede GUI-Klasse eines applets verwendet die Klasse Applet. Ist das Objekt erzeugt. } } 2 Um eine möglichst analoge Benutzungsoberfläche wie beim applet zu erhalten und möglichst wenige Änderungen vornehmen zu müssen. Aus public class KundeGUI extends Applet wird public class KundeGUI extends Frame. Aus public void init() wird public KundeGUI(). Die Anweisungen Beispiel selbst bleiben unverändert. innerhalb der Klassenoperation main() ein Objekt der eigenen Klasse zu erzeugen. c Bei applets wird die Größe des applets durch die Angabe der Breite und Höhe im applet-Befehl der HTML-Seite festgelegt. //Konstruktor public KundeGUI() { } //Klassenoperation main public static void main(String args[]) { //Erzeugen eines Objekts von KundeGUI einKundeGUI = new KundeGUI(). muß es durch die Operation void setVisible(boolean b) mit b = true auf dem Bildschirm angezeigt werden.2. die eine Reihe von Operationen zur Verfügung stellt. dann kann über das Referenz-Attribut auf die Objektoperationen dieser Klasse zugegriffen werden. Die Zeile import java.10 Aufbau und Start einer Java-Anwendung LE 5 b Die Alternative ist.

Für eine Java-Anwendung muß das Schließen der Anwendung programmiert werden. Dies wird im Abschnitt 2. Die vollständig umgestellte Java-Anwendung befindet sich auf der CD-ROM. Keine Änderung der Fachkonzeptklasse! Beenden einer Anwendung Damit sind alle notwendigen Umstellungen vorgenommen. Dadurch wird die Java-Anwendung beendet. Die Fachkonzept-Klasse muß nicht geändert werden. 2.start(). Beispiel Aufruf der Operation start(): einKundeGUI. Beim Start des Programmes wird zunächst ein MS-DOS-Fenster (bei Verwendung von Windows 95/98) geöffnet und anschließend das Fenster der Java-Anwendung angezeigt. Es gibt einen wichtigen Unterschied: Ein Java-applet kann über den Web-Browser beendet werden. Es sieht analog wie die applet-Oberfläche aus. Beispiel Nach der Anweisung zur Objekterzeugung einKundeGUI = new KundeGUI().und Programmieraufträge. Die Anwendung kann gestartet werden. mit der Maus in das MS-DOS-Fenster zu wechseln und dieses Fenster über den Fenster-Schließen-Knopf (rechts oben) zu schließen.7 Assoziationen und Kardinalitäten 2.6 Dann die Praxis: Objekte und Klassen in Java Die main-Operation muß daher nach dem Erzeugen des GUI-Objekts um entsprechende Aufrufe dieser Operationen ergänzt werden.9. Die bisherige Kundenverwaltung soll daher um eine Auftragsverwaltung erweitert werden: 154 . einKundeGUI. Im Moment bleibt nur die Möglichkeit. Die Operation stop() kann entfernt werden. stehen folgende Anweisungen: einKundeGUI.LE 5 2.270).7. d Die Ausführung der Operation start() des Java-applets kann durch einen Aufruf der Operation am Ende der main()-Operation erfolgen. Die Vorteile der Trennung GUI – Fachkonzept zeigen sich hier bereits.setVisible(true).1 Zuerst die Theorie: Assoziationen und ihre Kardinalitäten Beispiel Fallstudie Die Firma ProfiSoft erhält von mehreren Firmen Beratungs. Diese Anweisungen werden nach Abschluß des Konstruktors ausgeführt.setSize(430.2 gezeigt. entweder von der Programmierumgebung aus oder durch Eingabe von java KundeGUI im MS-DOS-Fenster (wenn das Betriebssystem Windows 95/98 verwendet wird).

Außerdem ist es noch erforderlich.7-1: Objektdiagramm mit Verbindungen zwischen einem Kunden und seinen Aufträgen :Auftrag Nummer = 3 Art = ”Programmierung” Anzahl Stunden = 45 Stundensatz = 180 Auftragsdatum = 10. die in einer Beziehung stehen (Objektdiagramme). Poststr.vs. Da durch eine Verbindung der Zusammenhang zwischen zwei Objekten eindeutig hergestellt ist. In der Regel zeichnet man Assoziationen jedoch in ein Klassendiagramm ein. /4/ Auf alle Daten muß einzeln lesend zugegriffen werden.99 Bestehen zwischen Objekten von Klassen Beziehungen. daß zwischen den Objekten zweier Klassen eine Beziehung bestehen kann. /2/ Beim Anlegen eines Auftrags müssen die Auftragsnummer und das Auftragsdatum angegeben werden. /3/ Auf die Auftragsart. die Auftragsnummer nicht beim Auftraggeber als Attribut aufbewahrt werden.und Muß-Beziehungen. 155 Assoziation Assoziationsname Muß.2.1 Zuerst die Theorie: Assoziationen und ihre Kardinalitäten LE 5 /1/ Zu jedem Auftrag sind folgende Daten zu speichern: Auftragsnummer. den Auftraggeber als Attribut separat zu speichern. dann spricht man von Assoziationen zwischen den Objekten. 2.B. Art des Auftrags wie Beratung oder Programmierung.7-1). Zusätzlich wird jedoch noch ein Assoziationsname vergeben. Zwischen Kundenobjekten und Auftragsobjekten entstehen Verbindungen. Man unterscheidet Kann. aber nicht muß. Stundensatz (Voreinstellung: 180) und Auftragsdatum. Eine Kann-Beziehung besagt. :Auftrag Nummer = 1 Art = ”Beratung” Anzahl Stunden = 8 Stundensatz = 250 Auftragsdatum = 5.1. daß zwischen zwei Objekten eine Beziehung bestehen muß.12” Auftragssumme = 0 Abb. die Stundenanzahl und den Stundensatz muß einzeln schreibend zugegriffen werden. einen oder mehrere Aufträge erteilen. Auf Objektebene zeichnet man Linien zwischen den Objekten. Zwischen zwei Klassen wird ebenfalls eine Linie eingezeichnet. ist es für ein Objekt der Klasse Auftrag nicht nötig. Eine MußBeziehung dagegen verlangt. 2. die Art der Assoziation anzugeben. Anzahl der benötigten Stunden (Voreinstellung: 1).99 :Kunde Firmenname = “KFZ-Zubehör GmbH” Firmenadresse = ”44137 Dortmund. die in einem Objektdiagramm dargestellt werden können (Abb.7. /5/ Ein Kunde kann keinen (null). /6/ Jeder Auftrag gehört zu genau einem Kunden. Umgekehrt muß z. KannBeziehung .1.

Der Assoziationsname darf fehlen.1 1. ob eine Kann.7-3 zeigt diese Assoziation als Klassendiagramm. Zusätzlich oder alternativ wird oft noch der Rollenname oder kurz die Rolle angegeben. Abb.7-2: Darstellung von Assoziationen und Kardinalitäten in der UML-Notation Klasse A Assoziationsname Rolle A Assoziationsname Rolle B Klasse B Anzahl der Assoziationen: Klasse A Klasse A 1 Zwischen einem beliebigen Objekt und einem Objekt der Klasse A gibt es: genau eine Beziehung (Muß-Beziehung) viele Beziehungen (Null. die in Abb. welche Funktion ein Objekt in einer Assoziation besitzt.oder Muß-Beziehung vorliegt. 2. und zwar bei der Klasse. Beide Angaben zusammen werden als Kardinalität (multiplicity) Kardinalität bzw. 2. deren Bedeutung sie in der Assoziation näher beschreibt. Wertigkeit bezeichnet.7-3: Assoziation zwischen der Klasse Kunde und Auftrag Jeder Auftrag gehört zu genau 1 Kunden Jeder Kunde erteilt null. mit wievielen anderen Objekten ein Objekt einer Klasse in einer Beziehung stehen kann bzw. Abb. 2. daß der Kunde in seiner Eigenschaft als Auftraggeber Aufträge erteilt. eine oder mehrere) (Kann-Beziehung) null oder eine Beziehung (Kann-Beziehung) eine oder mehrere Beziehungen (Muß-Beziehung) * 0. 2.7-2 dargestellt ist.73 gibt der Rollenname an. Die ge156 . Der Rollenname wird jeweils an das Ende der Assoziation geschrieben. die beschreibt. muß. In der UML gibt es für die Assoziationsund Kardinalitätsangaben eine textuell-grafische Notation. einen oder mehrere Aufträge Rolle Die Pfeile an den Assoziationsnamen geben die Leserichtung an: Ein Kunde erteilt einen Auftrag.7 Assoziationen und Kardinalitäten Neben der Angabe. Rollennamen sind optional. 2. Kunde 1 Auftraggeber erteilt gehört zu * Auftrag Abb..* Klasse A Klasse A Beispiel Fallstudie Bezogen auf Kunden und Aufträge liegt folgende Situation vor: Ein Kunde kann keinen (null). wenn die Bedeutung der Assoziation offensichtlich ist.. Ein Auftrag gehört zu genau einem Kunden (Muß-Beziehung).LE 5 2. Ein Auftrag gehört zu einem Kunden. einen oder mehrere Aufträge erteilt haben (Kann-Beziehung). In Abb. muß noch angegeben werden.

2. Beispielsweise kennt ein Objekt der Klasse KundeGUI seine Kunden-Objekte. 2.20. Bei einer unidirektionalen Assoziation muß nur eine Verbindungsrichtung verwaltet werden.7-4: Verwaltung einer unidirektionalen Assoziation mit einer maximalen Kardinalitätsgrenze von 1 Liegt eine bidirektionale Assoziation vor.Abschnitt 2.7-4). Ist die Kardinalitätsobergrenze größer als 1. Bei einer bidirektionalen Assoziation kennen alle verbundenen Objekte sich gegenseitig. KlasseA eineRolleB : KlasseB 0. dann genügt es. Dies ist bei Fachkonzept-Klassen in der Regel der Fall.1 setLink(KlasseB einObjektB) getLink() : KlasseB removeLink() RolleB KlasseB Abb. Zum Anlegen der Verbindung wird eine Operation setLink(KlasseB einObjekt) und zum Abfragen eine Operation KlasseB getLink() verwendet (Abb. Unidirektional bedeutet. Auf die Programmierung dieser Situation wird in Abschnitt 2. dann benötigen beide beteiligten Klassen die angegebenen Verwaltungsoperationen.7. Unidirektionale Assoziationen werden in der UML-Notation: Pfeilspitze UML durch eine Pfeilspitze gekennzeichnet. Ein Kunden-Objekt kennt aber nicht sein KundeGUI-Objekt. ob s die Obergrenze der Kardinalitäten maximal 1 oder größer 1 ist.2 Dann die Praxis: Assoziationen in Java LE 5 schickte Wahl der Rollennamen kann zur Verständlichkeit jedoch mehr beitragen als der Name der Assoziation selbst. 2.2.20. während bei der bidirektionalen beide verwaltet werden müssen. s die Assoziation bidirektional oder unidirektional ist.6 gen. Das Java-Programm zu Abb.7. dann müssen entsprechend viele Referenz-Attribute verwaltet werden. bei der unidirektionalen Assoziation ein Referenz-Attribut zu verwalten. mit wem sie verbunden sind.2 Dann die Praxis: Assoziationen in Java Die Programmierung einer Assoziation hängt davon ab. //Verwaltungsoperationen public void setLink(KlasseB einObjektB) 157 . 2.. diese aber nicht wissen. das einen Zeiger auf das assoziierte Objekt enthält.6 eingegan. daß die Objekte einer Klasse alle Objekte der mit ihr assoziierten Klassen kennt.7-4 sieht folgendermaßen aus: class KlasseA { //Referenz-Attribut KlasseB eineRolleB. Ist die Obergrenze der Kardinalität maximal 1.

nochEinAuftrag. 158 .28).24.*. } public removeLink() { eineRolleB = null. Font. schwarz dargestellt sind: /*Programmname: KundenUndAuftragsverwaltung1 * GUI-Klasse: KundeGUI (Java-Anwendung) * mit Zugriff auf die Kundenanzahl * und die Fachkonzept-Klasse Auftrag */ import java. wobei die Teile.7 Assoziationen und Kardinalitäten { eineRolleB = einObjektB.LE 5 2. setSize(430.168.270). //Attribute //Deklarieren von zwei Kundenobjekten private Kunde ersterKunde. public class KundeGUI extends Frame { //Referenz-Attribut als Klassenattribut static KundeGUI einKundeGUI. Fuehrungstext. Fuehrungstext. } public KlasseB getLink() { return eineRolleB.setBounds(36. } } class KlasseB { } Beispiel Fallstudie Die Umsetzung der erweiterten Fallstudie sieht folgendermaßen aus. TextArea Textbereich.setFont (new Font("Dialog". 12)). Fuehrungstext = new Label("Kundenverwaltung").awt. zweiterKunde. //{{DECLARE_CONTROLS Label Fuehrungstext. //}} //Konstruktor analog zu init() public KundeGUI() { //Erzeugen der Interaktionselemente und //Zuordnung von Attributwerten //{{INIT_CONTROLS setLayout(null). die für die Assoziation verantwortlich sind. //Deklarieren von Referenz-Attributen auf Auftragsobjekte private Auftrag einAuftrag.BOLD. add(Fuehrungstext).

getFirmenadresse().0.valueOf(MerkeZahl). zweiterKunde = new Kunde("Tankbau KG").setBounds(36.60. //Aufruf von Start einKundeGUI. einKundeGUI.getAnzahlKunden(). Textbereich. MerkeText = ersterKunde. add(Textbereich).setVisible(true)."10. einAuftrag.getFirmenname(). //Auftragssumme eintragen ersterKunde.aendernAdresse("Tankbau & Partner KG". //******************************************** //Anzeigen der Attributinhalte im Textbereich MerkeText = ersterKunde.2 Dann die Praxis: Assoziationen in Java Textbereich = new TextArea ("".setAuftragsart("Programmierung").2.setAnzahlStunden(45). einAuftrag. //Adresse eintragen ersterKunde. //Zuordnung zum ersten Kunden ersterKunde. 159 LE 5 .SCROLLBARS_VERTICAL_ONLY).start(). //}} } //Klassenoperation main public static void main(String args[]) { //Erzeugen eines Objekts von KundeGUI einKundeGUI = new KundeGUI(). } public void start() { //Attribute zum Merken der Ergebnisse der Botschaften String MerkeText.setFirmenadresse("44137 Dortmund. //Erzeugen von zwei Objekten durch Aufruf des Konstruktors ersterKunde = new Kunde("KFZ-Zubehoer GmbH").setAuftragssumme(15000).360.setForeground(new Color(0)). "44867 Bochum. Textbereich. int MerkeZahl. nicht an ein Objekt! MerkeZahl = Kunde.setSize(430.TextArea. //Mit "\n" wird auf eine neue Zeile gewechselt Textbereich. MerkeText = String.append(MerkeText). //******************************************** //Erfassen eines Auftrags einAuftrag = new Auftrag(3. //AnzahlKunden ermitteln und ausgeben //Botschaft an die Klasse Kunde. float MerkeFloatZahl.99").append(MerkeText+"\n").append("\n"). //Adresse ändern zweiterKunde. //Mit append wird der Text an den vorhandenen Text angehängt Textbereich. einKundeGUI.270).1.0. 12"). Suedstr.7.156). Textbereich. Poststr.setLinkAuftrag(einAuftrag).append("Anzahl Kunden: "+MerkeText+"\n"). Textbereich. 23").

//Umwandlung einer ganzen Zahl in eine Zeichenkette MerkeText = String. getFirmenname()+"\n").valueOf(MerkeFloatZahl).getNr().append("Auftragsnummer: "+ MerkeText+"\n").append(zweiterKunde.getAuftragssumme(). Textbereich.getAnzahlStunden().valueOf(MerkeZahl).append("Anzahl Kunden: "+ MerkeText+"\n"). //Umwandlung einer ganzen Zahl in eine Zeichenkette MerkeText = String. MerkeText = String.LE 5 2.append("Anzahl Stunden: "+ MerkeText+"\n").getStundensatz().valueOf(MerkeZahl).getAuftragsart() +"\n").valueOf(MerkeZahl). Textbereich.valueOf(MerkeZahl). Textbereich. MerkeZahl = nochEinAuftrag.getAnzahlKunden(). Textbereich.7 Assoziationen und Kardinalitäten MerkeZahl = ersterKunde. Textbereich.getLinkAuftrag(). MerkeFloatZahl = nochEinAuftrag. private int Auftragssumme = 0. Textbereich.append("Stundensatz: "+ MerkeText+" DM\n").append(zweiterKunde.getAuftragssumme().valueOf(MerkeZahl). Textbereich. 160 .append("Auftragsdatum: " + nochEinAuftrag. //************************************************ //Anzeigen des Auftrags nochEinAuftrag = ersterKunde. //Objektattribute private String Firmenname.append(nochEinAuftrag. //Klassenattribut static int AnzahlKunden = 0.append(MerkeText+"\n"+"\n"). //Ende der Auftragsausgabe **************************** //Anzeigen der Attributinhalte -. MerkeText = String.Kurzform MerkeZahl = Kunde. MerkeZahl = nochEinAuftrag.getFirmenadresse() +"\n"). Firmenadresse. MerkeZahl = zweiterKunde.getAuftragsdatum()+"\n"+"\n"). Textbereich. Textbereich. MerkeText = String. //Umwandlung einer ganzen Zahl in eine Zeichenkette MerkeText = String.append("Auftragssumme: " + MerkeText+"\n"). } } /*Programmname: KundenUndAuftragsverwaltung1 * Fachkonzept-Klasse: Kunde * mit Zählung der Kundenanzahl * und Referenz auf einen Auftrag */ public class Kunde { //Referenz-Attribut private Auftrag ersterAuftrag. Textbereich.

} //Lesende Operationen //Klassenoperation zum Lesen des Klassenattributs public static int getAnzahlKunden() { return AnzahlKunden. Firmenadresse = Adresse.7.2 Dann die Praxis: Assoziationen in Java //Konstruktor public Kunde(String Name) { Firmenname = Name. } public void setFirmenname (String Name) { Firmenname = Name. } public String getFirmenname() { return Firmenname. } //Referenz zu Auftrag löschen public void removeLinkAuftrag() { ersterAuftrag = null. } public void setAuftragssumme(int Summe) { Auftragssumme = Summe. //Bei jeder Objekterzeugung wird AnzahlKunden um //Eins erhöht AnzahlKunden = AnzahlKunden + 1. } public void setFirmenadresse (String Adresse) { Firmenadresse = Adresse.2. } //Kombinierte Schreiboperation public void aendernAdresse (String Name. } 161 LE 5 . String Adresse) { Firmenname = Name. } //Schreibende Operationen //Verbindung zu Auftrag herstellen public void setLinkAuftrag(Auftrag einAuftrag) { ersterAuftrag = einAuftrag. } public String getFirmenadresse() { return Firmenadresse. } //Referenz auf Auftrag lesen public Auftrag getLinkAuftrag() { return ersterAuftrag.

} 162 . Auftragsdatum = Datum. int AnzahlStunden = 1. } //Operationen public void setAnzahlStunden(int Stunden) { AnzahlStunden = Stunden. } } /*Programmname: KundenUndAuftragsverwaltung1 * Fachkonzept-Klasse: Auftrag */ public class Auftrag { //Attribute int Nummer. String Art. //Konstruktor public Auftrag(int Nr. } public int getAnzahlStunden() { return AnzahlStunden.LE 5 2 Grundlagen der Programmierung public int getAuftragssumme() { return Auftragssumme. } public String getAuftragsdatum() { return Auftragsdatum. String Auftragsdatum. } public void setStundensatz(float Satz) { Stundensatz = Satz. String Datum) { Nummer = Nr. } public void setAuftragsart(String Auftragsart) { Art = Auftragsart. } public int getNr() { return Nummer. } public String getAuftragsart() { return Art. float Stundensatz = 180f.

In der Programmierung sollen außerdem eine Reihe von Prinzipien eingehalten werden.2 und 3.h. alle übersetzten Java-Klassen (Endung .8 Zur Software-Technik: Integrierte Dokumentation. Im folgenden werden behandelt: s Prinzip der integrierten Dokumentation s Prinzip der Verbalisierung Zusätzlich sind oft Richtlinien.3). um Schwächen von Programmiersprachen auszugleichen und um einen einheitlichen Programmierstil zu erreichen. Schreibtischtest. alle Java-Klassen (Endung .3 he Kapitel 3. Neben Programmierumgebungen und Compilern werden CASEWerkzeuge zur Software-Entwicklung eingesetzt.class). } } LE 5 Das Ergebnis des Programmlaufs zeigt Abb. s Testplanung und Testprotokoll bzw.8 Integrierte Dokumentation.h. Schreibtischtest. CASE public float getStundensatz() { return Stundensatz.2. CASE Die Ergebnisse der Programmiertätigkeiten müssen sich in folgenden Teilprodukten niederschlagen: s Quellprogramm einschließlich integrierter Dokumentation.7-5.7-5: Das Ergebnis des Programmlaufs »Kunden UndAuftragsverwaltung1« 2. Abb. Konventionen und Empfehlungen erforderlich.java). 163 . 2. d.Kapitel 3. Verbalisierung. Verifikationsdokument (sie. s Objektprogramme. Verbalisierung. d. 2.2 und Kapitel 3.

Einige Programmierumgebungen verwalten automatisch verschiedene Versionen eines Programmes einschließlich der Versionsnummer.LE 5 2. Schreibtischtest. s Zeit.1 Prinzip der integrierten Dokumentation Integraler Bestandteil jedes Programms muß eine geeignete Dokumentation sein.6 behandelt). Vor der Release-Nummer steht ein »V«.0 erhalten. der das Programm möglichst genau beschreibt. dann sollte man mit der Zählung bei 0. Die ersten beiden Angaben können in einem Programmvorspann zusammengefaßt werden: s Programmname: Name. CASE 2. von dem Java-Programm Javadoc sowie einigen Programmierumgebungen jedoch ausgewertet.8 Integrierte Dokumentation. Beginnt man ein Programm zu entwickeln. s @author Name des Programmautors Wurde das Programm von mehreren Autoren erstellt. Die Release-Nummer (im allgemeinen einstellig) steht. dann ist für jeden Autor eine solche Zeile mit @author Name zu schreiben. wobei gleichzeitig die Level-Nummer auf Null zurückgesetzt wird. s Verwaltungsinformationen. In Java gibt es einen Dokumentationskommentar. Verbalisierung. Eine gute Dokumentation sollte folgende Angaben beinhalten: s Kurzbeschreibung des Programms.1 beginnen.6 Versionsnummer Dokumentationskommentar in Java Hinweis: Das Programm Javadoc befindet sich auf der CD-ROM 1 164 . Alle Zeichen zwischen /** und */ werden vom Compiler überlesen. ein applet oder eine Anwendung handelt. Die Release-Nummer wird bei größeren Änderungen und Erweiterungen des Programms um Eins erhöht. um eine automatische Dokumentation im HTML-Format zu erstellen. getrennt durch einen Punkt.oder eine FachkonzeptKlasse. wenn eine kleine Änderung am Programm vorgenommen wurde. Ein erstmals fertiggestelltes Programm sollte die Versionsnummer 1. der folgendermaßen aufgebaut ist: /** Kommentar */. s Kommentierung des Quellcodes. vor der Level-Nummer (maximal zweistellig).und Speicherkomplexität des Programms (wird in Kapitel 3. ob es sich um eine GUI.8. s Aufgabe: Kurzgefaßte Beschreibung des Programms einschließlich der Angabe. Programmvorspann Kapitel 3. Die Level-Nummer wird jeweils um Eins erhöht. s @version Versionsnummer Datum Die Versionsnummer besteht aus zwei Teilen: – der Release-Nummer und – der Level-Nummer.

z. Vergleich d Operationen mit schreibendem Zugriff (setAttributname) e Operationen mit lesendem Zugriff (getAttributname) 2 Leerzeichen a Bei binären Operatoren werden Operanden und Operator durch jeweils ein Leerzeichen getrennt.Kommentierung mentierung der Operationen einer Klasse.8-1 angegebenen Richtlinien zur Formatierung einzuhalten. Neben der Aufgabenbeschreibung jeder Operation ist die Bedeutung der Parameter zu kommentieren. 2. z.B. Um eine gute Lesbarkeit und leichte Einarbeitung – insbesondere in ein fremdes Programm – zu unterstützen. Besonders wichtig ist die geeignete Kom.13. die mit einem @-Zeichen beginnen wie @author und @version.blue) d Nach Schlüsselwörtern steht grundsätzlich ein Leerzeichen. n mit dem HTML-<A>-Befehl Hyperlinks auf andere relevante Dokumente gesetzt werden. 1 Einheitlicher Aufbau einer Klasse Folgende Reihenfolge ist einzuhalten: a Alle Attributdeklarationen.9 schnitt 2. wenn dies aus dem Parameternamen nicht eindeutig ersichtlich ist.1 Prinzip der integrierten Dokumentation LE 5 In einem solchen Kommentar können n spezielle Befehle eingestreut werden. Beide Befehlsarten müssen am Zeilenanfang beginnen. Zur Kommentierung von Operationen können in Java-Dokumentationskommentaren folgende Befehle eingestreut werden: @param Name und Bezeichnung von Parametern @return Beschreibung eines Ergebnisparameters @exception Name und Beschreibung von Ausnahmen (siehe Ab. die für die gesamte Klasse gelten b Konstruktoren c Operationen.Operation c Zwischen Operationsname und Klammer steht kein Leerzeichen. c Alle Zeilen innerhalb eines Klammerpaars sind jeweils um 4 Leerzeichen oder einen entsprechenden Tabulatorsprung nach rechts eingerückt. Zahl1 + Zahl2 * 3 b Keine Leerzeichen bei der Punktnotation: Objekt. Neben dem Programmvorspann muß auch der Quellcode selbst Quellcodedokumentiert werden. setColor(Color.<\B>. steht sonst nichts mehr.8-1: Richtlinien für die Formatierung 165 . Zusätzlich wird eine gute Dokumentation durch eine geeignete Verbalisierung unterstützt.B. sind zusätzlich die in Abb. @see Verweis auf Klasse.. b In der Zeile.2. n HTML-Befehle eingefügt werden wie <HR> und <B>.8. 3 Einrücken und Klammern von Strukturen a Paarweise zusammengehörende geschweifte Klammern { } stehen immer in derselben Spalte untereinander. Nach der öffnenden und vor der schließenden Klammer steht ebenfalls kein Leerzeichen. z.Abschnitt 2.9). in der ein geschweifte Klammer steht. Zuweisung.B.13. Abb. wobei Leerzeichen und ein Stern überlesen werden. 2.

Bei deutschsprachigen Bezeichnern sehen aber Attributnamen. dann ist es sinnvoll. Bezogen auf die Entwicklung eines Programms soll Verbalisierung dazu dienen. Unabhängig von der erlaubten Syntax sind jedoch weitere Regeln und Konventionen einzuhalten. daß sie der Syntax der jeweiligen Programmiersprache entsprechen. sondern auch für andere Personen. daß es sich um Klassen handelt. z. Konventionen für Bezeichner Problemnahe Bezeichner Java-konforme Bezeichner Attributnamen Verbalisierung bedeutet. s selbstdokumentierende Programmiersprache. s geeignete Kommentare. Verbalisierung. Attribute. wie ändern Adresse.LE 5 2. Daher sollten deutschsprachige Attribute mit Großbuchstaben begonnen werden.2 Prinzip der Verbalisierung Verbalisierung Richtlinien.8 Integrierte Dokumentation. In der objektorientierten Welt ist es in der Regel üblich.8. leichter verständlich (Abb. Bei der Transformation von der UML-Notation in ein Programm müssen die Bezeichner dann natürlich so modifiziert werden. anrede. die Ideen und Konzepte des Programmierers im Programm möglichst gut sichtbar zu machen und zu dokumentieren. Wie die Richtlinien und Konventionen für Bezeichner zeigen. 166 . Gedanken und Vorstellungen in Worten auszudrücken und damit ins Bewußtsein zu bringen. CASE 2. Wohnfläche usw. Konstruktoren und Operationen müssen Namen vergeben werden. 2. Für die Verständlichkeit eines Programms ist eine geeignete Namenswahl entscheidend. Verwendet man englischsprachige Bezeichner. die sich in ein Programm einarbeiten wollen. Eine gute Verbalisierung kann erreicht werden durch: s aussagekräftige. die Bezeichner aus der Fachterminologie des Anwendungsgebietes mit Leerzeichen und – wenn in Deutsch – mit Umlauten und »ß« zu schreiben. alle Klassennamen mit einem Großbuchstaben zu beginnen. Namen werden in der Informatik oft auch Bezeichner (identifier) genannt. befremdlich aus.8-3). adresse. 2. Schreibtischtest. dann fangen Attributnamen mit einem Kleinbuchstaben an. Für den Aufbau solcher Bezeichner gibt es in Java eine festgelegte Syntax (Abb. gibt es zwei Problembereiche bei der Bezeichnerwahl: s Problemnahe Bezeichner vs. trotz der Verwechslungsgefahr mit Klassen. die mit Kleinbuchstaben beginnen. Großbuchstaben Beschreibt man Anforderungen an ein Programm in Form eines Pflichtenhefts oder modelliert man ein Programm mit Hilfe der UMLNotation. wie name. Dadurch erkennt man in einem Programm sofort. mnemonische Namensgebung. um gut lesbare Programme zu erhalten. aendernAdresse usw. wie name. titel. Zähler. Für Klassen. Dadurch wird es nicht nur für den Autor.8-2). address usw. Java-konforme Bezeichner s Beginn von Attributnamen mit Kleinbuchstaben vs.B.

string literals).5-1): A–Z (\u0041–\u005a) a–z (\u0061–\u007a) und aus historischen Gründen _ (\u005f). ebenfalls nicht null (Null Literal). * <hr> * @see KundeGUI 167 . einObjekt und EinObjekt sind unterschiedliche Bezeichner.h. da andere Programmiersprachen dies nicht erlauben und dadurch Programmtransformationen in andere Progammiersprachen erschwert werden. Bezeichnern.2. Ein Java-Buchstabe-oder-Ziffer ist jedes Unicode-Zeichen. Ein JavaLetterOrDigit ist ein Zeichen. Ein Java-Programm besteht nur aus ASCII-Zeichen mit Ausnahme von Kommentaren. Außerdem darf ein Bezeichner nicht true oder false heißen (Boolean Literals). Ein Buchstabe muß nicht aus dem lateinischen Alphabet stammen. das ein JavaLetter ist. class. αβγ. i3.und Zeichenketten-Literalen (character. z. Beispiele: Auftrag. 1.und Kleinbuchstaben des ASCII-Codes (siehe Abb. In Java wird der Unicode verwendet (siehe auch Abb.org ftp://unicode.2 Prinzip der Verbaslisierung LE 5 Identifier Abb 2. Java-Ziffern enthalten die ASCII-Ziffern: 0–9 (\u0030-\u0039) Zwei Bezeichner sind in Java nur dann identisch. Ziffer_1. z. ändern. das Dollar-Zeichen. * Die Anzahl der erfaßten Kunden wird mitgezählt.isJavaLetter den Wert true ergibt. erfasseText.org Ein Unicode-Zeichen wird in Java dargestellt durch \uxxxx. Empfehlung: Das Unterstreichzeichen und das $-Zeichen sollten nur bei maschinell generiertem Java-Code verwendet werden. die eine spezielle Bedeutung haben und daher nicht für Bezeichner verwendet werden dürfen. für das die Operation Character. das ASCII-Unterstreichzeichen (underscore) sowie $ (\u0024). Ö usw. wobei xxxx vier Hexadezimalzahlen sind. Schlüsselwörter sind besondere Bezeichner in einer Programmiersprache.5-1).. \u0041 für A. 1. Ein Java-Buchstabe ist jedes Unicode-Zeichen. wenn sie dasselbe UnicodeZeichen für jeden Buchstaben und jede Ziffer besitzen. verwendet werden. MerkeName.B.isJavaLetterOrDigit den Wert true ergibt.8-2: Bezeichner in Java JavaLetterOrDigit JavaLetter Ein Bezeichner darf kein Java-Schlüsselwort (keyword) sein.B. Jedes Zeichen wird durch 2 Byte dargestellt. Unter Berücksichtigung der aufgeführten Richtlinien sieht das Pro. Empfehlung: Nationale Sonderzeichen sollten in Bezeichnern nicht verwendet werden. Java-Buchstaben enthalten die Groß. das ein JavaLetterOrDigit ist.unicode.Beispiel gramm »Kundenverwaltung« folgendermaßen aus: /** Programmname: Kundenverwaltung2 <br> * Fachkonzept-Klasse: <b> Kunde </b> * <hr> * Aufgabe: Es werden Firmenkunden verwaltet. new usw. Ein JavaLetter ist ein Zeichen. Informationen über den Unicode-Zeichensatz erhält man unter: http://www. für das die Operation Character.8. Es können auch nationale Sonderzeichen wie Ä. der 65469 Positionen zur Verfügung stellt. d. das aber nur für automatisch generierten JavaCode verwendet werden soll. Zeichen.

einRechteck. leseAdresse. 168 . ZeilenZähler (in UML). Dateistatus. enthalten das Suffix GUI. um eine Verwechslungsgefahr mit Klassen auszuschließen. z. 3 Bezeichner enthalten keine Leerzeichen. hotWaterLevel.B.B. – lauten setAttributname. müssen aber bei der Transformation in JavaProgramme ersetzt werden. z. einKunde. drucke. öffentliche Ausschreibung (in UML). Unterstriche werden nicht zur Trennung eingesetzt. Weiterführende Literatur: /Wendorff 97/. da sonst gegen die Lesegewohnheiten verstoßen wird. wenn nur ein Attributwert eines Objektes gelesen wird. z. Schreibtischtest. AnzahlWorte.B. z. aendere.8 Integrierte Dokumentation. wenn nur ein Attributwert eines Objektes gespeichert wird.B. isVerheiratet. 4 Generell ist Groß-/Kleinschreibung zu verwenden. aPoint. z. – beginnen in der Regel mit einem Verb. verschiebeRechteck. speichernDruckknopf usw. 10 Objektnamen – beginnen immer mit einem Kleinbuchstaben.B.8-3: Richtlinien und Konventionen für Bezeichner 1 Bezeichner (identifier) sind natürlichsprachliche oder problemnahe Namen oder verständliche Abkürzungen solcher Namen. z. – beginnen im Deutschen mit einem Großbuchstaben. – enden in der Regel mit dem Klassennamen. eyeColor.B. /Wahn 96/ – von GUI-Interaktionselementen beginnen kleingeschrieben mit zugeordneten Attributnamen der Fachkonzeptklasse gefolgt von dem Namen des Interaktionselements. z. müssen aber bei der Transformation in JavaProgramme entfernt werden. Ausnahme: Allgemein übliche englische Begriffe. z. Verbalisierung. nameTextfeld. WindGeschw. Ausnahme: UML-Notation. 5 Zwei Bezeichner dürfen sich nicht nur bezüglich der Groß-/Kleinschreibung unterscheiden. 7 Wird die deutsche Namensgebung verwendet. – heißen isAttributname. z.LE 5 2. z. Seminar.B.B. 12 Operationsnamen – beginnen immer mit einem Kleinbuchstaben. zeigeFigur. 6 Es wird entweder die deutsche oder die englische Namensgebung verwendet. 2. zusätzlich kann ein Adjektiv angegeben werden.B. 11 Attributnamen – beginnen im Englischen immer mit einem Kleinbuchstaben. – beginnen bei anonymen Objekten mit ein. push. – heißen getAttributname. erster. dann beginnt jedes Wort mit einem Großbuchstaben. 2 Jeder Bezeichner beginnt mit einem Buchstaben: der Unterstrich (_) wird nicht verwendet. – sind detailliert zu beschreiben. nameField. 9 Klassennamen – beginnen immer mit einem Großbuchstaben. – bestehen aus einem Substantiv im Singular. 8 Besteht ein Bezeichner aus mehreren Wörtern.. isVerschlossen. a usw. wenn das Ergebnis nur wahr (true) oder falsch (false) sein kann. dann ist auf Umlaute und »ß« zu verzichten. gefolgt von einem Substantiv. – die für eine GUI-Klasse stehen.B. CASE Abb. nameFuehrungstext. Ausnahme: UML-Notation.

} //Schreibende Operationen /** @param Name neuer Firmenname */ public void setFirmenname (String Name) { Firmenname = Name. //Bei jeder Objekterzeugung wird AnzahlKunden um //Eins erhöht AnzahlKunden = AnzahlKunden + 1. Firmenadresse. } LE 5 169 . private int Auftragssumme = 0. Firmenadresse = Adresse.0 / 8.2. } //Kombinierte Schreiboperation /** Firmenname und Firmenadresse können geändert werden. } /** @param Adresse neue Firmenadresse */ public void setFirmenadresse (String Adresse) { Firmenadresse = Adresse.8. * initialisiert es mit dem Firmennamen * und erhöht den Kundenzähler * @param Name Firmenname */ public Kunde(String Name) { Firmenname = Name. //Objektattribute private String Firmenname.4.98 */ public class Kunde { //Klassenattribut static int AnzahlKunden = 0.2 Prinzip der Verbasilierung * @author Helmut Balzert * @version 1. } /** @param Summe neue Auftragssumme */ public void setAuftragssumme(int Summe) { Auftragssumme = Summe. //Konstruktor /** Erzeugt ein neues Objekt. String Adresse) { Firmenname = Name. * @param Name neuer Firmenname * @param Adresse neue Firmenadresse */ public void aendernAdresse (String Name.

Die vollständige von Javadoc generierte Dokumentation befindet sich auf der CD-ROM 1.8.8-4 und 2.2 bis 3. ein Attribut ist nicht oder doppelt deklariert). } } Das Java-Programm Javadoc generiert aus den Dokumentationsangaben eine HTML-Dokumentation. 170 .LE 5 2. unzulässiger Bezeichner usw. 2. Verbalisierung. } /** @return Firmenadresse */ public String getFirmenadresse() { return Firmenadresse. Da es mehrere Versionen von Javadoc gibt. Das Programm kann gegen die Syntax der Sprache verstoßen (z.8 Integrierte Dokumentation.java dann erhält man die in den Abb. 2.B.B. CASE //Lesende Operationen /** Klassenoperation zum Ermitteln der Anzahl der Kunden * @return AnzahlKunden = aktuelle Anzahl der Kunden */ public static int getAnzahlKunden() { return AnzahlKunden. Das Fehlersuchen und das Fehlerentfernen bezeichnet man als debugging (entwanzen).8-5 in Auszügen dargestellte HTML-Dokumentation der Klasse Kunde.5 Beim Schreiben und Eingeben eines Programms können verschiedene Arten von Fehlern auftreten.3 Schreibtischtest und debugging Kapitel 3. Schreibtischtest. Startet man Javadoc mit folgenden Parametern javadoc –package –author –version Kunde. } /** @return Firmenname */ public String getFirmenname() { return Firmenname. oder es kann eine Verletzung der Semantik vorliegen (z.). } /** @return Auftragssumme */ public int getAuftragssumme() { return Auftragssumme. muß die jeweilige Dokumentation zu Rate gezogen werden. falscher Klassenaufbau. Es gibt verschiedene Einstellmöglichkeiten für Javadoc. cass statt class.

2. 2.8-4: Ausschnitt aus der generierten HTMLDokumentation Abb.2 Prinzip der Verbalisierung LE 5 Abb.8.2.8-5: Ausschnitt aus der generierten HTMLDokumentation 171 .

d. markiert. Dadurch ist es möglich. den genauen Programmablauf zu verfolgen. die die Java-VM dem Benutzer in mehr oder weniger präziser Art mitteilt. Neben solchen Laufzeitfehlern. d. 172 Definitionsphase .h. Bei einer objektorientierten Software-Entwicklung wird anschließend ein sogenanntes objektorientiertes Analysemodell. wenn keine Syntaxfehler mehr vorhanden sind.oder trace-Modus (verfolgen). d. Dann liegt ein logischer Programmfehler vor. CASE Fehlerlokalisierung Abschnitt 2. an der der Fehler vermutlich entstanden ist. die erst bei der Abarbeitung des Programms festgestellt werden. indem er einen Fehlertext ausgibt und die Stelle. Schreibtischtest. kann es aber auch sein.h. das Programm ist falsch oder teilweise falsch.1 Solche Fehler stellt der Compiler fest und meldet dem Benutzer diese Fehler. d.out. jede Anweisung eines Programms oder Teile eines Programms werden bei der Ausführung mit den jeweiligen Werten protokolliert. an welcher Stelle das Programm falsch ist.bzw. daß ein Programm einwandfrei abgearbeitet wird.8 Integrierte Dokumentation.B.8.h. dann gibt es mehrere Möglichkeiten.LE 5 2.h. um den Fehler einzukreisen und zu lokalisieren: a Man führt einen Schreibtischtest durch. Division durch Null. d. 2.h. man fügt Anweisungen folgender Form in das Programm ein: System. Verbalisierung. Ein Programm wird erst dann ausgeführt. d. Fehler.4. In der Definitionsphase wird zuerst ein meist verbales. Die sich jeweils ergebenden Attributwerte trägt man in die Liste ein. die Ergebnisse aber nicht oder nur zum Teil mit den erwarteten Ergebnissen übereinstimmen. Neben Syntaxfehlern können aber auch sogenannte Laufzeitfehler auftreten. z. man legt sich eine Liste aller Attribute an und führt dann das Programm »»mit Hand« Schritt für Schritt aus.println("Attributname " + Attributname). Findet man den Fehler beim Durchmustern des Programms nicht. Auch ist es möglich Haltepunkte zu definieren. Dabei erkennt man oft. c Manche Compiler und Programmierumgebungen ermöglichen die Einschaltung eines debugging. Programmierungsphase. kurz OOA-Modell genannt.4 Einsatz eines CASE-Werkzeugs Eine professionelle Software-Entwicklung durchläuft von den Anforderungen des Auftraggebers bis hin zum fertigen Software-Produkt mindestens folgende drei Entwicklungsphasen: s Definitionsphase s Entwurfsphase s Implementierungs.h. umgangssprachliches Pflichtenheft erstellt. An diesen Stellen wird der Programmablauf angehalten und alle Attributwerte können inspiziert werden. b Man läßt die Werte von Attributen an verschiedenen Programmstellen ausdrucken.

Im OOD-Modell werden die GUI-Klassen hinzugefügt. Leerzeichen werden entfernt.4 Einsatz eines CASE-Werkzeugs LE 5 entwickelt. In GO können für die Bezeichner auch Umlaute und Leerzeichen verwendet werden. In diesem Buch wird im wesentlichen das selbstentwikkelte Werkzeug GO verwendet.und Objektdiagramme. Sie werden beim Übergang in die Entwurfsphase automatisch umgewandelt bzw. daß man sich auf das Fachkonzept konzentriert und auch dort zunächst von Details abstrahiert. Es erlaubt in der Definitionsphase ein OOA-Modell zu erfassen. OOA-Modelle werden mit Hilfe von CASE-Werkzeugen erfaßt.und Auftragsverwaltung. Abb. um die Diagramme und ihre Textergänzungen zu erfassen. Beim Erfassen eines Klassendiagramms soll man sich in der Definitionsphase zunächst auf die Fachkonzept-Klassen. Ein OOA-Modell umfaßt heute das Klassendiagramm der Fachkonzept-Klassen in UML-Notation sowie ergänzend unter Umständen Sequenz-.Entwurfsphase te ergänzt und verfeinert. Ebenfalls werden noch keine Parameter und keine Konstruktoren angegeben. Das Werkzeug GO erzeugt aus einem OOA-Modell automatisch ein OOD-Modell.8-6 zeigt das OOA-Klassendiagramm der Kunden. Sie werden aber erst im Entwurfsdiagramm angezeigt. wie diese 173 . Zu jedem Attribut und jeder Operation können die Sichtbarkeiten wie private (-). 2. es wird die Datenhaltung modelliert und die fehlenden Informationen wie Parameter. protected (#) und public (+) festgelegt werden. werden ergänzt. Bei den Operationen werden die Standardoperationen get und set nicht angegeben. Diese Werkzeuge stellen Diagramm-Editoren zur Verfügung. Wichtig in dieser Phase ist. Kollaborations. Konstruktoren usw. Auf den beigefügten CD-ROMs finden Sie mehrere solcher CASEWerkzeuge. Es entsteht ein objektorientiertes Entwurfsmodell. In Klammern ist angegeben. kurz OOD-Modell genannt. Sie werden später automatisch ergänzt. Die Typen der Attribute und die Anfangswerte können angegeben werden.8. 2. ihre Attribute und Operationen sowie die Assoziationen zwischen den Klassen konzentrieren. Abb. Bei diesem Transfer werden die Bezeichner wie oben angegeben modifiziert.8-6: OOAKlassendiagramm der Kundenund Auftragsverwaltung In der Entwurfsphase wird das OOA-Modell um technische Aspek.2.

174 .LE 5 2. Bei jeder Operation können die Operationsrümpfe bereits programmiert werden. wenn es sich um kleine überschaubare Implementierungen handelt. Dies ist aber nur dann sinnvoll. 2. 2. Es werden die Anpassungen an die jeweils verwendete Programmiersprache vorgenommen. Hilfsarbeiten werden dem Entwickler abgenommen.8 Integrierte Dokumentation. Abb. Außerdem werden die Operationen vollständig implementiert. Abb. Der Einsatz eines CASE-Werkzeuges unterstützt also eine systematische Vorgehensweise. was zu implementieren ist.8-7: OODKlassendiagramm der Kundenund Auftragsverwaltung Implementierungsphase Vorteile von CASE In der Implementierungsphase wird aus dem OOD-Modell das fertige Programm erstellt. aus dem OOD-Modell ein Java-Programm und/oder ein C++-Programm zu generieren. Sonst wird ein Kommentar angegeben.8-7 zeigt das OOD-Modell. Der generierte Quellcode für die einzelnen Klassen kann anschließend mit der gewählten Programmierumgebung weiter bearbeitet und fertiggestellt werden. CASE Informationen in der UML grafisch dargestellt werden. der spezifiziert. Schreibtischtest. Man sieht im Vergleich zum OOA-Modell die Erweiterungen und Verfeinerungen deutlich. Bei Java kann außerdem noch die Javadoc-Dokumentation mit erzeugt werden. Das Werkzeug GO erlaubt es. Im OOD-Modell werden von GO automatisch Standardkonstruktoren ergänzt. Verbalisierung. um von den Kundenanforderungen bis hin zum Software-Produkt zu gelangen und erfordert zur richtigen Zeit die notwendigen Entscheidungen.

Java-Programme sollten so dokumentiert werden. 2. Buchstabe klein: name s Typ: Kleingeschrieben: int. Kardinalität Legt die Wertigkeit einer →Assoziation fest. erster usw. die einer Klasse zugeordnet ist (nicht einem daraus erzeugten Objekt). Eine Assoziation modelliert stets Beziehungen zwischen Objekten. Jede Java-Anwendung muß in genau einer Klassse eine Klassenoperation main() enthalten. Programme und Dokumente werden nicht nur vom Autor gelesen. eine Aufgabenbeschreibung.8-3) einzuhalten. Es ist daher wichtig. Es ist jedoch üblich. welche Funktion ein Objekt in einer →Assoziation innehat. float s Operation: Kleingeschriebenes Verb gefolgt von Substantiv: erstelleRechnung. 175 . nicht zwischen Klassen. zur Softwaresondern bei industriellen Software-Entwicklungen von vielen Perso. Bei der Namensgebung sind bereits die Richtlinien und Konventionen für Bezeichner (Abb. Die Art der Assoziation wird durch ihre →Kardinalität angegeben. Klassenoperation Operation. kann nicht auf ein einzelnes Objekt der Klasse angewandt werden. 1. Buchstabe groß: Firma s Referenz-Attribut: Name im Singular. Sie beschreibt auf Klassenebene die Beziehungen zwischen Objekten. nicht einzelnen Objekten Attribute und Operationen zuzuordnen. daß eine HTML-Dokumentation automatisch erstellt werden kann. In einem Programmvorspann sind mindestens der Programmname. obwohl streng genommen die Objekte dieser Klasse gemeint sind. Manipuliert →Klassenattribute der eigenen Klasse. sondern eine Klasse durch Klassenattribute und Klassenoperationen zu beschreiben. wenn ein Attributwert für alle Objekte einer Klasse existiert (→Klassenoperation). Auf Programmierebene sind die Richtlinien für die Formatierung (Abb. von einer Assoziation zwischen Klassen zu sprechen. Klassenattribut Beschreibt Eigenschaften einer Klasse. d. Zusätzlich kann durch eine Rolle die Funktion eines Objekts in einer Assoziation festgelegt werden. daß das Prinzip der integrierten Dokumentation und das Prinzip der Verbalisierung eingehalten werden. mit der die Anwendung gestartet wird. vorangestellt: ein. Kurz gefaßt ist folgende Bezeichnerwahl vorzunehmen: Namenswahl s Klasse: Name im Singular. Rolle Gibt an. 2. geeignete Kommentare und Verwendung einer selbstdokumentierenden Programmiersprache. Liegt vor. LE 5 In einer Reihe von Problemfällen ist es sinnvoll. nicht eines Objektes.8-1) zu beachten. die Anzahl der an einer Assoziation beteiligten Objekte. Buchstabe groß: Name englisch: 1.Glossar/Zusammenhänge Assoziation Modelliert Verbindungen zwischen Objekten einer oder mehrerer Klassen. der Autor und die Versionsnummer aufzuführen.h. deutsch: 1.: eineFirma s normales Attribut: Problemnahe Bezeichnung. Ein weiteres wichtiges Konzept der Objektorientierung ist die Assoziation. mnemonische Bezeichnerwahl. Durch Kardinalitäten wird die Wertigkeit von Assoziationen spezifiziert. Verbalisierung Verbesserung der Lesbarkeit eines Programms durch aussagekräftige.Technik nen.

23–25 Analytische Aufgaben Muß-Aufgabe 5 Minuten 1 Lernziel: In Java-Programmen die Konzepte Klassenattribute und -operationen problemgerecht einsetzen können.. in: Der Entwickler. Gegeben sei folgendes Java-Programm: class KlasseA { private int A1 = 0. Java – Die Spezifikation der virtuellen Maschine. Gegen welche Programmierregel wird in der folgenden Java-Klasse verstoßen? public class Zahl { //Attribut int Wert1 = 10.und Kollaborationsdiagramme sowie durch Arbeitsspeicherdarstellungen veranschaulichen können. Variablenbezeichner in Programmen. } static void setWert1(int Wert) { Wert1 = Wert. Yellin 97/ Lindholm T. //Konstruktor Zahl() { } //Operationen static int getWert1() { return Wert1. S. S. Juli/August 1996. Bonn: Addison Wesley Verlag 1997 /Wahn 96/ Wahn M.. private String A2. } } Muß-Aufgabe 30 Minuten 2 Lernziel: Dynamische Abläufe durch Sequenz.. Nov. in: Softwaretechnik-Trends. } } public class KlasseB { 176 . Yellin F. } public int getA1() { return A1.. Was ist guter Programmierstil?. 1997. public KlasseA(String eineKette) { A2 = eineKette. 58–60 /Wendorff 97/ Wendorff P.LE 5 Literatur/Aufgaben /Lindholm.

out. Betrachten sie folgende Aufrufe: Rechteck.System. e In welchen Fällen wird gegen die Richtlinien und Konventionen für Bezeichner verstoßen. einRechteck. EineP = new Person("Mustermann"). 177 . Die Richtlinien und Konventionen für Bezeichner und für die Formatierung beim Schreiben von Programmen einhalten können.6-7) während der Ausführung des Programms dar..Aufgaben public static void main(String args[]) { KlasseA erstesA.setFarbe("Schwarz"). c Stellen Sie den Arbeitsspeicher (analog zu Abb.println(x). GetName(). public void GetName() { return nachname. Verbessern Sie das Programm an den entsprechenden Stellen. b Erklären Sie anhand des Klassendiagramms die dynamischen Vorgänge bei der Ausführung des Programms. 4 Lernziel: In Java-Programmen die Konzepte Klassenattribute und -operationen problemgerecht einsetzen können. b Formulieren Sie ein zugehöriges Hauptprogramm in einer Anwendungsklasse.setFarbeFuerAlle("Rot").getA1().. 2. }}. so daß diese Aufrufe gültig sind.println("Person: ") Person EineP. String vorname. } } LE 5 a Zeichnen Sie für das gegebene Programm ein Klassendiagramm in UML-Notation. public void static main(String args[]) { System. in der die obigen Anweisungen enthalten sind. . 3 Lernziele: Vorgegebene Java-Programme auf die Einhaltung der behandelten Syntax prüfen können. } String nachname.. Zahl = erstesA. String x = EineP . Klausur-Aufgabe 25 Minuten b Ist das Programm nach Beseitigung der Syntax-Fehler ausführbar? c Handelt es sich um ein Java-applet oder eine Java-Anwendung? d Formatieren Sie den Quellcode nach den in dieser Lehreinheit vorgestellten Richtlinien. a Markieren und verbessern Sie die Syntaxfehler im vorgegebenen Quellcode: class Person{ public void Person (StringName) { nachname = Name }. int Zahl. erstesA = new KlasseA("Test"). Konstruktive Aufgaben Muß-Aufgabe 20 Minuten a Schreiben Sie eine zugehörige Klasse.out.

} } Muß-Aufgabe 45 Minuten Muß-Aufgabe 20 Minuten 178 . float ersteZahlung) { Kontonr = Nummer. } // Operationen public void buchen(float Betrag) { Kontostand = Kontostand + Betrag. /2/ Der MWST-Satz muß geschrieben und gelesen werden können. Holen Sie über die Verbindung zum Kunden den Firmennamen und die Firmenadresse. Übersetzen Sie das Java-Programm und führen Sie es aus. Ergänzen Sie dazu die Klasse Auftrag um eine Operation erstelle Rechnung. Kontostand = ersteZahlung. c Legen Sie zwei Kunden-Objekte mit jeweils einem Auftrag an und erstellen Sie für beide Aufträge eine Rechnung. } public float getKontostand() { return Kontostand. so daß lauffähige Java-applets und Java-Anwendungen entstehen. Folgende Anforderungen müssen zusätzlich erfüllt werden: /1/ Der aktuelle volle MWST-Satz muß bei der Klasse Auftrag gespeichert werden können. Betrachten Sie die folgende Java-Klasse: public class Konto { // Attribute protected int Kontonr. a Zeichnen Sie für das Programm KundenUndAuftragsverwaltung1 aus Abschnitt 2.7. Die behandelten Programme auf analoge Aufgaben übertragen und modifizieren können. // Konstruktor public Konto(int Nummer. protected float Kontostand. Die Firma ProfiSoft möchte mit der KundenUndAuftragsverwaltung auch die Rechnungen erstellen. a Erweitern Sie das Programm KundenUndAuftragsverwaltung so.2 ein Sequenzdiagramm. 6 Lernziele: In Java-Programmen die Konzepte Klassenattribute und -operationen problemgerecht einsetzen können. b Erweitern Sie die Klasse Auftrag um die obigen Anforderungen. b Geben Sie den Aufbau und das Ermitteln einer Verbindung als Arbeitsspeicherdarstellung an.und Kollaborationsdiagramme sowie durch Arbeitsspeicherdarstellungen veranschaulichen können. daß eine Verbindung von einem Auftrags-Objekt zu einem Kunden-Objekt hergestellt werden kann.LE 5 Muß-Aufgabe 30 Minuten Aufgaben 5 Lernziel: Dynamische Abläufe durch Sequenz. Assoziationen mit der maximalen Kardinalität 1 in Java programmieren können. 7 Lernziel: Eigene Programme gut dokumentieren und verbalisieren können.

public class TextGUI extends Applet { public void init() { setSize(344. public void start() { einTextfeld. Java-applets wie die »Kundenverwaltung« in analoge Java-Anwendungen transformieren können.setText("Hallo Welt").applet und Java-Anwendung aus dem applet. import java.awt. add(einTextfeld). wird die GUI-Klasse vom JavaInterpreter aufgerufen. Wird die GUI-Klasse aus HTML aufgerufen. CASE-Werkzeuge zur Darstellung der UML-Notation einsetzen können.applet. add(new Label("Text")). 10 Lernziele: Aus einem Pflichtenheft ein Klassendiagramm in UML-Notation erstellen und dieses Diagramm anschließend in ein Java-Programm transformieren und um Operationsanweisungen ergänzen können. einTextfeld = new TextField(20). Ergänzen Sie das in Aufgabe 8 der Lehreinheit 4 erstellte Java-applet zur Verwaltung von Western-Reitturnieren folgendermaßen: a Dokumentieren Sie den Quelltext unter Beachtung der Dokumentationsrichtlinien.141). Wie lautet der Befehl zum Generieren mit allen Optionen? 8 Lernziele: Eigene Programme gut dokumentieren und verbalisieren können. Das folgende Java-applet stellt einen Text in einem Textfeld dar. import java. soll das Programm als applet funktionieren.Aufgaben a Dokumentieren Sie den Quelltext unter Beachtung der Dokumentationsrichtlinien mit Kommentaren für Javadoc. Muß-Aufgabe 90 Minuten 179 . } TextField einTextfeld.*. b Transformieren Sie das applet in eine lauffähige Java-Anwendung.*. Eigene Programme gut dokumentieren und verbalisieren können. c Geben Sie mit Javadoc eine HTML-Dokumentation aus. 9 Lernziel: Java-applets wie die »Kundenverwaltung« in analoge Java-Anwendungen transformieren können. analoge Javaapplets wie die »Kundenverwaltung« in Java-Anwendungen transformieren können. soll das Programm als Anwendung ablaufen. b Geben Sie mit Javadoc eine HTML-Dokumentation aus. b Erstellen Sie eine Kombination aus Java. } } LE 5 Kann-Aufgabe 30 Minuten Muß-Aufgabe 50 Minuten a Konvertieren Sie das applet in eine analoge Java-Anwendung.

dann sind die Patienten-Nr. /4/ Jede Krankenkasse kann mehr als einen Kassen-Patienten haben. Geburtsdatum. /6/ Wird ein neuer Kassen-Patient angelegt. Beachten Sie die Dokumentationsrichtlinien. Programmieren Sie zunächst nur zwei Patienten und zwei Kassen. Adresse. Patientenname. Das vom Auftraggeber vorgegebene Pflichtenheft sieht folgendermaßen aus: /1/ Über jeden Kassen-Patienten sind folgende Daten zu speichern: Patienten-Nr. Versicherten-Karte vorgelegt (ja. nein). a Erstellen Sie entsprechend dem Pflichtenheft ein Klassendiagramm in UML-Notation und erfassen Sie das Diagramm mit dem auf der CDROM 1 befindlichen CASE-Werkzeug GO. /3/ Jeder Kassen-Patient gehört zu genau einer Krankenkasse. Ein Telefon kennt seine Nutzer nicht. c Transformieren Sie das applet in eine lauffähige Java-Anwendung. /5/ Über jede Krankenkasse sind folgende Daten zu speichern: Kassennummer. Realisieren Sie insbesondere die Zugriffs. /7/ Der Versichertenname ist mit dem Patientennamen beim Erzeugen vorzubelegen. Klausur-Aufgabe 30 Minuten 11 Lernziel: Aus einem Pflichtenheft ein Klassendiagramm in UML-Notation erstellen und dieses Diagramm anschließend in ein Java-Programm transformieren und um Operationsanweisungen ergänzen können.2 Nummer : String waehlen() Eine weitere Aufgabe finden Sie auf der beiliegenden CD-ROM 1.LE 5 Aufgaben Die Firma ProfiSoft erhält den Auftrag. Geben Sie die Informationen in einem Textbereich aus. Versichertenname. Bei der Assoziation zwischen Nutzer und Telefon ist in diesem Zusammenhang nur die Richtung vom Nutzer zum Telefon von Bedeutung. »Versicherten-Karte vorgelegt« ist mit »ja« zu initialisieren. Versichertenstatus (Ziffer). ein Programm zur Verwaltung einer Zahnarztpraxis zu entwickeln. wenn der Patient gleichzeitig auch der Versicherungsnehmer ist.und Verbindungsoperationen. d Geben Sie mit GO und Javadoc eine HTML-Dokumentation aus.. Nutzer Name : String besitzt * Telefon Endgeraet Typ : int 0. 180 .. Gleichzeitig ist ein Kassen-Objekt für den Patienten mit allen Daten anzulegen und vom Patienten zur Kasse eine Verbindung herzustellen. /2/ Der Patientenname und der Versichertenname sind identisch. b Setzen Sie das Klassendiagramm in ein lauffähiges Java-applet um. und der Patientenname einzutragen. Erstellen Sie zum nachfolgend dargestellten UML-Klassendiagramm eine Java-Implementierung. Kassenname.

3 2. Attribute problemgerecht in Java unter Berücksichtigung der Java-Syntax spezifizieren können.9 2.10.1 2. ihre Werte und Operationen 204 Ausdrücke 208 Typumwandlungen 212 Referenztypen 213 2. Die verschiedenen Arten der Typumwandlungen erläutern und richtig anwenden können.4 2.5 2.10.8 müssen bekannt sein. Die Eigenschaften eines Attributs.1 2. das in einem Java-Programmkontext angegeben ist.2 2.10 2. Die definierten Typen mit ihren unären und binären Operationen einschließlich ihrer Wirkung und Syntax kennen und anwenden können. Literale und Ausdrücke richtig schreiben können. Die unterschiedlichen Möglichkeiten zur Realisierung des Delegations-Ereignis-Modells anhand von Beispielen darstellen können.10.10.6 2. verstehen anwenden beurteilen s Die Kapitel 2.2 2.10.2 bis 2. Referenztypen erklären und richtig einsetzen können.9.LE 6 2 Grundlagen der Programmierung – Ereignisse und Attribute s s s s s s s s s s Das Delegations-Ereignis-Modell anhand von Beispielen erklären können.10. Einführung in die Ereignisverarbeitung 182 Zuerst die Theorie: Das Delegations-Ereignis-Modell 182 Dann die Praxis: Ereignisse und ihre Verarbeitung in Java 185 Attribute und ihre Typen 196 Zuerst die Theorie: Eigenschaften und Verhalten von Attributen 196 Dann die Praxis: Attribute in Java 201 Die Zuweisung 202 Einfache Typen. richtig ermitteln können. Ereignisse entsprechend den dargestellten Alternativen in einem Java-Programm verarbeiten können. Die Eigenschaften von Attributen aufzählen und erklären können.10.7 181 .9.

die nur einen einzigen Abhörer zulassen. der auf einen Mausklick reagiert.LE 6 2.9. Die Registrierung bewirkt. Abb. Dazu zählen neben Mausklicks und Tastatureingaben auch Bewegungen des Mauszeigers und Veränderungen an der Größe oder Lage der Fenster. dann bedient der Benutzer das Programm durch Tastatureingaben und Mausklicks. Umgekehrt kann ein Ereignisquell-Objekt null. Die Ereignisquellen sind die Auslöser der Ereignisse. Die meisten Ereignisquellen lassen mehrere Abhörer zu. Es gibt verschiedene Konzepte.9-1. oder ein Fenster. Das Prinzip des Delegations-Ereignis-Modells zeigt Abb. Ereignisempfängern (event listeners). damit sich Abhörer registrieren können. Das Programm wird dabei über alle Arten von Ereignissen und Zustandsänderungen informiert. Eine Ereignisquelle kann beispielsweise ein Druckknopf sein. Diese Benutzeraktivitäten lösen Ereignisse aus. das mitteilt. 182 . 2. 2. wie Ereignisse in einer Programmiersprache verarbeitet werden.9 Einführung in die Ereignisverarbeitung Besitzt ein Programm eine grafische Benutzungsoberfläche. ein oder mehrere Ereignisabhörer-Objekte über ein Ereignis informieren. Ein Abhörer kann sich auch bei mehreren Quellen registrieren. 2. daß es über das Anwendungsmenü geschlossen werden soll. welche Ereignisabhörer sie informieren muß. die vom jeweiligen Betriebssystem bzw.9-1: Das DelegationsEreignis-Modell Ereignisquelle * registriereAbhoerer() abmeldeAbhoerer() hört ab informiert * Ereignisabhoerer verarbeiteEreignistyp1() verarbeiteEreignistyp2() Zwischen der Klasse Ereignisquelle und der Klasse Ereignisabhoerer besteht eine Assoziation. Man nennt sie multicast-Ereignisquellen (Mehrfachverteilungs-Quellen) im Gegensatz zu unicast-Ereignisquellen.1 Zuerst die Theorie: Das Delegations-Ereignis-Modell Das Delegations-Ereignis-Modell basiert auf Ereignisquellen (event sources) und Ereignisabhörern bzw. Der oder die Ereignisabhörer werden von der Ereignisquelle über das Eintreten eines Ereignisses informiert und können dann auf das Ereignis reagieren. In Java wird das Delegations-Ereignis-Modell verwendet.9 Einführung in die Ereignisverarbeitung 2. Ein Ereignisabhörer-Objekt kann null. Jede Ereignisquelle muß eine Operation zur Verfügung stellen. GUI-System an das Programm weitergegeben werden. Damit eine Ereignisquelle weiß. müssen sich alle Ereignisabhörer bei der Ereignisquelle registrieren. ein oder mehrere Ereignisquellen-Objekte abhören.

wenn ein entsprechendes Ereignis eintritt.2 behandelt wurde. Die Operation erzeugeTextfeld() fügt auf der Benutzungsoberfläche nach einem Knopfdruck ein Textfeld hinzu. Die Klasse AktionsAbhoerer muß ebenfalls neu erstellt werden. Dies entspricht der Operation setLink().1 Zuerst die Theorie: Das Delegations-Ereignis-Modell LE 6 daß das Ereignisquell-Objekt eine Referenz auf das Abhörer-Objekt setzt. Es wird überall dort eingesetzt.9-2: Beteiligte Klassen Klassen Button und TextField zur Verfügung. Interaktionselemente auf der Benutzungsoberfläche hinzuzufügen.Beispiel 1a ge«. die die Quelle aufruft. 2. Abb. Die Operation add() erlaubt es. in der 183 . 2. Dazu informiert ein Verleger eine Anzahl von Abonnenten über Änderungen seines Zustands. Zusätzlich muß die Ereignisquelle eine Operation zum Abmelden von Abhörern bereitstellen. Jeder Ereignisabhörer muß auf der anderen Seite Operationen zur Verfügung stellen. Diese Ereignisquellen stellen die Registrierungsoperation addActionListener() zur Verfügung. 2. Textfeld (text field).9-1 dargestellte Delegations-Ereignis-Modell kommt in verallgemeinerter Form in der Software-Technik öfter vor.9. Verallgemeinert heißt das Modell »Beobachter-Muster« (observer pattern) Muster (pattern) oder »Verleger-Abonnenten-Muster« (publisher-subscriber pattern). Sie muß eine Operation actionPerformed() zur Verfügung stellen. Die möglichen Ereignisse lassen sich zu Ereignistypen zusammenfassen.2. die von der Ereignisquelle beim Eintreten des Ereignisses aufgerufen wird. Sie baut in der für das Beispiel 1a Operation init() die Benutzungsoberfläche auf. Umgekehrt muß jeder Abhörer eines solchen Ereignisses eine Operation actionPerformed() bereitstellen. Liste (list) und Menüoption (menu item) das Ereignis ActionEvent auslösen.7. dann soll jeweils ein Textfeld mit dem Text »Hallo« auf der Oberfläche erscheinen. Die Klasse TextfeldGUI muß programmiert werden. wo der Status kooperierender Komponenten synchronisiert werden muß. Auf der Benutzungsoberfläche befinde sich ein Druckknopf »Erzeu. Ereignisquelle TextfeldGUI einAbhoerer: Aktionsabhoerer einDruckknopf: Button einTextfeld: TextField init() erzeugeTextfeld() add() Button Label: String Ereignisabhörer AktionsAbhoerer Textfield Text: String addActionListener() ( registriereAbhoerer) Java-AWT-Klasse actionPerformed() ( verarbeiteEreignistyp) Java-AWT-Klasse Die Java-Klassenbibliothek AWT (abstract window toolkit) stellt die Abb. die bei der Assoziation in Abschnitt 2.9-2 zeigt die beteiligten Klassen. Das in Abb. Beispielsweise können in Java die Ereignisquellen Druckknopf (button). Wird er gedrückt.

Wird das Button-Objekt »gedrückt«. 2. Das AktionsAbhoerer-Objekt muß sich mit Hilfe der Operation addAction Listener() bei dem Button-Objekt registrieren. Die prinzipiellen Abläufe sind in Abb. Der Ereignisabhörer ist ein Objekt der Klasse AktionsAbhoerer.9-3: Sequenzdiagramm der Ereignisverarbeitung des Beispiels 1a die Anweisungen stehen.LE 6 2. In diesem Beispiel ist die Ereignisquelle ein Objekt der Klasse Button. wenn der Druckknopf gedrückt wird. dann ruft es die Operation actionPerformed() des AktionsAbhoerer-Objekts auf.9 Einführung in die Ereignisverarbeitung Abb.9-3 dargestellt. :TextfeldGUI new Button("Erzeuge") 2 einDruckknopf :Button WebBrowser init() 1 add (einDruckknopf) 3 new AktionsAbhoerer() 4 einAbhoerer :AktionsAbhoerer addActionListener(einAbhoerer) 5 Drückt Druckknopf 6 action Performed (ein Druckknopf) einTextfeld :TextField 7 erzeugeTextfeld() new Textfield("Hallo") 8 add(einTextfeld) 8 184 . Im einzelnen läuft folgendes ab: 1 Der Web-Browser ruft die Operation init() des Objekts :TextfeldGUI auf (falls es sich um ein Java-applet handelt). die ausgeführt werden. 2.

Da sich ein Abhörer bei mehreren Quellen registrieren kann. 6 Wird vom Benutzer der Druckknopf gedrückt. Eine Möglichkeit besteht darin.266). für jeden Ereignisabhörer eine eigenständige Klasse anzulegen.2. 3 Mit add(einDruckknopf) wird das neue Objekt zur Benutzungsoberfläche hinzugefügt. 185 Beispiel 1b . //}} //Operationen public void init() { //{{INIT_CONTROLS setLayout(null). ist eine solche Parameterübergabe notwendig. setSize(426. TextField einTextfeld. Der Abhörer kann dadurch feststellen. dann ruft das Objekt einDruckknopf die Operation actionPerformed(einDruckknopf) des Objekts einAbhoerer auf.*.9. public class TextfeldGUI extends Applet { //Referenz-Attribute AktionsAbhoerer einAbhoerer. 8 Die Operation erzeugeTextfeld() legt nun ein neues Objekt der Klasse TextField an und fügt es der Benutzungsoberfläche hinzu.*.awt. 7 Innerhalb der Operation actionPerformed() wird nun die Operation erzeugeTextfeld() des Objekts :TextfeldGUI aufgerufen. /* Programmname: Ereignisverarbeitung1 * GUI-Klasse: TextfeldGUI * Beispiel für die Ereignisverarbeitung mit eigenständiger * Abhörerklasse */ import java.9. import java. einDruckknopf = new Button("Erzeuge"). 2.2 Dann die Praxis: Ereignisse und ihre Verarbeitung in Java LE 6 2 In der Operation init() wird ein neuer Druckknopf erzeugt: einDruckknopf = new Button("Erzeuge"). von welchem Objekt die Botschaft kam. Als Parameter wird der Name des Objekts – hier: einDruckknopf – übergeben.applet. 5 Anschließend wird das Abhoerer -Objekt bei der Ereignisquelle einDruckknopf registriert: addActionListener(einAbhoerer).2 Dann die Praxis: Ereignisse und ihre Verarbeitung in Java In Java kann das Delegations-Ereignis-Modell auf verschiedene Weise realisiert werden. //{{DECLARE_CONTROLS Button einDruckknopf. 4 Es wird ein AktionsAbhoerer-Objekt erzeugt.

add(einTextfeld).LE 6 2.9 Einführung in die Ereignisverarbeitung einDruckknopf.*.event. //einAbhoerer bei einDruckknopf registrieren einDruckknopf. durch Parameter wird Referenz auf den //Erzeuger dieses Objekts gesetzt AktionsAbhoerer(TextfeldGUI einTextfeldGUI) { einGUI = einTextfeldGUI.Y.setBounds(192.setBounds(36.addActionListener(einAbhoerer). //Achtung: Diese Bibliothek muß importiert werden public class AktionsAbhoerer implements ActionListener //wird von Java zur Verfügung gestellt { //Attribute TextfeldGUI einGUI. //Startwert für Y-Position des Textfeldes //Konstruktor.26). zeigt auf den //Erzeuger dieses Objekts int Merke = 26.awt.9-4. } public void actionPerformed(ActionEvent event) { //Reaktion auf das Ereignis //hier: Aufruf der Operation erzeugeTextfeld einGUI. einDruckknopf. nachdem achtmal der Druckknopf bestätigt wurde. } } /* Programmname: Ereignisverarbeitung1 * Abhörer-Klasse: AktionsAbhoerer * Beispiel für die Ereignisverarbeitung mit eigenständiger * Abhörerklasse */ import java. add(einDruckknopf).26). //}} //Neuen Abhörer erzeugen einAbhoerer = new AktionsAbhoerer(this). Merke = Merke + 26. 186 . //Referenz-Attribut. } public void erzeugeTextfeld(int Y) { //Ein Textfeld dynamisch erzeugen und anzeigen einTextfeld = new TextField("Hallo").97. } } Das damit erzeugte applet zeigt Abb. 2.98.24.setBackground(new Color(12632256)). einTextfeld.erzeugeTextfeld(Merke).

d. der CD-ROM 2 3 1 :TextfeldGUI einDruckknopf = einAbhoerer = einTextfeld = 6 10 11 :TextField :TextField 7 actionPerformed(this) 8 :Button Abb. Das bedeutet. bewirkt. 2. 4 Die Anweisung einAbhoerer = new AktionsAbhoerer(this). 3 Die Speicheradresse dieses Objekts wird in dem Referenz-Attribut einDruckknopf gespeichert. 5 Die Speicheradresse von :TextfeldGUI wird in dem Referenz-Attribut einGUI gespeichert. 2. 2. daß die Speicheradresse des Objekts :TextfeldGUI an das neu erzeugte Objekt :AktionsAbhoerer übergeben wird.9-5 dargestellt.2. 187 . daß ein neues Objekt von Button erzeugt wird.h.9. Interaktive Animation auf wie die Referenzen zwischen den Objekten aussehen.9-4: Dynamisch erzeugte Textfelder Zur Verdeutlichung dieses Programms ist in Abb. bewirkt.2 Dann die Praxis: Ereignisse und ihre Verarbeitung in Java LE 6 Abb.9-5: Objektreferenzen in Beispiel 1b 4 :AktionsAbhoerer einGUI = 5 erzeugeTextfeld(26) 9 1 Das Objekt :TextfeldGUI besitzt drei Referenz-Attribute. Als Parameter wird this übergeben. 2 Die Anweisung einDruckknopf = new Button("Erzeuge"). es zeigt jetzt eine Referenz von Objekt :AktionsAbhoerer auf das Objekt :TextfeldGUI. daß der Konstruktor der Klasse AktionsAbhoerer aufgerufen wird.

das Ereigniskonzept umzusetzen. dann löst das Objekt :Button ein Ereignis aus. schwarz dargestellt. Eine zweite Möglichkeit. Dabei wird die bisherige Referenzadresse »überschrieben«.LE 6 2. Beispiel 1c /* Programmname: Ereignisverarbeitung2 * GUI-Klasse: TextfeldGUI * Beispiel für die Ereignisverarbeitung mit innerer * Abhörerklasse */ import java. Damit »kennt« die Ereignisquelle ihren Ereignisabhörer. 11 Drückt der Benutzer erneut den Druckknopf. 188 .event. Die Java-Speicherbereinigung löscht es bei der nächsten Durchsicht der Objekte im Haldenspeicher. Allerdings wird eine neue Y-Position übergeben. d. welches Objekt ein Ereignis ausgelöst hat. da sich durch die Anweisung Merke = Merke + 26 für Y den Wert 52 ergibt.h. so daß der Abhörer weiß.awt.*. es ruft die Operation actionPerformed(this) auf und übergibt als Parameter seine eigene Adresse. Im folgenden Beispiel 1c sind die Änderungen. An dieses Objekt können daher keine Botschaften mehr geschickt werden. Beide Objekte »kennen« sich jetzt gegenseitig. 9 Das Objekt :AktionsAbhoerer schickt eine Botschaft an :TextfeldGUI und ruft die Operation erzeugeTextfeld(26) auf. die sich gegenüber Beispiel 1b ergeben. 9 und 10. Auf das zuerst erzeugte Objekt :TextField zeigt damit keine Referenz mehr. die Klassen für die Ereignisabhörer nicht als eigenständige Klassen zu schreiben.*. Eine »innere« Klasse hat Zugriff auf alle Attribute und Operationen ihrer umgebenden Klasse. d. Es wird ein neues Objekt :TextField erzeugt und die Referenz in dem Referenz-Attribut einTextfeld gespeichert.addActionListener(einAbhoerer) bewirkt.h. gelöscht.*. 8 Drückt der Benutzer den Druckknopf. import java. 10 Durch die Anweisung einTextfeld = new TextField("Hallo") wird ein Objekt :TextField erzeugt und die Referenz darauf im Objekt :TextfeldGUI gespeichert. daß das Objekt :Button eine Referenz auf seinen Abhörer übergeben bekommt. die die Ereignisquelle(n) enthält. Als Parameter wird die Y-Position des zu erzeugenden Textfeldes übergeben.applet. //Achtung: Folgende Bibliothek muß importiert werden import java. sondern als sogenannte »innere« Klassen in die Klasse einzubetten.awt. dann wiederholen sich die Aktionen 8. In dem Objekt :Button wird eine Referenz auf das Objekt :AktionsAbhoerer gespeichert. 7 Die Anweisung einDruckknopf.9 Einführung in die Ereignisverarbeitung 6 Nach Ausführung der new-Operation wird die Speicheradresse des Objekts :AktionsAbhoerer in dem Referenz-Attribut einAbhoerer des Objekts :TextfeldGUI gespeichert. besteht darin.

setSize(426. add(einDruckknopf). //}} //Neuen Abhörer erzeugen //Parameter this entfällt! einAbhoerer = new AktionsAbhoerer().9. einTextfeld. //einAbhoerer bei einDruckknopf registrieren einDruckknopf. //{{DECLARE_CONTROLS Button einDruckknopf.26). add(einTextfeld).Y.97. einDruckknopf = new Button("Erzeuge").setBounds(36.addActionListener(einAbhoerer).2.24. } //Ereignisabhörer als innere Klasse //Es wird keine Referenz auf TextfeldGUI benötigt public class AktionsAbhoerer implements ActionListener //wird von Java zur Verfügung gestellt { //Attribute //TextfeldGUI einGUI. daher keine //vorangestellte Objektangabe LE 6 189 . einDruckknopf. Entfällt! int Merke = 26.98. //}} //Operationen public void init() { //{{INIT_CONTROLS setLayout(null).266).26).setBounds(192.2 Dann die Praxis: Ereignisse und ihre Verarbeitung in Java public class TextfeldGUI extends Applet { //Referenz-Attribute AktionsAbhoerer einAbhoerer.setBackground(new Color(12632256)). // Startwert für Y-Position des Textfeldes //Konstruktor //Keine Referenzübergabe erforderlich AktionsAbhoerer() { } public void actionPerformed(ActionEvent event) { //Reaktion auf das Ereignis //hier: Aufruf der Operation erzeugeTextfeld //hier: Aufruf einer lokalen Operation. TextField einTextfeld. einDruckknopf. } public void erzeugeTextfeld(int Y) { //Ein Textfeld dynamisch erzeugen und anzeigen einTextfeld = new TextField("Hallo").

Einige Programmierumgebungen erlauben es. Oft werden dann »innere« Klassen in Java erzeugt. deren Bezeichnung folgendermaßen aufgebaut ist: UmgebendeKlasse$InnereKlasse.LE 6 2. 190 . private AktionsAbhoerer einAbhoerer. /*Programmname: Kundenverwaltung5 * GUI-Klasse: KundeGUI (Java-applet) * Klasse zur Verwaltung von Kunden mit interaktiver Eingabe */ import java.*.4 läßt sich nun so erweitern. import java.6. Merke = Merke + 26. Das Programm zeigt ebenfalls.9 Einführung in die Ereignisverarbeitung erzeugeTextfeld(Merke).6. Der Java-Compiler wandelt »innere« Klassen automatisch in eigenständige Klassen um. public class KundeGUI extends Applet { //Attribute String MerkeText. daß auch eine interaktive Eingabe möglich ist. 2. auch die Ereignisbehandlung grafisch vorzunehmen. Die Abb. dem Konstruktor der Klasse AktionsAbhoerer die Speicheradresse des erzeugenden Objekts zu übergeben (im Beispiel 1b geschah dies durch Übergabe von this). Sie ist identisch mit der Klasse Kunde im Abschnitt 2.awt. Beispiel 2 Die Kundenverwaltung1 aus Abschnitt 2. Es ist daher nicht nötig. muß er im Falle der Auftragssumme in eine Zahl gewandelt werden. //Deklarieren der Interaktionselemente //{{DECLARE_CONTROLS Label nameFuehrungstext. Die hier geänderte Benutzungsoberfläche für die Kundenverwaltung führt zu keiner Änderung der Fachkonzeptklasse. ohne einen Objektnamen angeben zu müssen. kann ein Objekt der Klasse AktionsAbhoerer auf alle Operationen von TextfeldGUI zugreifen.class).1. //Deklarieren von Referenz-Attributen private Kunde einKunde. neben der grafischen Anordnung von Interaktionselementen. int MerkeZahl. Da die Eingabe über ein Eingabefeld immer einen Text ergibt.9-6 zeigt das applet nach Drücken der Knöpfe »Speichern« und »Anzeigen«. wie eine Ereignisverwaltung von zwei Druckknöpfen möglich ist.applet. Er speichert sie in Dateien.*. } } } Da die Klasse AktionsAbhoerer Teil der Klasse TextfeldGUI ist. class (hier: TextfeldGUI$AktionsAbhoerer.

2.9.2 Dann die Praxis: Ereignisse und ihre Verarbeitung in Java

LE 6
Abb. 2.9-6: Kundenverwaltung mit interaktiver Eingabe

Label adresseFuehrungstext; Label summeFuehrungstext; TextField nameTextfeld; TextField adresseTextfeld; TextField summeTextfeld; Button speichernDruckknopf; Button anzeigenDruckknopf; //}} Label listeFuehrungstext; TextArea listeTextArea; //Operationen public void init() { //Attribute zum Merken der Ergebnissse der Botschaften String MerkeText; int MerkeZahl; //Erzeugen der Interaktionselemente und //Zuordnung von Attributwerten //{{INIT_CONTROLS setLayout(null); setSize(430,300); nameFuehrungstext = new Label("Firmenname"); nameFuehrungstext.setBounds(36,0,120,28); nameFuehrungstext.setFont(new Font("Dialog", Font.BOLD, 12)); add(nameFuehrungstext); adresseFuehrungstext = new Label("Firmenadresse"); adresseFuehrungstext.setBounds(36,36,120,28); adresseFuehrungstext.setFont(new Font("Dialog", Font.BOLD, 12)); add(adresseFuehrungstext);

191

LE 6

2.9 Einführung in die Ereignisverarbeitung summeFuehrungstext = new Label("Auftragssumme"); summeFuehrungstext.setBounds(36,72,120,28); summeFuehrungstext.setFont(new Font("Dialog", Font.BOLD, 12)); add(summeFuehrungstext); nameTextfeld = new TextField(); nameTextfeld.setBounds(168,0,228,29); add(nameTextfeld); adresseTextfeld = new TextField(); adresseTextfeld.setBounds(168,36,228,29); add(adresseTextfeld); summeTextfeld = new TextField(); summeTextfeld.setBounds(168,72,120,29); add(summeTextfeld); speichernDruckknopf = new Button(); speichernDruckknopf.setLabel("Speichern"); speichernDruckknopf.setBounds(36,240,132,26); speichernDruckknopf.setBackground(new Color(12632256)); add(speichernDruckknopf); anzeigenDruckknopf = new Button(); anzeigenDruckknopf.setLabel("Anzeigen"); anzeigenDruckknopf.setBounds(192,240,132,26); anzeigenDruckknopf.setBackground(new Color(12632256)); add(anzeigenDruckknopf); //}} //Neuen Abhoerer erzeugen einAbhoerer = new AktionsAbhoerer(this); //einAbhoerer bei speichernDruckknopf und //anzeigenDruckknopf registrieren speichernDruckknopf.addActionListener(einAbhoerer); anzeigenDruckknopf.addActionListener(einAbhoerer); } public void speichereKunde() { //Text aus Namensfeld lesen MerkeText = nameTextfeld.getText(); nameTextfeld.setText(""); //Text im Namensfeld löschen //neues Kundenobjekt erzeugen einKunde = new Kunde(MerkeText); //Adresse eintragen einKunde.setFirmenadresse(adresseTextfeld.getText()); adresseTextfeld.setText(""); //Auftragssumme eintragen //Inhalt des Eingabefeldes in eine Zahl umwandeln MerkeText = summeTextfeld.getText(); summeTextfeld.setText(""); Integer i = Integer.valueOf(MerkeText); 192

2.9.2 Dann die Praxis: Ereignisse und ihre Verarbeitung in Java MerkeZahl = i.intValue(); einKunde.setAuftragssumme(MerkeZahl); } public void anzeigenKunden() { //dynamisches Anzeigen von Führungstext und Textbereich listeFuehrungstext = new Label("Kundenliste"); listeFuehrungstext.setBounds(36,108,120,24); listeFuehrungstext.setFont(new Font("Dialog", Font.BOLD, 12)); add(listeFuehrungstext); listeTextArea = new TextArea ("",0,0,TextArea.SCROLLBARS_VERTICAL_ONLY); listeTextArea.setBounds(36,132,360,96); listeTextArea.setForeground(new Color(0)); add(listeTextArea); //Anzeigen der Attributinhalte im Textbereich MerkeText = einKunde.getFirmenname(); //Mit append wird der Text an den vorhandenen Text angehängt listeTextArea.append(MerkeText + "\n"); MerkeText = einKunde.getFirmenadresse(); listeTextArea.append(MerkeText+"\n"); MerkeZahl = einKunde.getAuftragssumme(); //Umwandlung einer ganzen Zahl in eine Zeichenkette MerkeText = String.valueOf(MerkeZahl); listeTextArea.append(MerkeText+"\n"+"\n"); } } /*Programmname: Kundenverwaltung5 * Abhoerer-Klasse: AktionsAbhoerer * Abhoerer-Klasse ist eigenständige Klasse! */ import java.awt.event.*; public class AktionsAbhoerer implements ActionListener //wird von Java zur Verfügung gestellt { KundeGUI einGUI; //Referenz-Attribut: Referenz auf Erzeuger //Konstruktor, durch Parameter wird Referenz auf aufrufendes //Objekt übergeben AktionsAbhoerer(KundeGUI einKundeGUI) { einGUI = einKundeGUI; } public void actionPerformed(ActionEvent event) { //Ereignisquelle feststellen mit getSource Object quelle = event.getSource(); if (quelle == einGUI.speichernDruckknopf) einGUI.speichereKunde();//Reaktion auf Speichern else if (quelle == einGUI.anzeigenDruckknopf) einGUI.anzeigenKunden();//Reaktion auf Anzeigen } } 193

LE 6

LE 6

2.9 Einführung in die Ereignisverarbeitung

Schließen eines Fensters

Analog wie in Abschnitt 2.6.9 kann auch hier das Programm Kundenverwaltung5 in eine Java-Anwendung transformiert werden. Es gelten die dort angegebenen Transformationsregeln. Da ein Fenster der Klasse Frame oben einen Titelbalken besitzt, müssen hier die Interaktionselemente nach unten verschoben werden. Daher wurde die Y-Position der Elemente um 30 Pixel erhöht. Um ein Fenster und damit eine Anwendung schließen zu können, die über den Anwendungsmenüknopf vom Benutzer beendet wird, gibt es in Java den Ereignistyp Window. Abb. 2.9-7 zeigt analog zu Abb. 2.9-2, welche Operationen die Ereignisquelle und der Ereignisabhörer zur Verfügung stellen.
Ereignisquelle Frame Ereignisabhörer FensterAbhoerer

Abb. 2.9-7: Behandlung von Ereignissen des Ereignistyps Window

addWindowListener()

*

*

Java-AWT-Klasse

windowClosing() windowClosed() windowActivated() windowDeactivated() windowIconified() windowDeiconified() windowOpened()

Um ein Ereignis »Fenster schließen« zu behandeln, muß der Ereignisabhörer die Operation windowClosing() zur Verfügung stellen. Analog wie ein Aktionsabhörer läßt sich ein Fensterabhörer als eigenständige Klasse programmieren:
/*Programmname: Kundenverwaltung6 * Abhoerer-Klasse: FensterAbhoerer * Abhoerer-Klasse ist eigenständige Klasse! */ import java.awt.event.*; public class FensterAbhoerer extends WindowAdapter //wird von Java zur Verfügung gestellt //Achtung: extends statt implements { KundeGUI einGUI; //Referenz-Attribut: Referenz auf Erzeuger //Konstruktor, durch Parameter wird Referenz auf aufrufendes //Objekt übergeben FensterAbhoerer(KundeGUI einKundeGUI) { einGUI = einKundeGUI; //FensterAbhoerer bei der GUI-Klasse registrieren //und Übergabe der eigenen Adresse mit this einGUI.addWindowListener(this); } public void windowClosing(WindowEvent event) { 194

2.9.2 Dann die Praxis: Ereignisse und ihre Verarbeitung in Java //Aktionen, um die Anwendung nach Auslösen des //Ereignisses zu beenden einGUI.setVisible(false); //Fenster unsichtbar machen einGUI.dispose(); //Fenster-Objekt löschen System.exit(0); //Anwendung beenden } }

LE 6

Die transformierte und ergänzte GUI-Klasse sieht folgendermaßen aus, wobei die Klassen Kunde und AktionsAbhoerer unverändert sind:
/*Programmname: Kundenverwaltung6 * GUI-Klasse: KundeGUI (Java-Anwendung) * Klasse zur Verwaltung von Kunden mit interaktiver Eingabe */ import java.awt.*; public class KundeGUI extends Frame { //Referenz-Attribut als Klassenattribut static KundeGUI einKundeGUI; //Attribute String MerkeText; int MerkeZahl; //Deklarieren von Referenz-Attributen private Kunde einKunde; private AktionsAbhoerer einAbhoerer; private FensterAbhoerer einFensterAbhoerer; //Deklarieren der Interaktionselemente //{{DECLARE_CONTROLS //analog Kundenverwaltung5 //... //}} Label listeFuehrungstext; TextArea listeTextArea; //Konstruktor analog zu init() public KundeGUI() { //Attribute zum Merken der Ergebnissse der Botschaften String MerkeText; int MerkeZahl; //Erzeugen der Interaktionselemente und //Zuordnung von Attributwerten //{{INIT_CONTROLS //analog Kundenverwaltung5 //... //}} //Neue Abhoerer erzeugen einAbhoerer = new AktionsAbhoerer(this); einFensterAbhoerer = new FensterAbhoerer(this); //einAbhoerer bei speichernDruckknopf und //anzeigenDruckknopf registrieren 195

LE 6

2.10 Attribute und ihre Typen speichernDruckknopf.addActionListener(einAbhoerer); anzeigenDruckknopf.addActionListener(einAbhoerer); //Alternative, wenn addWindowListener nicht in //FensterAbhoerer aufgerufen wird: //einFensterAbhoerer hinzufügen //addWindowListener(einFensterAbhoerer); } //Klassenoperation main public static void main(String args[]) { //Erzeugen eines Objekts von KundeGUI einKundeGUI = new KundeGUI(); einKundeGUI.resize(430,350); einKundeGUI.setVisible(true); } public void speichereKunde() { //analog Kundenverwaltung5 //... } public void anzeigenKunden() { //analog Kundenverwaltung5 //... } }

Kapitel 2.18

Ausführlich wird die Ereignisverarbeitung in Kapitel 2.18 behandelt.

2.10 Attribute und ihre Typen
2.10.1 Zuerst die Theorie: Eigenschaften und Verhalten von Attributen
Attribut

Eigenschaften eines Attributs

Attribute beschreiben die Eigenschaften von Klassen und deren Objekten. Attributwerte sind die Daten der Objekte bzw. der Klassen bei Klassenattributen. Betrachtet man Attribute etwas genauer, dann läßt sich ein Attribut durch eine Reihe von Eigenschaften kennzeichnen: s Name bzw. Bezeichner des Attributs s Typ s Wert bzw. Inhalt s Zugriffsart s Initialisierung s Sichtbarkeitsbereich s Lebensdauer s Klassen- oder Objektattribut s Restriktionen

196

2.10.1 Zuerst die Theorie: Eigenschaften und Verhalten von Attributen

LE 6

Diese Eigenschaften werden an einer Speicherzelle in Abb. 2.10-1 veranschaulicht. Die Anzahl der Speicherzellen, die zur Speicherung eines Werts benötigt wird, schreibender lesender hängt vom Typ des Attributs ab. Zugriff Zugriff Die Eigenschaften und das VerInhalt Anzahl halten eines Attributs kann man der Bezeichner ebenfalls durch eine Klasse, eine Speicherzellen Speicherzelle(n) sogenannte Metaklasse, darstellen = Typ (Abb. 2.10-2). Jedes Attribut wird durch einen Namen bzw. einen Bezeichner gekennzeichnet. Bezogen auf den Arbeitsspeicher kann man sich vereinfacht vorstellen, daß die Speicherzelle bzw. die Speicherzellen, in denen der Wert geAttribut speichert wird, mit dem Name: String Attributnamen verseTyp: int | String | … hen sind. Durch die AnWert: abhängig vom Typ Zugriffsart: variabel | konstant gabe des Bezeichners Initialisierung: ja | nein wird genau die dem Sichtbarkeitsbereich: private | public | protected Bezeichner zugeordneLebensdauer: lokal | transient | persistent Klassenattribut: ja | nein te Speicherzelle angeRestriktionen sprochen. Attribut(Initialisierung: Typ) Für jedes Attribut setInhalt(Wert: Typ) muß ein Typ festgelegt getInhalt(): Typ werden. Ein Typ legt Legende: | steht für »oder« fest, welche Attributwerte ein Attribut annehmen kann, und welche Operationen auf diesen Werten ausgeführt werden können. Durch den Typ wird auch festgelegt, wieviel Speicherplatz, d.h. wieviele Speicherzellen für die Werte benötigt werden. Für ein Zeichen (char) sind zwei Speicherzellen, für eine Zeichenkette (String), bestehend aus 20 Zeichen, sind 40 Speicherzellen erforderlich, wenn sie im Unicode vorliegen. Der Wert eines Attributs wird durch ein Literal (literal) dargestellt. Beispielsweise wird eine Zeichenkette in doppelte Anführungszeichen eingeschlossen wie "Dies ist eine Zeichenkette". Zwei Operationen können mit Speicherzellen ausgeführt werden: s Schreibender Zugriff auf eine Speicherzelle: Es wird eine Information bzw. ein Wert oder Inhalt in der Speicherzelle abgelegt. Vorher in der Speicherzelle vorhandene Informationen werden überschrieben, d.h. gelöscht. s Lesender Zugriff auf eine Speicherzelle: Es wird die in der Speicherzelle gespeicherte Information gelesen. Die gespeicherte Information bleibt dabei unverändert. Beim Lesen wird nur eine Kopie der gespeicherten Information erzeugt.
197

Abb. 2.10-1: Veranschaulichung eines Attributs

Namen, Bezeichner

Abb. 2.10-2: Eigenschaften und Verhalten eines Attributs

Typ

Literal

Schreibender Zugriff

Lesender Zugriff

LE 6

2.10 Attribute und ihre Typen

Dieses technische Speicherkonzept spiegelt sich in problemorientierten Programmiersprachen in dem Konzept der variablen und konstanten Attribute wider. Ein variables Attribut – kurz Variable genannt – ist ein Attribut, Variable dem nacheinander verschiedene Werte bzw. Inhalte zugewiesen werden können, d.h. auf eine Variable kann sowohl lesend als auch schreibend zugegriffen werden. Vor dem ersten Lesezugriff muß immer ein Schreibzugriff erfolgt sein, damit der Variablen ein definierter Wert zugewiesen ist. Konstante Ein konstantes Attribut – kurz Konstante genannt – ist ein Attribut, dem nur einmal ein Wert zugewiesen wird, der dann unveränderbar ist, d.h. auf eine Konstante kann nach der Initialisierung nur lesend zugegriffen werden. Für jedes Attribut wird außerdem festgelegt, ob und für wen es Sichtbarkeitsbereich sichtbar ist. Anstelle von Sichtbarkeit spricht man auch von Gültigkeit. Die Sichtbarkeit wird entweder explizit oder implizit festgelegt. Das Schlüsselwort private in Java gibt z.B. an, daß ein Attribut außerhalb einer Klasse nicht sichtbar bzw. nicht gültig ist. Durch die Angabe von private wird das Geheimnisprinzip sichergestellt (siehe Abschnitt 2.5.2). Implizit wird die Sichtbarkeit eines Attributs durch den Ort der Deklaration festgelegt. Ein Attribut innerhalb eines OperationsRumpfes ist beispielsweise nur innerhalb des Rumpfes sichtbar. In den meisten Programmiersprachen müssen die Attribute, bevor auf sie zugegriffen werden darf, deklariert bzw. vereinbart werAttribut- den (Attribut-Deklaration). Der Compiler verwendet diese InforDeklaration mationen, um Speicherplatz zu reservieren und Konsistenzprüfungen vorzunehmen. Werden Attribute innerhalb einer Klasse, aber außerhalb einer Operation der Klasse, deklariert, dann sind diese Attribute innerhalb der gesamten Klasse sichtbar bzw. gültig. Innerhalb von Operationen der Klasse kann direkt auf diese Attribute zugegriffen werden. Die Sichtbarkeit dieser Attribute von außerhalb einer Klasse wird im allgemeinen durch Schlüsselworte wie private, protected oder public festgelegt. In der UML wird die Sichtbarkeit durch die Symbole – für privaSichtbarkeit in der UML te, + für public und # für protected vor den Attributnamen und analog vor den Operationsnamen angegeben. Innerhalb von Operations-Rümpfen fallen oft Zwischenergebnisse an, die für Berechnungen zwischengespeichert werden müssen, aber außerhalb der Operation bzw. nach Abschluß der Operation nicht mehr benötigt werden. Für solche Zwecke können Attribute auch innerhalb von Operations-Rümpfen deklariert werden. Sie werlokale Attribute den lokale Attribute genannt und sind nur innerhalb des jeweiligen Operations-Rumpfes sichtbar und existent.

198

2.10.1 Zuerst die Theorie: Eigenschaften und Verhalten von Attributen

LE 6

Bestehen Operations-Rümpfe aus vielen Anweisungen, dann ist es sinnvoll, eine Strukturierung durch Blöcke vorzunehmen. In Java bestehen Blöcke aus einem geschweiften Klammerpaar {...}. Neben Anweisungen können in einem solchen Block auch lokale Attribute deklariert werden, die dann nur bis zum Ende des Blocks sichtbar und existent sind.
public void test() { //Dies ist ein lokales Attribut in einem Operations-Rumpf int MerkeZahl = 0; MerkeZahl = MerkeZahl + 10; { //Dies ist ein Block //Dies ist ein lokales Attribut in einem Block int MerkeZahl2 = 20; MerkeZahl = MerkeZahl + 20; //MerkeZahl ist im Block sichtbar MerkeZahl2 = MerkeZahl; }//Ende des Blocks //Ab hier ist MerkeZahl2 nicht mehr sichtbar MerkeZahl = MerkeZahl + 50; }//Ende des Operations-Rumpfs //Ab hier ist MerkeZahl nicht mehr sichtbar
Beispiel

Ein Problem tritt auf, wenn ein Attribut, das in einer Klasse dekla- Verbergen von riert ist, denselben Bezeichner hat, wie ein lokales Attribut in einer Attributen Operation oder ein Parameter einer Operation. In einem solchen Fall gilt die Regel, daß das lokale Attribut das Attribut der Klasse überdeckt bzw. verbirgt, d.h. das Attribut der Klasse ist in der Operation dann nicht mehr sichtbar. Es wird immer vorangig auf das lokale Attribut zugegriffen. In der Kundenverwaltung wurden Name und Firmenname unterschie- Beispiel den, um eine Überdeckung zu vermeiden:
public class Kunde { //Attribute private String Firmenname, Firmenadresse; private int Auftragssumme = 0; //Konstruktor public Kunde(String Name) { Firmenname = Name; } //Schreibende Operationen public void setFirmenname(String Name) { Firmenname = Name; } .... }

199

LE 6
this

2.10 Attribute und ihre Typen

Um in solchen Situationen nicht gezwungen zu sein, sich neue Namen zu überlegen, kann mit dem Schlüsselwort this ausgedrückt werden, daß das Attribut des aktuellen Objekts der Klasse und nicht das lokale Attribut gemeint ist. In der Kundenverwaltung kann dann durchgängig der Attributname Firmenname für den Namen der Firma verwendet werden:
public class Kunde { //Attribute private String Firmenname, Firmenadresse; private int Auftragssumme = 0; //Konstruktor public Kunde(String Firmenname) { this.Firmenname = Firmenname; } //Schreibende Operationen public void setFirmenname (String Firmenname) { this.Firmenname = Firmenname; }... }

Beispiel

Lebensdauer

Klassenattribut Objektattribut Restriktionen

Immer wenn das Attribut der Klasse gemeint ist, wird bei Zweideutigkeiten vor den Attributnamen this gefolgt von einem Punkt gesetzt. Die Lebensdauer eines Attributs gibt an, wie lange es im Speicher existiert bzw. ob es auf einem externen Speicher langfristig aufbewahrt werden soll. Damit ein Attribut auf einem externen Speicher gespeichert wird, sind besondere Maßnahmen erforderlich, die von der verwendeten Programmiersprache abhängen. Es werden nur Attribute einer Klasse, aber keine lokalen Attribute auf einem externen Speicher gespeichert. Wird ein Attribut einer Klasse nicht auf einem externen Speicher gespeichert, dann existiert es vom Erzeugen des entsprechenden Objekts bis zum Löschen des entsprechenden Objekts. Lokale Attribute einer Operation einschließlich Parameter der Operation existieren vom Aufruf der entsprechenden Operation bis zum Verlassen der entsprechenden Operation. Lokale Attribute eines Blocks existieren im ganzen Block. Ein Attribut kann einem Objekt oder einer Klasse (siehe Abschnitt 2.6.7) zugeordnet werden. Durch Kommentare oder durch entsprechende Konstrukte der jeweiligen Programmiersprache werden Restriktionen angegeben, die für ein Attribut gelten, z.B. daß der Wert nur zwischen 1 und 100 liegen darf.

200

2.10.2 Dann die Praxis: Attribute in Java

LE 6

2.10.2 Dann die Praxis: Attribute in Java In Java werden in der Deklaration folgende Angaben festgelegt: Java 1 Sichtbarkeitsbereich: private oder protected oder public oder private,
»friendly«

Ein Attribut einer Klasse, gekennzeichnet mit private, ist nur innerhalb der Klasse sichtbar. Die Kennzeichnung public bedeutet, daß das Attribut einer Klasse auch außerhalb der Klasse sichtbar ist. Dies sollte nur in Ausnahmefällen erlaubt werden. Auf protected wird in Kapitel 2.14 (Vererbung) eingegangen, auf Kapitel 2.14 Abschnitt 2.17.2 »friendly« in Abschnitt 2.17.2 (Pakete). 2 Objekt- oder Klassenattribut: Durch static wird angegeben, daß static es sich um ein Klassenattribut handelt. Fehlt static, dann ist es ein Objektattribut. 3 Variable oder Konstante: Eine Konstante wird durch das Schlüsselwort final gekennzeichnet. In einem solchen Fall muß die Dekla- final ration eine Attributinitialisierung enthalten. Fehlt final, dann Abschnitt 2.6.7 handelt es sich um eine Variable, die eine Initialisierung haben kann, aber nicht muß.
private final float PI = 3.141593f; (f kennzeichnet eine float-Zahl).
Beispiel

protected, public

In Java hat sich die Konvention eingebürgert, Konstanten, insbe- Bezeichner für sondere öffentliche Klassenkonstanten (public static final) Konstanten nur mit Großbuchstaben zu schreiben und notwendige Namenstrennungen durch einen Unterstrich (underscore) vorzunehmen.
public static final int VOLLE_MWST = 16;
Beispiel

4 Lebensdauer: Das Schlüsselwort transient gibt an, daß das Attri- transient but nicht persistent, d.h. nicht dauerhaft, auf einem externen Speicher aufbewahrt werden soll, sondern nach Beendigung des Programms nicht mehr existiert. Fehlt das Schlüsselwort transient, dann muß durch besondere Maßnahmen dafür gesorgt werden, daß die Attributwerte langfristig aufbewahrt werden, z.B. durch Speichern in einer Datei auf einer Festplatte. Dafür müssen aber in der Regel geeignete Programme geschrieben werKapitel 2.20 den (siehe Kapitel 2.20).
private String Geburtsdatum; private transient int Alter;
Beispiele

5 Typ des Attributs: Es wird der Typ des Attributs angegeben, z.B. Typ int. 6 Name des Attributs: Er muß der Syntax der Abb. 2.8-2 entspre- Bezeichner chen. 7 Voreinstellung des Attributs: Jede Variable kann, jede Konstante Initialisierung muß initialisiert werden.
201

LE 6

2.10 Attribute und ihre Typen

Die Syntax einer Attribut-Deklaration – in Java FieldDeclaration genannt – zeigt Abb. 2.10-3.

Abb. 2.10-3: Java-Syntax für Attributdeklarationen

FieldDeclaration , Type private public
protected

Identifier VariableDeclaratorId [ ]

;

= final

Expression ArrayInitializer

static
transient

2.10.3 Die Zuweisung Schreibende und lesende Zugriffe auf ein Attribut bzw. eine Speicherzelle werden folgendermaßen in Java beschrieben: 1 Schreibender Zugriff Ein schreibender Zugriff wird durch eine Zuweisung angegeben:
Beispiel 1a
float Radius; //Deklaration Radius Bezeichner der Speicherzelle, in die der Wert eingetragen werden soll = 5.5f ; Zeichen für Ende der Anweisung fl o a t

In vielen Programmiersprachen wird als Zuweisungszeichen ein »:=« verwendet, um deutlich zu machen, daß es sich um keine Gleichsetzung handelt, wie es ein »=«-Zeichen nahelegt. Um den Schreibaufwand zu reduzieren, verwenden Java und C++ nur das Gleichheitszeichen. Hier muß der Programmierer darauf achten, daß er nicht = (Zuweisung) und == (Vergleich auf Gleichheit) verwechselt!

Angabe, was Symbol, daß eingetragen ein Wert eingetragen wer- werden soll den soll (Zuweisungssymbol, ErgibtZeichen) Zuweisung

5.5f

Radius

Ist das Attribut vom Typ float, dann muß bei der Zuweisung einer Zahl f oder F hinter der Zahl angegeben werden, um zu kennzeichnen, daß es sich bei der Zahl um eine float-Zahl handelt, hier: 5.5f. Fehlt das f, dann ist die Zahl vom Typ double (siehe unten). Eine solche Anweisung bezeichnet man als Zuweisung (assignment), d.h. in die Speicherzelle Radius wird der Wert 5.5 eingetragen. Eine solche Zuweisung wird folgendermaßen gelesen: »Radius ergibt sich zu 5.5« oder »Radius wird 5.5 zugewiesen« oder »Radius sei 5.5«. Befand sich in der Speicherzelle Radius bereits ein Wert, dann wird er durch eine Zuweisung automatisch gelöscht, d.h. der alte Wert wird durch den neuen überschrieben.
202

2.10.3 Die Zuweisung

LE 6

2 Lesender und schreibender Zugriff auf verschiedene Attribute
static final float PI = 3.141593f; //Konstantendeklaration float Flaeche, Radius; //Variablendeklaration Ausdruck Flaeche = PI * Radius * Radius; = * *

Beispiel 1b

Flaeche

o fl

a

t

3.141593f
final PI o fl

a

t Radius

5.5f
o fl

a

t

Auf der rechten Seite der Zuweisung steht ein Ausdruck, der aus Ausdruck drei Operanden und zwei Operatoren besteht. Auf die Speicherzelle PI wird einmal, auf die Speicherzelle Radius zweimal lesend zugegriffen. Im Prozessor des Computersystems werden die gelesenen Werte entsprechend den Operatoren (zwei Multiplikationen) miteinander verknüpft und dann das Ergebnis in die Speicherzelle Flaeche eingetragen. Auf alle Attribute, die rechts vom Zuweisungssymbol (=) stehen, wird immer nur lesend zugegriffen, auf das links vom Zuweisungssymbol stehende Attribut immer schreibend. Bevor das erste Mal lesend auf ein Attribut zugegriffen wird, muß sichergestellt sein, daß dem Attribut bereits ein Wert zugewiesen worden ist. 3 Lesender und schreibender Zugriff auf dasselbe Attribut
int Zaehler; //Deklaration Zaehler = Zaehler + 1;
+1

Beispiel

Zuerst wird der Wert 100 aus der Speicherzelle Zaehler gelesen, dann eine Eins hinzuaddiert und der neue Wert in die Speicherzelle Zaehler zurückgeschrieben.

100
Zaehler in

t

Die Java-Syntax für Zuweisungen zeigt Abb. 2.10-4. Auf der linken Seite muß immer ein Variablenname stehen. Konstanten müssen in der Deklaration initialisiert werden. Neben dem einfachen Zuweisungsoperator = gibt es noch folgende zusammengesetzte Operatoren: +=, –=, *=, /=, %=, <<=, >>=, >>>=, &=, ^= und |=. Ein solcher Operator E1 op= E2 ist äquivalent zu E1 = E1 op E2.
Zaehler = Zaehler + 1; // abgekürzt: Zaehler += 1 Zaehler = Zaehler - 1; // abgekürzt: Zaehler –= 1; MWST = MWST * 1.16f; // abgekürzt: MWST *= 1.16f;
Beispiele

Da die Verwendung der zusammengesetzten Operatoren zu ei- Empfehlung nem unübersichtlichen Programmierstil führt, sollten sie nur in Ausnahmefällen verwendet werden.
203

LE 6

2.10 Attribute und ihre Typen

Abb. 2.10-4: Java-Syntax für Zuweisungen

Assignment LeftHandSide = += –= … LeftHandSide ExpressionName FieldAccess ArrayAccess AssignmentExpression Assignment ConditionalExpression AssignmentExpression

Bevor auf Ausdrücke näher eingegangen wird, werden die einfachen Typen und die ihnen zugeordneten Operationen behandelt. 2.10.4 Einfache Typen, ihre Werte und Operationen Einfache Typen (primitive types) sind in Java vordefiniert und besitzen festgelegte Schlüsselwörter (Abb. 2.10-5).
Abb. 2.10-5: Java-Syntax für einfache Typen

PrimitiveType NumericType boolean

NumericType IntegralType FloatingPointType

IntegralType byte short int long char
boolean

FloatingPointType float double

Der Wert einer Variablen, die einen einfachen Typ besitzt, kann nur durch eine Zuweisung an diese Variable geändert werden. Der Typ boolean ist in Java – wie in den meisten anderen Programmiersprachen auch – vordefiniert. Ein Attribut vom Typ boolean kann jeweils einen der Wahrheitswerte true oder false annehmen. Die möglichen Operationen sind in Abb. 2.10-6 aufgeführt.
204

2.10.4 Einfache Typen, ihre Werte und Operationen LE 6

Wertebereich (plattformunabhängig) true oder false (beides sind Schlüsselwörter und werden als boolesche Literale bezeichnet). Voreinstellungswert (default value) false, wenn keine explizite Initialisierung erfolgt. Binäre Operationen (Operand1 Operator Operand2) Operator Erklärung Beispiel == Gleichheit 7 == 8 ergibt false != Ungleichheit 5 != 5 ergibt false & logisches UND true & true ergibt true | logisches ODER false | false ergibt false ^ logisches XODER false ^ true ergibt true Unäre Operationen (Operator Operand) ! boolesche Negation !true ergibt false Die Ergebnisse der Operationen &, | und ^ lauten: x false true false true y false false true true x&y false false false true x|y false true true true x^y false true true false !x true false true false

Abb. 2.10-6: Der Typ boolean in Java

In Java werden boolesche Ausdrücke mit & und | immer vollständig ausgewertet. Bei einer &-Operation kann man aber bereits aufhören, wenn der erste Operand falsch ist. Der gesamte Ausdruck kann nur noch falsch sein. Will man eine solche verkürzte Auswertung, dann muß man die Operation && benutzen. Bei einer |-Operation kann man die Auswertung beenden, wenn der erste Operand wahr ist. Eine verkürzte Auswertung erreicht man durch die Operation ||. Beispiele Bei dem zusammengesetzten Ausdruck (7 == 10) & (8 != 9) genügt bereits die Auswertung des ersten Operanden (7 == 10), um festzustellen, daß der gesamte Ausdruck falsch ist. Der Teilausdruck (8 != 9) müßte daher nicht mehr ausgewertet werden. Dies erreicht man durch eine verkürzte Auswertung: (7 == 10) && (8 != 9). Da es in Java jedoch erlaubt ist, in einem Ausdruck eine Zuweisung vorzunehmen, kann in solchen Fällen eine vollständige Auswertung nötig sein: boolean Ungleich; //Deklaration eines booleschen Attributs (7 == 10) & (Ungleich = 8 != 9). Bei der vollständigen Auswertung erhält Ungleich den Wert true. Bei einer verkürzten Auswertung wird nach (7 == 10) abgebrochen und Ungleich behält den impliziten Voreinstellungswert false. Aus der Definition ergeben sich folgende Gesetze, die in der Praxis oft nützlich sind: x|y=y|x Kommutativgesetze x&y=y&x Assoziativgesetze s (x | y) | z = x | (y | z) (x & y) & z = x & (y & z) Distributivgesetze s (x & y) | z = (x | z) & (y | z) (x | y) & z = (x & z) | (y & z) de Morgansche Gesetze s !(x | y) = !x & !y !(x & y) = !x | !y
s

Die Wertebereiche der ganzzahligen Typen (integral types) umfassen nur Teilbereiche der ganzen Zahlen (Z). Ihre Wertebereiche und Operationen sind in Abb. 2.10-7 zusammengestellt.
205

LE 6

2.10 Attribute und ihre Typen

Wertebereich (plattformunabhängig) Typ Kleinster Wert byte 0 short -32.768 int -2.147.483.648 long -9.223.372.036.854.775.808 char \u0000 (0)

Größter Wert 255 32.767 2.147.483.647 9.223.372.036.854.775.807 \uffff (65535)

Speicherplatz 1 Byte 2 Bytes 4 Bytes 8 Bytes 2 Bytes

Voreinstellung 0 0 0 0L \u0000

Ganzzahlige Werte werden als »IntegerLiteral« dargestellt. Vier Darstellungsarten sind möglich: Dezimaldarstellung: Ziffernfolge, z.B. 110 Oktaldarstellung: Ziffernfolge mit vorangestellter Null, z.B. 0156 Hexadezimaldarstellung: Ziffernfolge mit vorangestelltem Nullx, z.B. 0x6E Literal vom Typ long: Ziffernfolge mit nachgestelltem L bzw. l, z.B. 110 L Zeichen werden in einfachen Anführungszeichen dargestellt, z.B. 'A'. Spezielle Zeichen werden mit vorangestellten »\« geschrieben, z.B. '\n' (neue Zeile), '\t' (Tabulator), '\udddd' (Unicode-Zeichen). Binäre Operationen (Operand1 Operator Operand2) Operator Erklärung Beispiel Arithmetische Operationen (Typ des Ergebnisses: int oder long) + Addition 5 + 6 ergibt 11 – Subtraktion 9 – 3 ergibt 6 * Multiplikation 10 * 15 ergibt 150 / Division 13/3 ergibt 4 % Modulo (Rest der Division) 20 % 7 ergibt 6 Vergleichsoperationen (Typ des Ergebnisses: boolean) < Kleiner 3 < 5 ergibt true <= Kleiner gleich 3 < = 3 ergibt true > Größer 2 > 10 ergibt false >= Größer gleich 15 > = 16 ergibt false == Gleich 3 = = 3 ergibt true != Ungleich 5 ! = 5 ergibt false Die Division bedeutet reellwertiges Dividieren und nachfolgendes Abschneiden hinter dem Dezimalpunkt. Die Rundung erfolgt also stets in Richtung der Null auf der Zahlengeraden. Die Modulo-Operation dient zur Restberechnung bei einer ganzzahligen Division. Sie erfüllt die Gleichung A = (A/B) * B + (A % B) Unäre Operationen (Operator Operand) Operator Erklärung – Unäre Negation ~ Bitweises Komplement ++ Inkrement –– Dekrement Beispiel –3 ~ 101 ergibt 010 ++ A steht für A = A + 1 – – A steht für A = A – 1

In einer Anweisung bedeutet A = ++ B, daß B + 1 vor der Zuweisung ausgeführt wird. In einer Anweisung bedeutet A = B ++, daß B + 1 erst nach der Zuweisung von B an A erhöht wird. Analog gelten diese Regeln für – –. Hinweis: Zusätzlich gibt es noch die bitweisen Operatoren &, |, ^, <<, >>, >>>, ~, << =, >> =, >>> =, & =, |= und ^=, die hier aber nicht behandelt werden.

Abb. 2.10-7: Ganzzahlige Typen in Java

In vielen Anwendungsbereichen – insbesondere in der Mathematik – wird jedoch ein Typ benötigt, der reelle Zahlen (R) näherungsweise als Kommazahlen wiedergibt. In Java gibt es für diese Zwecke die Gleitpunkt-Typen float und double, die numerisch-reelle Zahlen als Wertebereich umfassen. Bei float- und double-Attributen handelt es sich um gebrochene Zahlen, d.h. um Zahlen, die Stellen hinter dem Komma haben können (z.B. 3,141592...). In der Informatik
206

2.10.4 Einfache Typen, ihre Werte und Operationen

LE 6

wird anstelle des Dezimalkommas ein Dezimalpunkt verwendet (z.B. 3.141592..., angelsächsische Schreibweise). Daher spricht man auch von Gleitpunkt-Typen anstelle von Gleitkomma-Typen. In die- Abb. 2.10-8: sem Buch wird im folgenden der Begriff Gleitpunkt-Typ verwendet. Gleitpunkt-Typen Die Wertebereiche und Operationen sind in Abb. 2.10-8 aufgeführt. in Java

Wertebereich (plattformunabhängig) (ANSI/IEEE Standard 754-1985) Typ Wertebereich (ungefähr) Speicherplatz Voreinstellung float s·m·2e mit s = +1 oder -1, m = positive ganze Zahl < 224, 4 Bytes (32 Bits) 0.0f e = ganze Zahl zwischen einschließlich -149 und 104 (ergibt ungefähr 7 signifikante Dezimalziffern Genauigkeit) 8 Bytes (64 Bits) 0.0d double s·m·2e mit s = +1 oder -1, m = positive ganze Zahl < 253, e = ganze Zahl zwischen -1075 und 970 (ergibt ungefähr 15 signifikante Dezimalziffern Genauigkeit) In der Regel verwendet man den Typ double. Syntax für Gleitpunkt-Literale (halblogarithmische Darstellung) FloatingPointLiteral

Digits

.

Digits

ExponentPart

FloatTypeSuffix

.

Digits

ExponentPart

FloatTypeSuffix

Digits

ExponentPart

FloatTypeSuffix

Digits ExponentPart

ExponentPart

FloatTypeSuffix

FloatTypeSuffix f F d

e E Digits Digit Digit: one of 0123456789

+ –

Digits

D Beispiele: 3., .5, 3e–5, 700f, 20d Hinweis: Fehlt der FloatTypeSuffix, dann handelt es sich um ein Literal vom Typ double.

Binäre Operationen (analog wie bei ganzzahligen Typen) +, –, *, /, % (Arithmetische Operationen) <, < =, >, > =, = =, ! = (Vergleichsoperationen) Sind bei den arithmetischen Operationen beide Operanden vom Typ float, dann ist der Ergebnistyp float, in allen anderen Fällen double. Unäre Operationen (analog wie bei ganzzahligen Typen) –, + +, – – Programmierregel Da bei Gleitpunktzahlen Rundungsfehler auftreten können, sollten zwei Gleitpunktzahlen niemals auf Gleichheit überprüft werden, d.h. x==y ist verboten! Stattdessen: abs(x–y)<Epsilon.

207

LE 6

2.10 Attribute und ihre Typen

2.10.5 Ausdrücke In den bisherigen Beispielen wurden folgende Anweisungen verwendet: 1 Radius = 5.5f; 2 Flaeche = PI * Radius * Radius; 3 Zaehler = Zaehler + 1; Bevor die Zuweisung (=) ausgeführt werden kann, müssen in den Fällen 2 und 3 zunächst die Operationen ausgeführt werden (hier: * und +). Die Zuweisung unterscheidet sich von den anderen Operationen dadurch, daß einer Variablen ein Wert zugewiesen wird, während bei den anderen Operationen jeweils zwei Werte verknüpft werden. Rechts des Zuweisungszeichens steht ein Ausdruck (expression), der abgearbeitet werden muß, bevor die Zuweisung ausgeführt werden kann. Der ausgewertete Ausdruck liefert als Ergebnis einen Wert, der dann durch die Zuweisung einer Variablen zugeordnet wird. Ein Ausdruck ist also nichts anderes als eine Verarbeitungsvorschrift zum Ermitteln eines Wertes. Ein Ausdruck setzt sich aus Operanden, d.h. Variablen und Konstanten, und Operatoren zusammen. Jeder Operand kann selbst wieder ein Ausdruck sein. Kommt in einem Ausdruck mehr als ein Operator vor, so muß die Reihenfolge der Ausführung definiert sein. Dies geschieht durch festgelegte Vorrangregeln – Prioritäten – für die Ausführungsreihenfolge der Operatoren. In Java gelten folgende allgemeine Regeln: 1 Inkrement- und Dekrement-Operationen 2 Arithmetische Operationen 3 Vergleichsoperationen 4 Boolesche Operationen 5 Zuweisungsoperationen Tab. 2.10-1 gibt die exakte Prioritätenfolge an. Um eine andere Ausführungsreihenfolge zu erhalten, können Ausdrücke in Klammern eingeschlossen werden. Geklammerte Ausdrücke werden immer zuerst ausgewertet. Diese Regeln entsprechen den in der Mathematik üblichen Prioritäten (Punkt vor Strich). Ausdrücke darf man beliebig ineinander schachteln. Dadurch können sehr komplizierte Ausdrücke entstehen. Die Schachtelungsstruktur wird durch runde Klammern gekennzeichnet. Alle Ausdrücke werden in linearer Notation geschrieben, d.h. sie werden in eine Form gebracht, so daß sie in einer Schreibzeile dargestellt werden können.

Ausdruck

Prioritäten

208

2.10.5 Ausdrücke
Operator
++ -– ! ~ – (Unär) new (type)expression * / % + – << >> < > == ! = &

LE 6
Tab. 2.10-1: Operatorprioritäten in Java

Bemerkungen

>>>

∧ 

&& =


+= –=

(type) expression dient der Typwandlung (siehe Abschnitt 2.10.6) Multiplikation, Division, Modulo Addition, Subtraktion Bitweises Verschieben nach links und rechts Vergleich Gleichheit, Ungleichheit logisches UND logisches XODER logisches ODER logisches UND (verkürzt) logisches ODER (verkürzt) Zuweisungen

Mathematische Schreibweise k·t·p 100 · 360 a·f+c·d a·e–b·d a+ b d+ e f+ g h p 100

Lineare Schreibweise
k * t * p / (100 * 360)

Beispiele

(a * f – c * d) / (a * e – b * d)

a + b / (d + e / (f + g / h))

B 1–n

(

)

B * (1–n * p / 100)

Durch die angegebenen Prioritätsregeln können Klammern eingespart werden. Ausdrücke mit Klammern
(8 * 5) + 3 a + (b / c) ((A / B) / (C / D)) (a + b) / (c + d) a + (b / c) + d

Äquivalente Ausdrücke, Klammern eingespart
8 * 5 + a + b / (A / B) (a + b) a + b / 3 c /(C / D) / (c + d) c + d

Beispiele

Boolesche Operationen werden hauptsächlich auf logische Ausdrücke angewandt, die sich durch die Vergleichsoperatoren aus arithmetischen Ausdrücken ergeben.
... /** Ein Standardbrief der Bundespost hat ein Gewicht bis 20 g, * eine Länge zwischen 14 und 23,5 cm, * eine Breite zwischen 9 und 12,5 cm und eine Höhe bis 0,5 cm. */ 209
Beispiel

import java.5f.0f && 14f >= Laenge && Laenge <= 23. Laenge.5f && 9.applet. float Gewicht. Hoehe. .. } } /*Programmname: MWST-Berechnung * GUI-Klasse: MwstGUI */ import java. //Konstruktor public MWST() { } //Operationen public static float berechneNetto(float BruttoBetrag) { //Automatische Typumwandlung von int nach float return BruttoBetrag * 100. } public static float berechneMwstBetrag(float BruttoBetrag) { //Automatische Typumwandlung von int nach float return BruttoBetrag * (volleMWST) / (volleMWST +100).0f <= Breite && Breite <= 12..awt.*.. * dann wird der Nettobetrag und die MWST ausgegeben * Die MWST wird als Klassenattribut deklariert */ public class MWST { //Attribute static int volleMWST = 16.5f && Hoehe <= 0. Breite.*.LE 6 2. //}} public void init() { //{{INIT_CONTROLS . public class MwstGUI extends Applet { //{{DECLARE_CONTROLS . //Anweisung mit booleschen Operationen Standardsendung = Gewicht <= 20... //}} 210 . Ein Programm zur Mehrwertsteuer-Berechnung sieht folgendermaßen aus: Beispiel /*Programmname: MWST-Berechnung * Fachkonzept-Klasse: MWST * Aufgabe: Wird ein Bruttobetrag eingegeben.0f / (volleMWST + 100)..10 Attribute und ihre Typen // Deklarationen boolean Standardsendung.

//einAbheoerer bei berechneDruckknopf registrieren berechneDruckknopf. //Nettobetrag berechnen float MerkeZahl2 = MWST.valueOf(MerkeText). } public void actionPerformed(ActionEvent event) { //Reaktion auf das Ereignis einGUI.2. //Text in float-Zahl umwandeln Float f = Float.berechneNetto(MerkeZahl).valueOf(MerkeZahl2). float MerkeZahl = f.addActionListener(einAbhoerer). public class AktionsAbhoerer implements ActionListener //wird von Java zur Verfügung gestellt { //Referenz-Attribut.5 Ausdrücke //Neuen Abhoerer erzeugen AktionsAbhoerer einAbhoerer = new AktionsAbhoerer(this). //Text ausgeben mwstTextfeld.setText(MerkeText). } } /*Programmname: MWST-Berechnung * Abhörer-Klasse: Aktionsabhoerer * Eigenständige Abhörerklasse */ import java.floatValue().berechneNettoUndMwst(). } public void berechneNettoUndMwst() { //Text aus Eingabefeld lesen String MerkeText = eingabeTextfeld.event.*.valueOf(MerkeZahl2).setText(MerkeText). //Text ausgeben wertTextfeld. durch Parameter wird Referenz auf den //Erzeuger dieses Objekts gesetzt AktionsAbhoerer(MwstGUI einMWSTGUI) { einGUI = einMWSTGUI. //float-Zahl in Text umwandeln MerkeText = String. //float-Zahl in Text umwandeln MerkeText = String.berechneMwstBetrag(MerkeZahl). } } LE 6 211 .awt.getText(). zeigt auf den Erzeuger dieses Objekts MwstGUI einGUI.10. //Konstruktor. //MWST-Betrag berechnen MerkeZahl2 = MWST.

A = B. Beispiel int A. daß einem Attribut auch nur Werte zugewiesen werden können. die auf die Werte dieses Typs angewandt werden können. long. Dies geschieht in Java durch Typumwandlungen (conversions): Typausweitung s Automatische Typausweitung n Von byte nach short. int. daß einem Attribut Werte zugewiesen werden. dann müssen die Werte der Attribute in einen einheitlichen Typumwandlung Typ umgewandelt werden. die vom gleichen Typ sind.6 Typumwandlungen Ein Kennzeichen eines Attributs ist sein Typ. daß eine Zuweisung eines float-Wertes an ein int-Attribut nicht sinnvoll ist Es ist unklar.5f. Ein Typ läßt sich charakterisieren durch die Werte oder Wertebereiche. long. Daher können in AusdrükJava ken und bei Zuweisungen nur Attribute miteinander verknüpft werden. die zu einem anderen Typ gehören. die entsprechend seinem Typ möglich sind. float. float. float oder double n Von short nach int. = i n 10. Befinden sich in einem Ausdruck Attribute unterschiedlichen Typs. oder ob eventuell gerundet werden soll. Das bedeutet.10 Attribute und ihre Typen 2. Die Umwandlung eines Werts vom Typ int oder long nach float oder die eines Werts vom Typ long nach double kann zu einem Genauigkeitsverlust führen. daß für jeden Typ eine charakteristische Speicherzellenform und Speicherzellengröße vorhanden sind. und durch die Operationen. Bildlich kann man sich das dadurch vorstellen. Java ist eine streng typisierte Sprache. oder double n Von int nach long. float oder double n Von char nach int. ob die Stellen hinter dem Komma abgeschnitten werden sollen.5f t A B fl o a t Dieses Beispiel zeigt deutlich. long. float B = 10. // Fehler wegen unterschiedlicher Typen. 212 . die einem Attribut dieses Typs zugewiesen werden können.10. oder double n Von long nach float oder double n Von float nach double Bei einer solchen Typausweitung geht keine Information über die Größe eines numerischen Werts verloren.LE 6 2. Prinzipiell ist es daher zunächst nicht möglich.

0 / 360. das vom Klassentyp T ist. Eine Typeinengung zwischen Werten vom Typ boolean und numerischen Typen ist nicht möglich.52f.785f.6 Typumwandlungen double a.10.52f in den intWert 10 gewandelt. zweiterKunde.3f + 5. z = k * p * (double) t / 100. ist eine explizite Typumwandlung nicht erforderlich. a = (int) b. daß die Werte 100 und 360 als Gleitpunkt-Literale hingeschrieben werden. Beispiel 2a Die Referenzattribute ersterKunde und zweiterKunde besitzen den Abschnitt 2.Referenztyp adressen. float c. //Klasse KundeGUI private Kunde ersterKunde.2 Klassentyp Kunde. float b = 10. Beispiel Wichtig ist. eingeschlossen in Klammern und gefolgt von dem Attributnamen. d.h. kann eine Referenz auf ein Objekt der Klasse T enthalten oder eine sogenannte Nullreferenz (null). //Der Typ float des Attributs c und des Literals 2. Speicher.785f //wird für die Berechnung des Ausdrucks automatisch //in double konvertiert (Typ der Attribute a und b) s LE 6 Beispiel Explizite Typeinengung (casting) Typeneinengung Eine Typeinengung erfolgt.10. 2.6.7 Referenztypen In Java gibt es nicht nur einfache Typen. auf Objekte. 213 . Bei Typeinengungen tritt in der Regel ein Informationsverlust ein.3f + 5. Der Java-Compiler kann Typverletzungen erkennen und als Fehler melden.2. soll der Programmierer durch die explizite Typkonversion daran erinnert werden. Die Werte von Referenztypen sind Referenzen.73f. int t. wenn der gewünschte Typ. b. Da in diesem Fall für das Attribut t eine Typausweitung erfolgt. // Es sollen Zinsen für ein Kapital k mit dem Prozentsatz // p für t Tage berechnet werden: double z. In der zweiten Anweisung erfolgt die Typanpassung erst nach der Ausführung der Berechnung b / 3.73f). sie können eine Referenz auf ein Objekt der Klasse Kunde speichern. Der Bruchanteil wird abgeschnitten.10-9). k. im Ausdruck hingeschrieben wird.h. a = b + c + 2. 2. a = (int) (b / 3. Durch diese Typeinengung wird der float-Wert 10. d. mit welchen Typen er arbeitet.0. sondern auch Referenztypen (Abb. p. Um Fehler im Programm möglichst frühzeitig zu entdecken. Beispiel int a . Ein Referenz-Attribut. aber erlaubt.

10-9: Java-Syntax für Typen Type PrimitiveType ReferenceType ReferenceType ClassType InterfaceType ArrayType ClassType TypeName ersterKunde = new Kunde(. Ein Referenz-Attribut.. Die Referenzen sind Zeiger auf die entsprechenden Objekte.LE 6 2.. das zur Zeit auf kein Objekt zeigt. Dies ist auch die automatische Voreinstellung für Referenz-Attribute.. Abb. 2.).10-10: Referenz-Attribute vom Klassentyp ersterKunde … zweiterKunde … Objekt der Klasse Kunde Referenz Referenz … Objekt der Klasse Kunde 214 . Auf ein Objekt können mehrere Referenzen zeigen. 2. Mit dem new-Operator wird jeweils ein Objekt der Klasse Kunde erzeugt und in dem entsprechenden Referenz-Attribut eine Referenz auf das Objekt eingetragen (Abb.). zweiter Kunde = new Kunde(.. hat das Schlüsselwort null eingetragen. Die Inhalte von Referenz-Attributen können anderen ReferenzAttributen (vom selben Klassentyp) zugewiesen werden. 2.10-10).10 Attribute und ihre Typen Abb.

die in der Speicherzelle gespeichert werden können. //damit zeigt zweiterKunde jetzt auf das Objekt von dritterKunde //Auf das ursprünglich zweite Objekt zeigt jetzt keine Referenz mehr.Glossar private Kunde dritterKunde. //damit zeigt ersterKunde jetzt auf das Objekt von zweiterKunde zweiterKunde = dritterKunde. Besteht aus Operatoren und Operanden. bei dem sich Ereignisabhörer bei ein oder mehreren Ereignisquellen registrieren müssen. daß in der Speicherzelle des Attributs die Speicheradresse des referenzierten Objekts steht. Literal nicht veränderliche Repräsentation des Werts eines →Attributs. um dann beim Eintritt von Ereignissen von den Ereignisquellen darüber informiert zu werden.h. conversion →Typumwandlung. In Abhängigkeit von der jeweiligen Programmiersprache werden noch weitere Eigenschaften spezifiziert. und legt fest. Attribut-Deklaration →Attribute müssen vor der ersten Verwendung in den meisten Programmiersprachen deklariert bzw. welche Operationen auf die Werte angewandt werden dürfen. Typ Gibt an. Dies geschieht durch Angabe der Zugriffsart. Verweis bedeutet. aus welchem Wertebereich die Werte sein dürfen. Referenztyp →Attribute dieses →Typs verweisen auf ein Objekt des entsprechenden Klassentyps. dem nacheinander durch →Zuweisungen ein neuer Wert zugewiesen werden kann (lesender und schreibender Zugriff). 110L. des Attributnamens und optional des Initialisierungswerts. die Zugriffsart gibt an. Typumwandlung (conversion) Explizite oder implizite Anpassung der →Typen von →Attributen. Mit dieser Abfrage wird also die Identität von Objekten abgefragt. ob ein einmal gespeicherter Wert nochmals verändert werden darf oder nicht und der Attributwert steht für den aktuell gespeicherten Wert. 215 . expression →Ausdruck. 0x6E. Der Ausdruck (zweiterKunde == dritterKunde) ergibt true. auf das nach der Initialisierung nur noch lesend zugegriffen werden darf. da beide Beispiel 2c Referenz-Attribute auf die gleiche Speicheradresse. der →Typ beschreibt die möglichen Werte. Die Zahl Einhundertundzehn kann in Java beispielsweise durch folgende Literale dargestellt werden: 110. d. Attribut Repräsentiert in einer Programmiersprache in abstrakter Form eine bzw. des Typs. Arithmetische Operationen sind nicht erlaubt. 0156. 2. LE 6 Beispiel 2b Außer Zuweisungen können auf Referenz-Attribute auch Abfragen auf Gleichheit und Ungleichheit durchgeführt werden. Variable →Attribut. Ausdruck (expression) Verarbeitungsvorschrift zur Ermittlung eines Wertes. Delegations-Ereignis-Modell Ereignisverarbeitungsmodell in Java. dritter Kunde = ersterKunde. mehrere Speicherzelle(n). Der Attributname gibt den Namen der Speicherzelle(n) an. Konstante →Attribut. //damit zeigt auch dritterKunde auf das Objekt von ersterKunde ersterKunde = zweiterKunde.5-17 gleiche Objekt zeigen. die einem →Attribut zugewiesen werden können. vereinbart werden. assignment →Zuweisung. Steht auf der rechten Seite einer →Zuweisung. //Es wird durch die Speicherbereinigung automatisch gelöscht. wenn in einem Ausdruck oder einer →Zuweisung →Attribute mit unterschiedlichen →Typen vorhanden sind. auf das Abb.

protected. ANZAHL_TAGE. MWST.h. in dem der Wert unter Berücksichtigung der Operatorprioritäten berechnet wird. Auf der rechten Seite einer Zuweisung kann ein Ausdruck (expression) stehen. s Variable oder Konstante: Ist nach der Initialisierung nur ein lesender Zugriff erlaubt. Ereignisse Attribute AttributDeklaration Ereignisse – insbesondere Benutzeraktionen – müssen erkannt und verarbeitet werden können. Attribut-Deklarationen legen die Eigenschaften von Attributen fest. Java verwendet dazu das DelegationsEreignis-Modell. z. wenn nötig getrennt durch das Unterstreichzeichen »_«. der anschließend der Variablen auf der linken Seite zugewiesen wird.h. MAX_WERT. Folgende Eigenschaften werden bei der Attribut-Deklaration in Java angegeben: s private. muß private angegeben werden. PI. geschrieben werden.LE 6 Glossar/Zusammenhänge Zuweisung (assignment) Einfache Anweisung. daß die Bezeichner von allgemeinen Klassenkonstanten (in der Regel deklariert durch: static final) in Großbuchstaben. Optionale Initialisierung des Attributs. Wenn das Geheimnisprinzip eingehalten werden soll. Einem Attribut wird durch eine Zuweisung (assignment) einmalig (Konstante) oder mehrmals ein Wert zugeordnet. In Java werden einfache Typen und Referenztypen unterschieden. gekennzeichnet durch final.B. s s 216 . löscht einen eventuell bereits vorhandenen Wert (schreibender Zugriff). dann handelt es sich um eine Konstante. bei der einem →Attribut ein errechneter oder fester Wert zugewiesen wird. Folgende einfache Typen sind vordefiniert. Ein Wert wird durch ein Literal repräsentiert. Ereignisabhörer können als eigenständige Klassen oder als »innere« Klassen programmiert werden. dieser Wert wird in die entsprechende Speicherzelle eingetragen. dieser Wert wird in die Speicherzelle(n) des Attributs eingetragen und »überschreibt« bzw. public oder keine Angabe (»friendly« ): Sichtbarkeitsbereich des Attributs. d. Ereignisquellen melden eingetretene Ereignisse an alle registrierten Ereignisabhörer. d. s Typ des Attributs. Klassen bestehen aus Attributen und Operationen. wobei zu jedem Typ festgelegte Operationen erlaubt sind: n boolean n byte n short n int n long n char n float n double Name des Attributs. Als Konvention gilt in Java.

An welchen Stellen weichen sie voneinander ab? Korrigieren Sie die Java-Attribute entsprechend. /2/ Das Geburtsdatum als Zeichenkette. 217 Muß-Aufgabe 15 Minuten . Zahl2 = berechne2(Zahl2). voreingestellt auf 100. /5/ Der Name einer Person als Zeichenkette. int berechne (int Zahl) { int Zahl1.Zusammenhänge/Aufgaben LE 6 Durch explizite und implizite Typumwandlungen (conversions) ist es möglich. /6/ Die Fallbeschleunigung g als konstantes Klassenattribut mit Wert. Zahl1 = Zahl + x. Zahl2 = Zahl1 * 10. Ausdrükken sowie formalen und aktuellen Parametern anzupassen (Typausweitung. { int Zahl2. s Vor dem ersten lesenden Zugriff muß ein Attribut initialisiert sein. } int berechne2(int Zahl) { return Zahl * Zahl.berechne(10). 1 Lernziel: Attribute problemgerecht in Java unter Berücksichtigung der Java-Syntax spezifizieren können. sichtbar nur innerhalb der eigenen Klasse. Wenn möglich. /1/ Der Zählerstand in km. } } Analytische Aufgaben Muß-Aufgabe 15 Minuten Welches Ergebnis erhält man bei folgendem Aufruf: Ergebnis = einA. Typeinengung). unterschiedliche Typen in Zuweisungen. wobei das Alter nicht gespeichert werden soll. /3/ Das aktuelle Datum als Zeichenkette. sind folgende Regeln zu beachten: Allgemeine Regeln s Alle Attribute müssen vor der ersten Anwendung deklariert sein. Betrachten Sie folgendes Programm: class A { int x = 5. Begründen Sie Ihre Antwort! 2 Lernziel: Attribute problemgerecht in Java unter Berücksichtigung der Java-Syntax spezifizieren können. Vergleichen Sie die folgenden Attributspezifikationen mit den entsprechenden Java-Attributen. } return Zahl2. s Vergleichsoperatoren = = und ! = nicht auf numerisch reelle Zahlen anwenden (Gefahr von Rundungsfehlern). /4/ Das Alter als Ganzzahl mit großem Wertebereich. die Initialisierung bereits bei der Deklaration vornehmen. Um Fehler zu vermeiden. mit einer Genauigkeit von 100m.

transient String AktuellesDatum. a = (int)x.n. x = y. – Wandlung der Variablen a in eine neue Variable vom Typ boolean. int n. Geben Sie die Wertebereiche aller im folgenden Programmcode verwendeten Attribute an. int b) { int x = a + b. Beachten Sie dabei auch den Programmkontext.n. final float G = 9.LE 6 Aufgaben int Zaehlerstand = 100. // // // // // // 1 2 3 4 5 6 Muß-Aufgabe 15 Minuten 3 Lernziel: Attribute problemgerecht in Java unter Berücksichtigung der Java-Syntax spezifizieren können. 218 . int y) { long r = x * y. a = x. m = m . transient double Alter. double y = x. } public long multipliziere(int x. Was passiert. } } Klausur-Aufgabe 20 Minuten 4 Lernziele: Die verschiedenen Arten der Typumwandlungen erläutern und richtig anwenden können. float x = a. } a An welchen Stellen finden welche Typumwandlungen statt? b Welche Programmzeilen sind syntaktisch nicht korrekt? c Fügen Sie (wenn möglich) noch folgende Typumwandlungen hinzu: – Wandlung einer Variablen vom Typ boolean in int. return r. return x. protected String Name. } public void tausche_m_und_n() { // Tauschen ohne Hilfsvariable! m = m + n. Betrachten Sie folgende Operation: public void Typumwandlung() { int a = 3. Literale und Ausdrücke richtig schreiben können. y = a. String Geburtsdatum.81. n = m . public int bildeSumme(int a. wenn der Wertebereich überschritten wird? public class Test { int m. a = int(x).

pow(Math. der die Beschriftung »OK« trägt. b Verwenden Sie eine normale Klasse als Abhörer. ebenso wichtige mathematische Operationen.Aufgaben – Wandlung einer Variablen vom Typ double in die Variable a vom Typ int.PI. soll ein Druckknopf direkt auf der Oberfläche dargestellt werden. Wird Druckknopf 1 gedrückt. die das Schließen des Fensters verwaltet. wenn nötig. explizite Typumwandlungen. a Verwenden Sie eine innere Klasse als Abhörer. Verwenden Sie geeignete Typen und. Die definierten Typen mit ihren unären und binären Operationen einschließlich ihrer Wirkung und Syntax kennen und anwenden können. dann soll Druckknopf 2 mit »9« beschriftet werden. Wichtige Konstanten sind hier definiert. 8 Lernziele: Die verschiedenen Arten der Typumwandlungen erläutern und richtig anwenden können. 7 Lernziel: Ereignisse entsprechend den dargestellten Alternativen in einem Java-Programm verarbeiten können. – Wandlung einer neuen Variablen vom Typ short in eine Variable vom Typ int. 3) Zur Berechnung der Fakultät verwenden Sie bitte: public static long Fakultaet(long n) //nicht aus Math Formulieren Sie die folgenden Formeln in Java. Für mathematische Anwendungen verfügt Java über die Klasse Math. Schreiben Sie eine Java-Anwendung. a Zeichnen Sie die beteiligten Klassen in einem geeigneten UML-Diagramm. Nach Betätigung dieses Druckknopfes wird die Anwendung beendet. dann in eine Variable vom Typ double. 6 Lernziel: Ereignisse entsprechend den dargestellten Alternativen in einem Java-Programm verarbeiten können. Die Potenzierung erfolgt über die Operation public static double pow(double a. Schreiben Sie ein Java-applet. Nach dem Versuch. 219 . Auf der Benutzungsoberfläche des applets »TaschenrechnerGUI« befinden sich zwei Druckknöpfe. c Implementieren Sie das Java-applet. 5 Lernziel: Ereignisse entsprechend den dargestellten Alternativen in einem Java-Programm verarbeiten können. In der Regel handelt es sich um Klassenoperationen und Klassenattribute (static). das Fenster zu schließen. Literale und Ausdrücke richtig schreiben können. das in einem Textfeld (textfield) einen Text einliest und diesen auf Knopfdruck in einem zweiten Textfeld ausgibt. double b) //berechnet a hoch b LE 6 Konstruktive Aufgaben Muß-Aufgabe 45 Minuten Kann-Aufgabe 35 Minuten Muß-Aufgabe 60 Minuten Muß-Aufgabe 15 Minuten Eine wichtige Konstante ist: public static double PI // Kreisfaktor Ein möglicher Aufruf zur Berechnung von x = π3 wäre: double x = Math. Hinweis: Zum Umbenennen eines Druckknopfes verwenden Sie die Operation public void setLabel(String label) der Klasse Button. die mit »1« und »2« beschriftet sind. b Zeichnen Sie die Abläufe in einem geeigneten UML-Diagramm.

10 Lernziel: Ereignisse entsprechend den dargestellten Alternativen in einem Java-Programm verarbeiten können. Mit diesen Druckknöpfen können die Kundendaten als Objekt mit der Nummer 1. Klausur-Aufgabe 45 Minuten 220 .LE 6 Aufgaben a y= ax + b cx + d s(s – a)(s – b)(s – c) mit s = (a + b + c)/2 b Fläche eines Dreiecks: S = c Fläche eines regelmäßigen n-Ecks: S = nr2 tan(a/2) mit r: Inkreisradius und α zwischen 00 und 3600. Das Pflichtenheft sieht folgendermaßen aus: /1/ In ein Textfeld (textfield) kann ein Text eingegeben werden. das eine Aktivitätenliste verwaltet. Erweitern Sie das Programm »Kundenverwaltung mit interaktiver Eingabe« (Kundenverwaltung5 aus Abschnitt 2. /3/ Befindet sich in dem Textbereich bereits ein Text. dann wird der neue Text – beginnend auf einer neuen Zeile – angefügt. /11/ Zum Speichern der Kundendaten gibt es nun drei Druckknöpfe. /12/ Beim Ausgeben der Kundendaten durch den Druckknopf »Ausgeben« werden die Daten aller drei Kunden untereinander ausgegeben. 2 oder 3 gespeichert werden. Schreiben Sie ein Java-applet.2) folgendermaßen: /10/ Die GUI-Klasse soll nun drei Kunden verwalten können. /4/ Nach dem Drücken des Knopfes wird der Text im Textfeld jeweils gelöscht. Es existieren auch drei Kundenreferenzen.9. 1 d Natürlicher Logarithmus: n-te Ableitung von ln x = (–1)n–1(n – 1)! n x k k! e Binomialkoeffizient = r !(k – r) ! r ( ) Muß-Aufgabe 35 Minuten 9 Lernziel: Referenztypen erklären und richtig einsetzen können. /2/ Nach Drücken eines Druckknopfes »Kopiere« wird der Text aus dem Textfeld gelesen und in einen Textbereich (textarea) kopiert.

3 Dann die Praxis: Prozeduren mit Eingabeparametern in Java 229 2.11.11 2.8 Überladen von Operationen 239 2.2 Bilder laden und anzeigen 252 221 .6 Dann die Praxis: Funktionen in Java 235 2.7 Dann die Praxis: Objekte als Ergebnisparameter in Java 236 2.11.12 Einführung in die Grafik-Programmierung in Java 247 2. Objekte sowohl als Eingabeparameter als auch als Ergebnisparameter bei Funktionen verwenden können. Die Unterschiede zwischen Prozeduren und Funktionen einschließlich der Syntax darstellen können. Prozeduren und Funktionen 222 2.11. Anhand von Beispielen zeigen können.11.LE 7 2 Grundlagen der Programmierung – Operationen s s s s s s s s s s s Die Vorteile der funktionalen Abstraktion an Beispielen erläutern können. wie die beschriebenen Parameterübergabemechanismen funktionieren.11.11. wie die beschriebenen Parameterübergabemechanismen funktionieren.1 Zeichnen von Objekten 247 2.11 Rekursion 243 2. Referenztypen erklären und richtig einsetzen können und anhand von Beispielen zeigen können.4 Dann die Praxis: Objekte als Eingabeparameter in Java 232 2.10 Objekte als Eingabeparameter in Konstruktoren 242 2.2 bis 2.11. Operationen schreiben und den jeweils geeigneten Parameterübergabemechanismus auswählen können. Überladene Operationen bei eigenen Problemlösungen geeignet verwenden können. 2.11. verstehen anwenden Die Kapitel 2. Grafiken programmieren und Bilder in Java einbinden können.11.11.12.10 müssen bekannt sein.2 Dann die Praxis: Parameterlose Prozeduren in Java 228 2.11.9 Dann die Praxis: Konstruktoren in Java 240 2.12.5 Dann die Praxis: Prozeduren mit Ausgabeparametern 234 2. Den dynamischen Ablauf rekursiver Operationen aufzeigen können. Einfache rekursive Operationen schreiben können.1 Operationen und ihre Parameter 222 Zuerst die Theorie: Operationen.

die durch Botschaften in Anspruch genommen werden können. Dienstleistungen zur Verfügung.und Ausgabeparameter Kapital Zinssatz Auftragsdatum float float int int Zins Botschaftssender Enddatum Zinsertrag Abb. »Wie« die Leistung in Form von Algorithmen und unter Verwendung von Attributen erbracht wird.11.11-1: Veranschaulichung der funktionalen Abstraktion Programmiersprachen unterstützen diese Art der Abstraktion auf unterschiedliche Weise. der Umwelt. d. daß eine Operation eine funktionale Abstraktion bereitstellt. d. muß und soll nicht wissen. 2.h. von außen ist nicht sichtbar. Ein. wie die jeweilige Dienstleistung realisiert. »was« stellt die Operation an Leistung zur Verfügung. Zwischen dem Botschaftssender und dem Botschaftsempfänger müssen jedoch Informationen ausgetauscht werden können. Dies geschieht über sogenannte Parameter.h. Derjenige. programmiert ist. 2. Generell unterscheidet man zwei Arten von Operationen (Abb. Abb. aus anderen Öffnungen erhält er Ergebnisdaten mit festgelegten Typen zurück. oft auch Methoden genannt.1 Zuerst die Theorie: Operationen.11-1 veranschaulicht die verschiedenen Sichtweisen.LE 7 2. Prozeduren und Funktionen Operation funktionale Abstraktion Info-Austausch durch Parameter Jede Klasse stellt durch Operationen. In definierte Öffnungen muß er Eingabedaten mit festgelegten Typen eingeben. Zum Anwenden einer Operation muß nur das »was« bekannt sein. d.h. d. Analog wie für Attribute gilt auch für Operationen das Geheimnisprinzip. Der Botschaftssender sieht eine Schnittstelle mit Öffnungen vor sich. anderen Klassen. 222 . 2.11-2): s Prozeduren und s Funktionen. Man sagt daher auch. ist für den Anwender uninteressant. wie das Innere einer Operation aussieht.11 Operationen und ihre Parameter 2.11 Operationen und ihre Parameter 2.h. der eine solche Dienstleistung in Anspruch nimmt.

Der Operationskopf beschreibt die Schnittstelle der Operation zu ihrer Umwelt.6-2). d. 2. die unter ihrem Namen durch eine Botschaft angesprochen werden kann. über diese Schnittstelle kommuniziert die Operation mit ihren Aufrufern. Eine Operations-Deklaration besteht immer aus einem Operationskopf und einem Operationsrumpf (siehe Abb. die unabhängig von einer Klasse sind. daß die Anweisungen der Operation ausgeführt werden. daß mit der Deklaration einer Operation auch automatisch eine gleichnamige Botschaft deklariert wird.h. Der Operationsrumpf beschreibt die Implementierung.11-2: Gliederung und Eigenschaften von Operationen Eigenschaften einer Operation Beispiel Aktivierung durch Botschaft: einObjekt. Eine Operation ist eine Anweisungsfolge.Operation() Durch die Botschaft wird bewirkt.10. Im Gegensatz dazu gibt es in C++ auch »freie« Operationen. Prozeduren und Funktionen besitzen Gemeinsamkeiten und Unterschiede. Im folgenden werden zunächst die Gemeinsamkeiten behandelt. Sie exi223 Deklaration = Kopf + Rumpf Kopf Rumpf lokale Attribute Abschnitt 2. Lokale Attribute werden verwendet. public { // // // } void Operation() Anweisung 1 Anweisung 2 usw.11) immer genau 1 Ergebnisparameter Aufruf im Ausdruck Java : keine Ergebnisparameter Aufruf als eigenständige Anweisung Prozedur Funktion Konstruktor Aufruf mit new Initialisiert ein Objekt Operation ist der übergeordnete Begriff für Prozedur und Funktion. Man kann sich vorstellen.h. Er enthält lokale Attribute und den Anweisungsteil.h. d. den Algorithmus der Operation. Zwischenergebnisse gespeichert werden müssen.11. d.1 Zuerst die Theorie: Operationen. Prozeduren und Funktionen Operation (Methode) LE 7 = benannte Anweisungsfolge Deklaration = Kopf + Rumpf Kopf = Schnittstelle zur Umwelt Rumpf = lokale Atribute + Anweisungen Lokale Operationen Eingabeparameter Rekursiv aufrufbar (Abschnitt 2. Eine Operation muß deklariert werden. Abb.2. In Java muß die Deklaration immer in einer Klasse erfolgen.B.11. 2. wenn innerhalb der Operation z. eine Operation gehört in Java immer zu einer Klasse.1 .

d. Auf Attribute der eigenen Klasse kann direkt. die Speicherinhalte sind nach dem Ende der Operation nicht mehr verfügbar. Der Informationsaustausch erfolgt über explizite Parameter. Ist es jedoch innerhalb einer Klasse nötig. Ist die Operation beendet. dann sollten diese Operationen auch nur innerhalb der eigenen Klasse sichtbar sein. In der Regel dienen Operationen einer Klasse dazu.h. d. } } Das lokale Attribut MerkeZahl dient nur dazu. Zahl2 = MerkeZahl. wenn die Operation ausgeführt wird. dann wird der Speicherplatz der lokalen Attribute freigegeben und unter Umständen für andere Zwecke verwendet.LE 7 2. Auch Referenz-Attribute können als lokale Attribute deklariert werden.. Auf die in einer Klasse deklarierten Attribute kann von allen Anweisungen der Operationen der Klasse lesend und schreibend zugegriffen werden. Daher sind diese Operationen auch meist als public deklariert. s Operationen mit Eingabeparametern. //Anweisungen MerkeZahl = Zahl1. //Operation public void vertausche() { //lokales Attribut int MerkeZahl.h. Dies erreicht man in Java durch das Schlüsselwort private vor der Operation. . Zahl1 = Zahl2. Beispiel public class KlasseA { //Attribute int Zahl1. Der Speicherplatz für lokale Attribute wird erst angelegt. anderen Klassen Dienstleistungen anzubieten. Zahl2. s Operationen mit Ein. wenn sie nur während der Operationsausführung benötigt werden. innerhalb der Operation vertausche() den Wert von Zahl1 zwischenzuspeichern. in der sie deklariert sind. ohne Umweg über Parameter zugegriffen werden.11 Operationen und ihre Parameter stieren nur innerhalb der Operation. 224 lokale Operationen Parameter .und Ausgabeparametern. zur Programmierung der eigenen Operationen Hilfsoperationen zu schreiben.. die von einer Operation öfters oder von mehreren Operationen benötigt werden. Für den Informationsaustausch einer Operation mit ihrer Umgebung gibt es drei verschiedene Ausprägungen: s Parameterlose Operationen.

C und C++ ist es möglich. Dieser Wert wird daher über die Parameterliste als Eingabewert übergeben: public void erzeugeTextfeld(int Y) { //Ein Textfeld dynamisch erzeugen und anzeigen einTextfeld = new TextField("Hallo"). 2. Pro Ausgabe ändert sich die Y-Koordinate des Textfeldes. d.h.h.bzw. Die Ausgabe des Textfeldes ist die sich wiederholende Aufgabe. d. dann müssen diese Informationen über sogenannte Eingabeparameter an die Operation übergeben werden.h.9-4). Funktion Funktion = 1 Ergebnisparameter Prozedur = keine Ergebnisparameter in Java Funktion = Aufruf im Ausdruck . Es gibt daher keine Parameter. welche Informationen sich von Fall zu Fall unterscheiden. daß die Aktivierung. einTextfeld. Objekte unterscheiden.setBounds(192. Da eine Funktion immer genau ein Ergebnis an den Botschaftssender. daß sich häufig wiederholende Aufgaben. Pascal. Dieser Unterschied zwischen einer Funktion und einer Prozedur führt dazu. Im Gegensatz dazu muß eine Prozedur keine Ergebnisse an den Botschaftssender zurückgeben. den Aufrufer. Ein Vorteil von Operationen mit Parametern besteht darin. Ergebnisparameter benötigt. der Aufruf.26).Y. Ergebnisparameter. Diese Informationen müssen dann über die Parameterliste übergeben werden.97. Sind umgekehrt Informationen vom Botschaftsempfänger an den Botschaftssender zu übertragen. steht ein Funktionsaufruf 225 Prozedur vs. Prozeduren und Funktionen LE 7 parameterlose Operation Operation mit Eingabeparametern Operation mit Ausgabeparametern Bei einer parameterlosen Operation erfolgt kein Informationsaustausch zwischen dem Botschaftssender und dem Botschaftsempfänger. Jede Funktion besitzt daher immer einen Ausgabe. dann werden Ausgabe.9. Vorteil der Parametrisierung Im Beispiel 1 von Abschnitt 2. sind Ergebnisse an den Botschaftssender zu übergeben.2.bzw.11. In Java kann eine Prozedur direkt keine Ergebnisse an den Aufrufer übergeben. d.B. die sich nur durch unterschiedliche Werte bzw. in einer parametrisierten Operation verallgemeinert beschrieben werden können. Sind Informationen vom Botschaftssender an den Botschaftsempfänger zu übertragen. Zunächst muß man sich anschauen. verschieden ist.1 Zuerst die Theorie: Operationen. auch über Prozeduren Ergebnisse an den Botschaftssender zurückzugeben. zurückliefert. In Abhängigkeit von der verwendeten Programmiersprache gibt es dafür eine oder mehrere Möglichkeiten. In prozeduralen und hybriden Programmiersprachen wie z. } Was unterscheidet nun Prozeduren und Funktionen? Eine Funktion übergibt als Ergebnis der Operationsausführung an das rufende Programm immer genau ein Resultat. In Java können Ergebnisse direkt nur über Funktionen an den Botschaftssender übergeben werden.2 wird nach jedem Knopfdruck ein Beispiel Textfeld jeweils vertikal versetzt ausgegeben (Abb. add(einTextfeld).

LE 7 2..11 Operationen und ihre Parameter Prozedur = Aufruf ist Anweisung Beispiele in der Regel auf der rechten Seite einer Zuweisung oder in einem Ausdruck. das übergebene Ergebnis geht dann aber verloren. //eigenständige Anweisung Punktnotation: ObjName.B. Andere Sprachen verwenden andere Notationen. Die new-Anweisung erzeugt von der angegebenen Klasse ein Objekt und ruft dann den Konstruktor auf. z.5f). gefolgt von einem Punkt und dem Operationsnamen.. Er darf nicht in einem Ausdruck stehen. Dadurch ist sichergestellt. unter Umständen gefolgt von einer Parameterliste. 226 . Handelt es sich um eine Klassenprozedur oder eine Klassenfunktion. //Aufruf einObjekt. Eine new-Anweisung besteht immer aus der Angabe des Operators new.0. Daher steht die new-Anweisung in der Regel auf der rechten Seite einer Zuweisung. } . Eine Funktion kann auch als eigenständige Anweisung verwendet werden. //Aufruf in Ausdruck Ergebnis = einObjekt.setTemperatur(35. //Aufruf double Ergebnis. einer Variablen zugewiesen wird. Operationsname new-Anweisung Konstruktor: Prozedur Für den Aufruf einer Prozedur und einer Funktion gilt in Java die Punktnotation: Es wird der Objektname des Objekts angegeben. //Prozedur void setTemperatur(float Temp) { Temperatur = Temp. gefolgt von dem Klassennamen. Ein Konstruktor ist daher eine Prozedur. dann wird anstelle des Objektnamens der Klassenname angegeben. wobei die Variable auf der linken Seite vom Referenztyp der Klasse sein muß. der es initialisiert.. } . von der das Objekt erzeugt wird. daß das übergebene Ergebnis weiterverarbeitet bzw. //Funktion double berechneQuadrat(double Zahl) { return Zahl * Zahl. die ein nicht initialisiertes Objekt in ein initialisiertes Objekt überführt.berechneQuadrat(16.. Als Ergebnis der new-Anweisung wird immer die Referenz auf das erzeugte Objekt zurückgegeben. objektorientiertes Pascal die Notation ->. an das die Botschaft geschickt werden soll. Ein Prozeduraufruf ist immer eine eigenständige Anweisung.0) * 25.OpName Klassenname. unter Umständen gefolgt von einer Parameterliste.

LE 7 Beispiel Enthält eine Klasse mehrere Konstruktoren. public class Kunde { String Name. dann lokale Operation wird nur der Operationsname ohne vorangestellten Objekt. dann kann in Java in der ersten Anweisung eines Konstruktorrumpfs ein anderer Konstruktor der Klasse aufgerufen werden. Nach dem Durchlaufen der Operationsanweisungen wechselt die Kontrolle wieder zum Botschaftssender. Hilfsoperationen. Der Botschaftssender wartet also mit der Fortführung seiner Anweisungen. Sie erlauben es.11. Dadurch sind diese Operationen in anderen Operationen nicht sichtbar und der Anwender wird mit diesen Hilfsoperationen nicht »belastet«. //Konstruktoren Kunde (String Firmenname) { Name = Firmenname. //Aufruf einRechteck = new Rechteck().. } } Beispiel Allen Operationen gemeinsam ist. die nur in einer Operation benötigt werden. gefolgt von der geklammerten Parameterliste.oder Klassennamen angegeben. Dort wird die Programmausführung hinter der Aufrufstelle fortgesetzt. Programmablauf beim Aufruf Schachtelung von Operationsdeklarationen 227 . bis die gerufene Operation beendet ist. Adresse. Prozeduren und Funktionen //Konstruktor public Rechteck() { } .1 Zuerst die Theorie: Operationen. //Deklaration der Referenzvariablen Rechteck einRechteck. In den Programmiersprachen Java und C++ ist eine Schachtelung von Operationen jedoch nicht möglich. Wird eine lokale Operation der eigenen Klasse aufgerufen. daß beim Operationsaufruf die Ablauf-Kontrolle vom Botschaftssender zum Botschaftsempfänger wechselt. Der Aufruf beginnt mit dem Schlüsselwort this. Viele Programmiersprachen gestatten es. in Operationen andere Operationen zu deklarieren.. Adresse = Firmenadresse. Dadurch entstehen geschachtelte Operationsdeklarationen. } Kunde (String Firmenname.2. auch nur lokal in dieser Operation anzuordnen. String Firmenadresse) { this(Firmenname).

/4/ Der aktuelle Zählerstand ist anzuzeigen. Sie besitzt keine Parameter oder Eingabeparameter.LE 7 2. /2/ Der Kilometerzähler kann beliebig oft auf Null zurückgesetzt werden. /3/ Der Kilometerzähler kann jeweils um einen Kilometer erhöht werden. Die Realisierung des Pflichtenheftes erfordert eine Klasse Zaehler (Abb. über die sie Informationen vom Botschaftssender erhält. Als Java-Programm ergibt sich: /** Programmname: Zaehler * Fachkonzept-Klasse: Zaehler * Aufgabe: Verwaltung eines Zaehlers */ public class Zaehler { //Attribute private int Zaehlerstand = 0. in den runden Klammern stehen keine Parameter) zeigt. Sie wird in einer eigenständigen Anweisung des Botschaftssenders aufgerufen.11 Operationen und ihre Parameter 2.2 Dann die Praxis: Parameterlose Prozeduren in Java Eine parameterlose Prozedur ist eine Ausprägung einer Operation. } public void erhoeheUmEins() { Zaehlerstand = Zaehlerstand + 1. Das Pflichtenheft lautet: /1/ Im Amaturenbrett eines neuen Autos soll ein Tageskilometerzähler digital angezeigt werden. /5/ Der Zähler ist mit Null vorzubesetzen.11-3). Die Syntax für eine parameterlose Prozedur sieht in Java folgendermaßen aus: MethodDeclaration: void Identifier () {BlockStatementsopt} Das Schlüsselwort void gibt an.h.11. } 228 parameterlose Prozedur Beispiel 1a: Fallstudie Zaehler Zaehlerstand: int setzeAufNull() erhoeheUmEins() gibWert() Abb. 2. daß es sich um eine Prozedur handelt.11-3: Klasse Zaehler . //Konstruktor public Zaehler() { } //Schreibende Operationen public void setzeAufNull() { Zaehlerstand = 0. Die leere Parameterliste (d. 2. daß es keine Eingabewerte gibt. Die Firma ProfiSoft erhält von der Firma »KFZ-Zubehoer GmbH« einen Auftrag. die keine Ergebnisse zurückgibt.

Die Syntax für eine Prozedur mit Eingabeparametern sieht in Java Prozedur mit Eingabefolgendermaßen aus: parametern MethodDeclaration: void Identifier (FormalParameterList) {BlockStatementsopt} FormalParameterList: FormalParameter FormalParameterList .11. – void erhoeheUmEins(). Firmenadresse = Adresse.3 Dann die Praxis: Prozeduren mit Eingabeparametern in Java Sind Informationen vom Botschaftssender an den Botschaftsempfänger zu übertragen.Beispiel gende Prozeduren mit Eingabeparametern: . String Adresse) { Firmenname = Name.. um eine Dienstleistung zu erledigen.2. Parameter müssen mit Attributnamen (VariableDeclaratorID) und zugehöriger Typangabe (Type) in einer Parameterliste spezifiziert werden. FormalParameter Formal Parameter: Type VariableDeclaratorId VariableDeclaratorId: Identifier VariableDeclaratorId [ ] Die Klasse Kunde in der Fallstudie Kundenverwaltung1 besitzt fol.3 Dann die Praxis: Prozeduren mit Eingabeparametern in Java //Lesende Operationen public int gibWert() { return Zaehlerstand. } 229 . In der Regel ist ein Datenaustausch zwischen dem Botschaftssender und dem Botschaftsempfänger erforderlich.11. //Kombinierte Schreiboperation public void aendernAdresse (String Name. } } LE 7 In diesem Beispiel werden zwei parameterlose Prozeduren benötigt: – void setzeAufNull(). Parameterlose Prozeduren stellen einen Sonderfall dar. dann müssen diese Informationen über sogenannte Eingabeparameter an die Prozedur übergeben werden.. 2.

Sie sind Platzhalter für später einzusetzende Werte bzw. Die Angabe eines Parameters in einer Parameterliste bewirkt. Die aktuellen Werte werden in der Reihenfolge in der Parameterliste aufgeführt.h. Diese Variable existiert jedoch nur. d.11 Operationen und ihre Parameter //Schreibende Operationen public void setFirmenname (String Name) { Firmenname = Name. die in der Deklaration der Prozedur spezifiziert werden. wie die formalen Parameter in der Prozedurdeklaration angeordnet sind. Man sagt daher. Expression Welcher aktuelle Parameter welchem formalen Parameter zugeordnet wird. Sie müssen unterschiedliche Namen besitzen. Beim Aufruf der Prozedur. } Wirkungsweise Parameterliste formale Parameter aktuelle Parameter Aufruf Positionszuordnung In der Regel besitzen alle Schreiboperationen einen oder mehrere Eingabeparameter. Parameternamen dürfen nicht als lokale Attribute innerhalb der Prozedur erneut deklariert werden. daß der Gültigkeitsbereich der Parameter auf die Prozedur beschränkt ist. Anschließend wird der Speicherplatz wieder für andere Zwecke benutzt. wird in runden Klammern angegeben. welcher aktuelle Wert an den formalen Parameter übergeben werden soll. Die Parameter. solange der Rumpf der Prozedur ausgeführt wird.h. } public void setFirmenadresse (String Adresse) { Firmenadresse = Adresse. Die Syntax für einen Prozeduraufruf sieht in Java folgendermaßen aus: MethodInvocation: MethodName (ArgumentListopt) ArgumentList: Expression ArgumentList . } public void setAuftragssumme (int Summe) { Auftragssumme = Summe. daß eine entsprechende Variable vereinbart bzw. da das lokale Attribut den Parameter sonst verbergen würde. bei der Aufforderung durch eine Botschaft. deklariert wird. Die Parameter. es wird ein Speicherplatz reserviert. bezeichnet man als aktuelle Parameter oder Argumente. die beim Aufruf angegeben sind. d. Der erste aktuelle Parameter wird dem ersten formalen Parameter zugeordnet usw. wird in Java durch Positionszuordnung festgelegt. bezeichnet man als formale Parameter. Objekte. 230 .LE 7 2.

Poststr.300 wert Kopie Summe 300 . d. z. das Eingabeattribut im aufrufenden Programm zu ändern. String Firmenadresse) Beim Aufruf dieser Prozedur werden aktuelle Parameter bzw.2. Argument zweiterKunde.B. In Java müssen die Anzahl der aktuellen und der formalen Parameter immer übereinstimmen. // 2. public void setAuftragssumme(int Summe) v { Auftragssumme = Summe. 12-14"). Betrachtet man die Speicherzellen. setAuftragssumme(Auftragswert).16f. d.aendernAdresse("KFZ-Zubehoer AG". Aufruf: Deklaration: aktueller Parameter ersterKunde. die durch den Wert des aktuellen Parameters initialisiert wird. Argument ↓ 2. Die aufgerufene Prozedur soll keine Möglichkeit haben.B. stehen. Aufruf ↓ 1. 23"). Aufgabe eines Eingabeparameters ist es.h. z. Änderungen dieser Kopie. Es gibt verschiedene Mechanismen. Auf der aktuellen Parameterliste kann anstelle eines Literals – hier die Zahl 15000 – auch ein Attributname. Informationen in eine Prozedur zu transportieren. Suedstr. formaler Parameter public void aendernAdresse (String Name.11. Bei diesem Parametermechanismus arbeitet die gerufene Prozedur nur mit der Kopie der Informationen. In Java wird bei einfachen Typen der Mechanismus call by value verwendet.setAuftragssumme(15000). eine Variable oder Konstante. haben keine Rückwirkungen auf den aktuellen Parameter. "44137 Dortmund. Summe = (int) Summe * 1. Bei call by value verhält sich der formale Parameter wie eine lokale Variable. im Beispiel auf das Attribut Auftragswert. Aufruf ↓ 1. formaler Parameter } v Parameterübergabe Java call by value Beispiel Die Parameterübergabe entspricht folgender Initialisierung: int Summe = 15000. Argument ersterKunde. 231 v Auftrags.aendernAdresse("Tankbau & Partner KG". um Eingabeinformationen an eine Prozedur zu übergeben (Parameterübergabemechanismus). ↓ 2. Argument ↓ 2. dann wird in diesem Fall der Wert des Attributs Auftragswert in die Speicherzelle der Variablen Summe kopiert.h. "44867 Bochum. Argumente übergeben und den formalen Parametern entsprechend ihrer Reihenfolge zugeordnet: // 1. formaler.3 Dann die Praxis: Prozeduren mit Eingabeparametern in Java LE 7 In der Klasse Kunde der Fallstudie Kundenverwaltung1 besitzt die Beispiel Prozedur aendernAdresse zwei Parameter und ist folgendermaßen deklariert: // Deklaration ↓ 1.

nocheinKmZaehler). dann sind Typumwandlungen erforderlich (siehe Abschnitt 2. Die Parameterübergabe bei einem Referenzparameter zeigt Abb. else gleichTextfeld.10. 2. Es wird daher nur die Referenz auf das jeweilige Objekt kopiert. d. extra Speicherplätze für ihre Werte zur Verfügung zu stellen. Dieser wird zunächst ausgewertet und dann an den formalen Parameter übergeben. dann können von innerhalb der Prozedur alle Operationen des übergebenen Objekts aufgerufen werden. Befindet sich ein Objekt auf der Parameterliste. aufgeführt werden.setText("NEIN!"). Da Objekte sehr groß sein können. Typeinengungen sind explizit anzugeben. Anders ausgedrückt: Sie müssen vom Typ Zaehler sein.LE 7 2. } Beispiel 1b Auf der Parameterliste stehen die formalen Parameter ersterZaehler und zweiterZaehler. Es liegt dieselbe Situation vor wie bei der Zuweisung eines berechneten Wertes aus einem Ausdruck an eine Variable. z. Typausweitungen werden automatisch vorgenommen.11-4. sondern auch Objekte. d. Diese Prozedur kann beispielsweise folgendermaßen aufgerufen werden: vergleicheZaehlerstaende(einKmZaehler. sondern es wird inner232 .6).4 Dann die Praxis: Objekte als Eingabeparameter in Java Referenzen auf Objekte In Java können auf der formalen Parameterliste nicht nur Attribute. ist es nicht sinnvoll.11. nicht kopiert. Stimmen die Typen der aktuellen Parameter und der formalen Parameter nicht überein. dann kann dies durch folgende Prozedur geschehen: public void vergleicheZaehlerstaende(Zaehler ersterZaehler. Sollen beispielsweise die Zählerstände von zwei Zählern verglichen werden.6 Auf der aktuellen Parameterliste kann auch ein Ausdruck stehen. Man spricht daher auch von Referenz-Parametern. Zaehler zweiterZaehler) { if(ersterZaehler. 2.h. hier: gibWert(). genauer gesagt Referenzen auf Objekte. auf das eine Referenz zeigt. wenn auf der Parameterliste Objekte stehen.10.setText("JA!"). eine Klasse kann gleichzeitig als Typ angesehen werden. die beide Referenzen auf die Klasse Zaehler sein müssen. Im Gegensatz zu dem call by value-Mechanismus wird ein Objekt. ihre Attributwerte in die Prozedur zu kopieren.h. 300 + 5000.11 Operationen und ihre Parameter Typumwandlungen Abschnitt 2.gibWert() == zweiterZaehler.B.gibWert()) gleichTextfeld.

erster Zaehler. solange die Prozedur abgearbeitet wird.B. Auf diese Objekte zeigen jetzt also jeweils zwei Referenzen. 2. die solange existieren.11.11-4: Parameterübergabe mit Referenzparameter Diesen Parametermechanismus bezeichnet man daher auch als call by reference. Bei der Ereignisbehandlung in Java (siehe Abschnitt 2.2) werden ebenfalls Objekte über die Parameterliste übergeben.4 Dann die Praxis: Objekte als Eingabeparameter in Java Aufruf: vergleicheZaehlerstaende(einKmZaehler. Es wird der Wert 5 zurückgegeben. beim Benachrichtigen 233 .gibWert() auf das Objekt nocheinKmZaehler zugegriffen und der Wert 3 zurückgeliefert.h. werden in die Speicherzellen ersterZaehler und zweiterZaehler kopiert – nicht die Objekte selbst. daß über die Referenz-Variable erster Zaehler die Operation gibWert() des Objekts einKmZaehler aufgerufen wird.setzeAufNull(). Zaehler zweiterZaehler) halb der Prozedur eine Referenz auf das bereits bestehende Objekt gesetzt. Durch den Aufruf von schreibenden Operationen. nocheinKmZaehler). Die Botschaft ersterZaehler. der Zählerstand wird modifiziert. die Speicheradressen von den Objekten einKmZaehler und nocheinKm Zaehler. Abb.11-5. wird der Wert des Originals geändert.h. Als aktuelle Parameterwerte werden Referenzen übergeben. Im Beispiel bedeutet dies. hier: einKmZaehler und nocheinKmZaehler.gibWert() in der Prozedur vergleiche Zaehlerstaende bewirkt. d.9. Diese Referenzwerte. Der wichtigste Unterschied gegenüber dem call call by reference by value besteht nun darin. Eine mögliche Benutzungsoberfläche für das Fallbeispiel Zähler zeigt Abb. z. Für die formalen Parameter ersterZaehler und zweiterZaehler werden also insgesamt zwei Speicherplätze angelegt. zweiterZaehler = nocheinKmZaehler. Die Parameterübergabe entspricht daher jeweils der Zuweisung eines Referenzwertes an eine Referenz-Variable: ersterZaehler = einKmZaehler. d. Beim Registrieren wird das Ereignisabhörer-Objekt.2. Analog wird mit zweiterZaehler. 2. LE 7 einKmZaehler: Zaehler Zaehlerstand = 5 setzeAufNull() erhoeheUmEins() gibWert() Kopie Kopie nocheinKmZaehler: Zaehler Zaehlerstand = 3 setzeAufNull() erhoeheUmEins() gibWert() Deklaration: public void vergleicheZaehlerstaende(Zaehler ersterZaehler. daß alle Änderungen am Originalobjekt und nicht an einer Kopie des Objekts vorgenommen werden. daß die Referenzen auf die Objekte einKmZaehler und nocheinKmZaehler in die Referenz-Variablen ersterZaehler und zweiterZaehler der Prozedur vergleicheZaehler staende kopiert werden.

.. //Reaktion auf Anzeigen } 2.5 Dann die Praxis: Prozeduren mit Ausgabeparametern In prozeduralen und hybriden Programmiersprachen wie z.anzeigenDruckknopf) einGUI.addActionListener(einAbhoerer). . public void actionPerformed(ActionEvent event) { //Ereignisquelle feststellen mit getSource Object quelle = event.. In Java können direkt über die Parameterliste keine Ergebniswerte einfacher Typen zurückgegeben werden.speichereKunde()..B. anzeigenDruckknopf. über die Parameterliste Ergebnisse an den Botschaftssender zurückzugeben. //Neuen Abhoerer erzeugen einAbhoerer = new AktionsAbhoerer(this). d. dann können über die referenzierten Objekte indirekt auch Ergebnisse nach »außen« gegeben werden. if (quelle == einGUI. //einAbhoerer bei speichernDruckknopf und anzeigenDruckknopf //registrieren speichernDruckknopf.getSource().anzeigenKunden().speichernDruckknopf) einGUI. Beispiel Im Beispiel 2 von Abschnitt 2.11-5: Mögliche Benutzungsoberfläche für das Fallbeispiel Zähler 2.h.2 (Kundenverwaltung5) werden folgende Objekte übergeben: //Deklarieren von Referenz-Attributen private AktionsAbhoerer einAbhoerer. 234 Java .11. Stehen jedoch Objekte auf der Parameterliste. Dabei wird oft der call by reference-Mechanismus angewandt. Pascal.9. 2.LE 7 Abb. C und C++ ist es möglich. die jeweiligen Referenzen.11 Operationen und ihre Parameter über ein eingetretenes Ereignis wird das Ereignisquell-Objekt übergeben.addActionListener(einAbhoerer). //Reaktion auf Speichern else if (quelle == einGUI.

11-4 zeigt für das Beispiel Zähler. public int gibWert() { return Zaehlerstand. daß der Ergebnisparameter Ergebnisparameter nicht auf der Parameterliste steht und keinen eigenen Namen erhält. In Java steht der Typ des Ergebnisparameters vor dem Funktionsnamen: MethodDeclaration: ResultType Identifier (FormalParameterListopt) {BlockStatementsopt} Da eine Prozedur keinen Ergebnisparameter besitzt. Ergebnis 235 . Funktionsdeklaration und Funktionsaufruf unterschei.6 Dann die Praxis: Funktionen in Java LE 7 Die Abb.gibWert Zuweisung = bewirkt Kopie te sie sinnvollerweise innerhalb eines Ausdrucks aufgerufen werden. Der Ausdruck hinter return muß einen Wert ergeben. Kennzeichnend für eine Funktion ist. Dadurch können indirekt auch Werte aus der Prozedur herausgegeben werden. . als Ergebnis der Operationsausführung wird an das rufende Programm genau ein Wert übergeben. Als Name wird vielmehr der Funktionsname verwendet... die Originalobjekte zu manipulieren. Wie bei allen anderen Parametern muß jedoch auch bei dem Ergebnisparameter der Typ angegeben werden. der mit dem Ergebnistyp der Funktion übereinstimmt oder verträglich ist. Sie kann auch als eigenständige Anweisung verwendet werden. die genau ein Ergebnis besitzen.11.11. 2. daß in der Prozedur Beispiel 2 vergleicheZaehlerstaende auch die Operationen erhoeheUmEins und setzeAufNull der übergebenen Objekte aufgerufen werden können. Innerhalb des Funktionsrumpfes muß mindestens eine returnAnweisung stehen. Damit ist es möglich. d. 7 das Ergebnis geht dadurch aber verloren.h. In der Klasse Zaehler gibt es folgende Funktion: int Zaehlerstand = 0. sonst ist die Funktion syntaktisch nicht korrekt: ReturnStatement return Expression. steht bei ihr anstelle von ResultType das Schlüsselwort void (leer).2. soll. } Beispiel Zaehlerstand 7 call by return result bewirkt Kopie 7 Da eine Funktion immer einen Wert als Ergebnis zurückgibt.Funktion den sich von Prozeduren.h. 2. d. ihre Attributwerte zu verändern.6 Dann die Praxis: Funktionen in Java In der Praxis treten oft Operationen auf. Diesen häufigen Sonderfall einer Operation bezeichnet man als Funktion.

Diese Funktion concat erhält als Eingabeparameter eine Zeichenkette. Das folgende Beispiel zeigt. d. Viele Standardklassen von Java benutzen diese Möglichkeit intensiv.11. Beispiel Die Klasse Zaehler wird um eine Funktion erhoeheUmHundert() erweitert. 236 . Anschließend wird die Operation concat aufgerufen und die Zeichenkette "zweiter Teil" übergeben.concat("zweiter Teil"). der Wert. Beispiel In Java ist String eine vordefinierte Klasse. ein Objekt der Klasse Zaehler als Ergebnis zu liefern. Auch ein Objekt der eigenen Klasse kann erzeugt und übergeben werden. das einen um Hundert erhöhten Zählerstand besitzt: public class Zaehler { //Attribute private int Zaehlerstand = 0. //Zugriff innerhalb der Klasse call by result Als Parametermechanismus für den Ergebnisparameter bei Funktionen wird call by result verwendet. Eine Funktion kann jedes Objekt als Ergebnis übergeben. die im StringObjekt gespeichert ist. Diese Klasse enthält eine Operation public String concat(String str).LE 7 Beispiel 2. die durch den Funktionsnamen repräsentiert wird.h. wie ein Objekt einString erzeugt und mit "Erster und" initialisiert wird. einTextbereich. Summe = Summe + gibWert().7 Dann die Praxis: Objekte als Ergebnisparameter in Java Als Ergebnis einer Funktion kann auch ein Objekt übergeben werden. die an die Zeichenkette angefügt werden soll. Die Ausgabe in einem mehrzeiligen Textfeld ergibt "Erster und zweiter Teil": String einString = new String("Erster und "). Das Ergebnis ist ein Objekt der Klasse String.11 Operationen und ihre Parameter Aufruf der Funktion gibWert(): Ergebnis = einKmZaehler. wird in die Speicherzelle kopiert.gibWert(). 2. der sich nach der Berechnung des Ausdrucks hinter return ergibt. die mit jedem Java-System mitgeliefert wird. die es erlaubt.append(nocheinString). das die zusammengefügte Zeichenkette enthält. die es ermöglicht. String nocheinString = einString. zwei Zeichenketten zu einer Zeichenkette zusammenzufügen (Konkatenieren).

erhoeheUmHundert(). von der es erzeugt wurde. Die Klasse.. die über diese Information verfügt. } . Das Objekt einKmZaehler wird mit dem Wert Null initialisiert. Sie besitzt die Operation String getName(). und die Referenz nocheinKmZaehler wird auf das neu erzeugte Objekt gesetzt. Das vorher erzeugte Objekt mit dem Wert 100 wird durch die Speicherbereinigung gelöscht..11-6 verdeutlicht die Abläufe durch ein Sequenzdiagramm. In Java kennt jedes Objekt die Klasse. die ein Objekt der eigenen Klasse zurückgibt public Zaehler erhoeheUmHundert() { //Aufruf des eigenen Konstruktors //neuer Zaehler ist lokales Referenz-Attribut Zaehler neuerZaehler = new Zaehler(Zaehlerstand + 100). Die Standardklasse Object stellt die Operation Class getClass() allen anderen Klassen zur Verfügung.. return neuerZaehler.7 Dann die Praxis: Objekte als Ergebnisparameter in Java //Konstruktoren public Zaehler() { } public Zaehler(int Startwert) { Zaehlerstand = Startwert.11-7 durch ein Objektreferenz-Diagramm. 2. Das erste Objekt nutzt den Standardkonstruktor. 2.erhoeheUmHundert(). //3 Abb. Während der Laufzeit ist es daher möglich. 237 Beispiel Ermittlung des Klassennamens eines Objekts zur Laufzeit . } //Funktion. public void start() { einKmZaehler = new Zaehler(). ist die Standardklasse Class. dann entsteht ein neues Objekt mit dem Initialwert 200. } LE 7 Mit dem folgenden Programmausschnitt werden zwei Zähler-Objekte erzeugt. Diese Operation gibt zur Laufzeit Klasseninformationen über ein Objekt in Form eines Class-Objekts zurück.11. die Klasse eines Objektes zu bestimmen.2. //2 } Fügt man folgende Zeile hinzu. //1 nocheinKmZaehler = einKmZaehler. da keine Referenz mehr auf dieses Objekt zeigt: nocheinKmZaehler = nocheinKmZaehler. Abb. die den String-Namen der durch ein Class-Objekt repräsentierten Klasse ermittelt. Das Objekt nocheinKmZaehler wird durch den Aufruf der Operation erhoeheUmHundert erzeugt und mit 0+100 initialisiert.

11 Operationen und ihre Parameter new Zaehler() einkmZaehler :Zaehler 1 erhoeheUmHundert() 2 newZaehler(Zaehlerstand+100) nocheinkmZaehler :Zaehler erhoeheUmHundert() 3 nocheinkmZaehler :Zaehler Abb.getClass(). dann lassen sich diese Anweisungen verkürzt folgendermaßen schreiben: einkmZaehler :ZaehlerGUI Zaehlerstand=0 :ZaehlerGUI einkmZaehler= nocheinZaehler= Zaehler (Zaehlerstand+100) nocheinkmZaehler :ZaehlerGUI Zaehlerstand=100 Zaehler (Zaehlerstand+100) nocheinkmZaehler :ZaehlerGUI Abb. einClassObjekt = einKunde.11-7: Objektreferenzen in Beispiel 2 Zaehlerstand=200 238 .11-6: Sequenzdiagramm zu Beispiel 2 Folgende Anweisungen liefern eine Referenz auf ein Class-Objekt: Class einClassObjekt. einName = einClassObjekt. Als Ergebnis steht in diesem Beispiel anschließend die Zeichenkette "Kunde" in einName. 2.LE 7 ZaehlerGUI 2. abgekürzte Schreibweise Wird das Referenz-Attribut einClassObjekt nicht weiter benötigt. 2. Anschließend kann die Operation getName() von Class aufgerufen werden: String einName.getName().

Besitzen zwei Operationen derselben Klasse denselben Namen. // Klasse Zaehler . um bei der Erzeugung von Objekten verschieden umfangreiche Initialisierungen vorzunehmen. die dem Attribut einName zugewiesen wird. die Signatur der aufzurufenden Operation zu bestimmen. dann werden die Anzahl der Parameter und ihre Typen bei der Übersetzung dazu verwendet. LE 7 Diese Anweisung wird von links nach rechts abgearbeitet: Zuerst wird eine Botschaft an das Objekt einKunde geschickt und dort die Operation getClass() ausgeführt. dann bezeichnet man Überladen (overloading) diesen Operationsnamen als überladen (overloaded). Die Möglichkeit. In einer Klasse dürfen nicht zwei Operationen mit derselben Signatur deklariert werden.8 Überladen von Operationen String einName. einName = einKunde. // Konstruktor ohne explizite Initialisierung public Zaehler() { } // Konstruktor mit expliziter Initialisierung public Zaehler(int InitWert) { Zaehlerstand = InitWert. Als Ergebnis erhält man eine Zeichenkette.8 Überladen von Operationen Die Signatur einer Operation besteht aus dem Namen der Operati. } ..11. aber ansonsten unterschiedliche Signaturen. Häufig schreibt man verschiedene Konstruktoren.getName().. Operationen zu überladen. 2. An dieses Objekt wird nun die Botschaft getName() geschickt. kann für verschiedene Zwecke eingesetzt werden.2. 239 Beispiel .Signatur on sowie der Anzahl und den Typen ihrer formalen Parameter. sonst meldet der Compiler einen Fehler. Diese Zeichenkette gibt den Klassennamen von einKunde an. Der Ergebnistyp einer Funktion zählt nicht zur Signatur.. } // Operationen mit unterschiedlicher Initialisierung public void erhoehe() { Zaehlerstand = Zaehlerstand + 1. Wird eine Operation aufgerufen. Als Ergebnis wird eine Referenz auf ein Class-Objekt zurückgegeben.getClass().11. } public void erhoehe(int Delta) { Zaehlerstand = Zaehlerstand + Delta..

2.erhoehe(500). Er wird als this. sonst aber die gleiche Aufgabe erledigt wird. Enthält eine Klasse keine Konstruktordeklarationen. voreingestellter Konstruktor 240 .9 Dann die Praxis: Konstruktoren in Java Konstruktoren dienen dazu.11. neue Objekte einer Klasse zu erzeugen und bei Bedarf zu initialisieren. nur weil die Parameter unterschiedlich sind. //ohne explizite Initialisierung zweiterZaehler = new Zaehler(100).11 Operationen und ihre Parameter //Beispiele für Aufrufe aus einer GUI-Klasse ersterZaehler = new Zaehler().1).//mit expliziter Initialisierung ersterZaehler. Der Vorteil des Überladens liegt darin. Die Syntax einer Konstruktordeklaration entspricht der einer Funktionsdeklaration ohne Ergebnistyp: ConstructorDeclaration: ConstructorModifiersopt ConstructorDeclarator Throwsopt ConstructorBody ConstructorDeclarator: SimpleTypeName (FormalParameterListopt) Der SimpleTypeName muß der Name der Klasse sein. //Erhöhung um 500 Der Compiler ermittelt anhand der Signatur beim Aufruf die richtige Operation.LE 7 2. der keine Parameter verwendet. Der Zugriff auf Konstruktoren wird durch Zugriffsmodifikatoren geregelt: ConstructorModifiers: ConstructorModifier ConstructorModifiers ConstructorModifier ConstructorModifier: one of public protected private Syntax Rumpf Die erste Anweisung eines Konstruktorrumpfs kann ein expliziter Aufruf eines anderen Konstruktors derselben Klasse sein. ConstructorBody: { ExplicitConstructorInvocationopt BlockStatementsopt } ExplicitConstructorInvocation: this (ArgumentListopt ).erhoehe(). //Erhöhung um 1 zweiterZaehler. die die Konstruktordeklaration enthält. daß man keine unterschiedlichen Operationsnamen wählen muß.11. gefolgt von einer geklammerten aktuellen Parameterliste geschrieben (siehe Abschnitt 2. dann erzeugt der Compiler einen voreingestellten Konstruktor. Konstruktoren können genauso wie Prozeduren und Funktionen überladen werden.

.Aufruf ßen aus: ClassInstanceCreationExpression: new ClassType (ArgumentListopt) ArgumentList: Expression ArgumentList.. Font. auf das der Programmierer nicht zugreifen kann.Abkürzungsmöglichkeiten gende Schritte erzeugt: 1 Deklaration eines Referenz-Attributs. Auf der Parameterliste der Operation setFont wird ein anonymes Objekt der Klasse Font erzeugt. Dazu wird ein neues Objekt der Standardklasse Font benötigt: nameFuehrungstext.0. 241 . die Objekterzeugung und Zuweisung an das Referenz-Attribut auf der Parameterposition durchzuführen. //Ein Objekt der Klasse Label erzeugen //und die Referenz dem Referenz-Attribut zuweisen nameFuehrungstext = new Label("Firmenname").BOLD..28). . Vom Objekt nameFuehrungstext zeigt jedoch eine Referenz auf dieses anonyme Objekt. dann kann new ohne Zuweisung angewandt werden. wenn das Objekt benötigt wird.11.. wird keine explizite Referenz in Form eines Referenz-Attributs auf das Objekt benötigt.setBounds(36.setFont(new Font("Dialog". //Das neu erzeugte Objekt dann zur Oberfläche hinzufügen add(nameFuehrungstext). d.h. Beispiel 2a Eine Abkürzungsmöglichkeit besteht darin.120. //Operationen auf das neue Objekt anwenden nameFuehrungstext. Für den Führungstext soll eine andere Schriftart in Fettschrift einge. .Beispiel 3 stellt werden. Expression In allen bisherigen Beispielen wurde ein Objekt immer durch fol. 2 Erzeugung eines Objekts mit dem new-Operator und Zuweisung der Referenz an das Referenz-Attribut.2. //Deklaration eines Referenz-Attributs Label nameFuehrungstext. Kann das Objekt anonym bleiben. 3 Übergabe des Referenz-Attributs über die Parameterliste. Beispiel 2b Die Operation setBounds kann jetzt allerdings erst nach der add-Operation erfolgen.9 Dann die Praxis: Konstruktoren in Java LE 7 Die Syntax für den Aufruf eines Konstruktors sieht folgenderma. add(nameFuehrungstext = new Label("Firmenname")). 12)).

Will man ein neues Objekt erzeugen. 2. Konstruktoren.Nachname. String Adresse) { this. Abb. bezeichnet man als copy constructor.Nachname = Nachname. } //Kopier-Konstruktor //Übergabe des zu kopierenden Objekts als Parameter public KundePerson(KundePerson alterKunde) { Nachname = alterKunde. Der Vorteil eines Kopierkonstruktors liegt darin. /*Programmname: KundePerson * Fachkonzept-Klasse: KundePerson * Aufgabe: Beispiel für Klonen eines Objekts */ public class KundePerson { //Attribute private String Vorname. Nachname. 242 .Adresse. this. String Nachname. die eine Kopie erzeugen. das zunächst dieselben Werte wie ein bereits vorhandenes erhält. } Mit Hilfe dieses Konstruktors kann nun ein neues.11-8 zeigt die Abläufe.11 Operationen und ihre Parameter 2.11. welche Schritte zum Kopieren im einzelnen nötig sind (Geheimnisprinzip).Vorname = Vorname. Beispiel 3 In einer kaufmännischen Anwendung soll der Ehepartner eines bereits vorhandenen Kunden erfaßt werden. Adresse. // 1 KundePerson geklonterKunde = new KundePerson(alterKunde). Adresse = alterKunde.LE 7 2."Baumann". geklontes Objekt erzeugt werden: KundePerson alterKunde = new KundePerson("Guido".10 Objekte als Eingabeparameter in Konstruktoren Häufig werden in Konstruktoren als Eingabeparameter Objekte verwendet.Adresse = Adresse. Anschließend werden nur die abweichenden Daten geändert. this. da der Vorname nicht mit kopiert wird. // 2 Es handelt sich hierbei um keinen exakten Kopierkonstruktor. } //Schreibende Operationen //usw. dann ist dies ein geeignetes Verfahren. daß außerhalb der Klasse nicht bekannt sein muß."Frankfurt"). //Konstruktor public KundePerson(String Vorname. Anstelle einer vollständigen Neuerfassung der Daten des Ehepartners wird eine Kopie des vorhandenen Kunden erzeugt.

11 Rekursion Oft lassen sich Probleme auf einfachere Teilprobleme zurückführen. .2.11.11-8: Sequenzdiagramm und Objektreferenzen zu dem Beispiel 3 Die Fakultät einer natürlichen Zahl ist folgendermaßen definiert: Beispiel n! = n * (n-1) * . 2. Es ergibt sich folgende Rekursionsrelation: n! = n * (n-1)!. Man erhält die Fakultät also.11."Berlin") alterKunde :KundePerson LE 7 new KundePerson(alterKunde) geklonterKunde :KundePerson :KundePersonGUI alterKunde= geklonterKunde= 1 2 :alterKunde: KundePerson Vorname="Hans" Nachname="Meyer" Adresse="Berlin" :geklonterKunde: KundePerson Vorname= Nachname="Meyer" Adresse="Berlin" 2. Die Funktion zur Berechnung der Fakultät läßt sich unter Ausnutzung dieser Rekursionsrelation wie folgt als rekursive Funktion schreiben: 243 . Abb.11 Rekursion KundePersonGUI new KundePerson("Hans". Programmiertechnisch beschreibt man rekursive Algorithmen dadurch. indem man sie mit der Fakultät der vorhergehenden Zahl multipliziert. Einige mathematische Fragestellungen sind von Natur aus bereits rekursiv definiert. daß Operationen sich selbst direkt oder indirekt aufrufen. . Rekursiv läßt sich dies folgendermaßen beschreiben: n! = n * (n-1)! (n-1)! = (n-1) * (n-2)! usw. * 3 * 2 * 1. wobei 0! = 1! = 1. wobei die Teilprobleme fast identisch mit dem Ursprungsproblem sind. wobei 0! = 1 ist."Meyer". Solche Probleme lassen sich durch rekursive Algorithmen lösen.

Aufrufs. es existieren vier Operationen mit unterschiedlichen lokalen Attributwerten. wenn n < 2 ist else return n * nFak(n-1). //Ende. Rückkehr an Aufrufstelle return 3 * 2 = 6 //Ende des 2. Der Programmablauf zeigt. Bei jedem Aufruf wird die gerade bearbeitete Anweisung unterbrochen und zunächst dieselbe Funktion erneut gestartet. Da er die Rekursionsrelation N! = N * (N-1)! kennt. //Rückkehr an Aufrufstelle // Berechnung des Ausdrucks // hinter return jetzt möglich return 2 * 1 = 2 // Ende des 3. Aufruf if (4 < 2) Bedingung nicht erfüllt else return 4 * nFak(3) // Rekursiver Aufruf //2. Zur Veranschaulichung möge Abb. Aufruf if (2 < 2) Bedingung nicht erfüllt else return 2 * nFak(1) //Erneuter rekursiver Aufruf //4. Von vier Brüdern erhält der älteste die Aufgabe nFak(4) zu berechnen. //Rekursiver Aufruf } Der Aufruf nFak(4) bewirkt folgenden dynamischen Ablauf: //1. Zu einem Zeitpunkt gibt es im obigen Fall also gleichzeitig vier verschiedene Aktivierungen derselben Operation.LE 7 2. daß durch die rekursiven Aufrufe eine dynamische Schachtelungsstruktur aufgebaut wird.h. 2.11 Operationen und ihre Parameter public int nFak(int n) //Annahme: n > 0 { if (n < 2) return 1. den zweitältesten Bruder damit zu beauftragen. Aufrufs. beschließt er. Aufruf if (1 < 2) Bedingung erfüllt then return 1 //Ende der Aufruffolge // Ende des 4.11-9 dienen. d. Diese Aufgabe ist ihm aber zu kompliziert. Aufrufs und damit Ende der Berechnung Als Ergebnis liefert der Funktionsaufruf nFak = 24. Rückkehr an Aufrufstelle return 4 * 6 = 24 //Ende des 1. Aufrufs. zunächst einmal (4-1)! zu be244 . Aufruf if (3 < 2) Bedingung nicht erfüllt else return 3 * nFak(2) //Erneuter rekursiver Aufruf //3.

Der jüngste Bruder – etwas erbost darüber. Über diese Zeitspanne hinweg muß er sich seine Aufgabe merken. da er zunächst eine Teilaufgabe delegieren und dann abwarten muß.2. (3-1)! zu berechnen.11-9: Modifiziertes Sequenzdiagramm zur Darstellung rekursiver Aufrufe 1 2*1=2 3*2=6 4*6=24 rechnen. s Der jüngste Bruder wird nur kurzfristig benötigt. 245 . Wenn er das Ergebnis von seinem Bruder erhält. Er sagt seinem ältesten Bruder seinen errechneten Wert 6 und verabschiedet sich dann. dann könne er das auch. daß er 3 * (3-1)! berechnen sollte. ebenfalls nicht dumm. alle lokalen Atribute dieser Funktion oder Prozedur müssen so lange existieren. Durch diese Darstellung werden einige Punkte noch deutlicher: s Der älteste Bruder muß am längsten anwesend sein. Der älteste Bruder berechnet nun noch 4 * 6 und hat damit das gestellte Problem gelöst.11. Er delegiert daher die Aufgabe. gibt dem jüngsten Bruder die Aufgabe. Der zweitälteste Bruder denkt. teilt sein Ergebnis dem zweitältesten Bruder mit und entfernt sich ebenfalls. bis er das Teilergebnis übermittelt bekommt. Freudestrahlend über seine intelligente Vereinfachung der Aufgabe reibt er sich die Hände und wartet auf eine neue Aufgabe. (2-1)! zu ermitteln und das Ergebnis ihm dann mitzuteilen. Der zweitjüngste Bruder multipliziert nun das ihm übermittelte Ergebnis mit der gemerkten Zahl 2. Das bedeutet. sagt dem zweitjüngsten Bruder dieses Ergebnis und geht zornig davon. daß 1! = 1 ist. 2. an den zweitjüngsten Bruder. Der zweitälteste Bruder führt die Multiplikation 3 * 2 aus. die zuletzt aufgerufene Operation existiert am kürzesten. denn er erinnert sich noch. Das heißt. die zuerst aufgerufene Operation existiert am längsten. bis alle anderen Aufrufe beendet sind. wenn sein ältester Bruder sich die Arbeit so vereinfacht. denn er wird nicht mehr benötigt. ist er dann gern bereit.11 Rekursion :nFakGUI nFak(4) nFak(3) nFak(2) nFak(1)=1 LE 7 Abb. die Multiplikation 4 * (4-1)! auszuführen. daß man ihm nur eine so leichte Aufgabe zumutet – weiß sofort. nach Erledigung seiner Aufgabe muß er sich nichts mehr merken. Dieser.

nach demselben Algorithmus. ALGOL 68.LE 7 2. während FORTRAN und COBOL über diese Beschreibungsmöglichkeit nicht verfügen.B. jeder benutzt aber andere Daten. //indirekter rekursiver Aufruf } } void b(String bText) { ausgabeTextbereich. Aufruf } void a(String aText) //Operation a { if (i > 0) { ausgabeTextbereich.11 Operationen und ihre Parameter Alle Brüder lösen ihre Teilaufgabe nach demselben Verfahren. muß es folgende drei Eigenschaften besitzen: 1 Das Originalproblem muß sich in einfachere Exemplare desselben Problems zerlegen lassen. public void start() { a("Start"). //indirekter rekursiver Aufruf } Nicht alle Programmiersprachen ermöglichen den rekursiven Aufruf von Algorithmen. z. s Beispiel //Indirekter Aufruf von zwei Operationen a und b int i = 10. C und C++ erlauben rekursive Algorithmen. Bei diesem Beispiel handelt es sich um eine direkte Rekursion. Bei der indirekten Rekursion ruft ein Algorithmus A einen Algorithmus B auf. der außerdem noch besonders verwaltet werden muß (dynamische Speicherverwaltung). Das heißt. i--. Ada) sowie PL/1. //1. da sich der Algorithmus selbst aufruft. 246 . a("noch ein Test b"). Eigenschaften der Rekursion Damit ein Problem ein Kandidat für eine rekursive Lösung ist. b("Test a und "). MODULA-2. d.append(aText). mehr dafür in der Kombinatorik.h. Es gibt jedoch auch Programmiersprachen. für jeden rekursiven Operationsaufruf wird ein neuer Speicherplatzbereich benötigt.B. der Linguistik und der Simulation. Die Sprachen der ALGOL-Familie (ALGOL 60. z. die überwiegend mit rekursiven Algorithmen arbeiten. »Ausdruck« (indirekte Rekursion). LISP. Auch Teile von Programmiersprachen sind rekursiv definiert. PASCAL. In der numerischen Mathematik treten nur wenige rekursive Probleme auf.append(bText). der seinerseits wieder A direkt oder indirekt aufruft. der Übersetzungstechnik. Simula 67.

2. 3 Ein großes Problem ist derart in eine Folge weniger komplexer Teilprobleme zu zerlegen. bei Anwendungen wird in der Regel die Klasse Frame verwendet. Für ein Problem mit diesen Eigenschaften ergibt sich die rekursive Lösung auf eine ziemlich direkte Art: s Der erste Schritt besteht darin. muß die Klassenbibliothek java. muß im Anweisungsteil mindestens eine Bedingung existieren (meist eine if – then – else . Beispiele für rekursive Problemlösungen werden in den nächsten Kapiteln behandelt.awt importiert werden. die selbst durch die rekursive Anwendung des Algorithmus gelöst werden. die nach einer endlichen Zahl von Aufrufen erfüllt ist und den Abbruch der Aufruffolgen bewirkt. 2. 2. Java unterstützt die Grafikformate gif und jpg. Viele Sprachkonstrukte referenzieren sich direkt oder indirekt Hinweis selbst. s All diese Lösungen werden dann schließlich zur Lösung des Ausgangsproblems zusammengesetzt. zum Füllen von Flächen und zur Ausgabe von Text zur Verfügung.h. Bei applets steht automatisch eine Zeichenfläche zur Verfügung.1 Zeichnen von Objekten LE 7 2 Wenn all diese Teilprobleme gelöst sind. s Im anderen Fall wird das gesamte Problem in neue Teilprobleme aufgebrochen. daß die Teilprobleme letztlich so einfach werden. zu überprüfen. daß sich eine Lösung des Ausgangsproblems ergibt. Die Syntax von Programmiersprachen ist ebenfalls rekursiv definiert. Auf diesen Kontext wird über ein Graphics-Objekt zugegriffen. Zu den Kompo247 .12.12. ob das Problem in die Kategorie einfacher Fall fällt. nach endlicher Zeit beendet wird. In diesem Fall wird das Problem direkt gelöst. Um die Grafikfähigkeiten nutzen zu können.Auswahl).12 Einführung in die Grafik-Programmierung in Java Innerhalb der Klassenbibliothek AWT (abstract window toolkit) stellt Java grafische Primitivoperationen zum Zeichnen von Linien. d. Zur Ausgabe von grafischen Elementen wird ein Fenster benötigt.1 Zeichnen von Objekten In Java besitzt jede Komponente einen Grafikkontext. daß sie ohne weitere Unterteilung gelöst werden können. auf das die Ausgabeoperationen angewendet werden können. müssen diese Lösungen so zusammengesetzt werden können. Damit ein rekursiver Algorithmus terminiert.

Die paint-Prozedur kann von anderen Operationen mit repaint(). Füll. mit deren Hilfe Grafik-Objekte gemalt werden können. Mit der Operation getInsets() kann die Größe dieser Randelemente ermittelt werden. sondern es gibt Randbereiche. int x. der zur Ausgabe von Schrift verwendet wird. Auf das Graphics-Objekt einer Komponente kann z. Der Grafikkontext stellt die Zeichenfläche der jeweiligen Komponente dar.40 +X +Y Abb. das sind applets und Fenster. Positive x-Werte verlaufen nach rechts. Die paint-Prozedur erhält als Eingabeparameter ein Objekt der Klasse Graphics: public void paint(Graphics g) paint enthält standardmäßig keinen Code. dessen Ursprung in der oberen linken Ecke liegt (Abb. in der alle Ausgaben erfolgen. Der Prozedurrumpf muß jedesmal neu programmiert werden. in eine bestimmte Komponente zu zeichnen. Die wichtigsten Zeichenoperationen der Klasse Graphics sind: s drawString(String text. Oft steht nicht das gesamte Fenster zur Ausgabe zur Verfügung.12-2). Fenster und alle Interaktionselemente wie Textfelder. Druckknöpfe usw. aufgerufen werden. dann wird paint von der Java-VM automatisch aufgerufen. int y) Graphics 0. die nicht überschrieben werden dürfen. Textbereiche. positive y-Werte nach unten. der bisher verdeckt war.B. 2. Menüs oder Rahmen.10 20. Die Klasse Graphics ist die Implementierung eines universellen Ausgabegeräts für Grafik und Schrift in Java.LE 7 2. Sie bietet Operationen zur Erzeugung von Linien-. Java erlaubt das Zeichnen in s Behälter. innerhalb der Operation paint zugegriffen werden. Führungstexte. 2. Über einem Grafikbereich liegt in Java ein Koordinatensystem.12-1). wie Titelzeile.12-1: Das JavaKoordinatensystem Zeichenoperationen Zeichnet eine Zeichenkette in der aktuellen Schriftart. Sie wird ab der x-Position x von links nach rechts gezeichnet (Abb. Außerdem verwaltet sie die Zeichenfarbe. Über ihn ist es möglich.12 Einführung in die Grafik-Programmierung in Java paint nenten zählen in Java applets. 248 . Ihre Grundlinie befindet sich auf der mit y übergebenen y-Position. Die Maßeinheit entspricht einem Bildschirmpixel und ist damit geräteabhängig. wenn eine Komponente ganz oder teilweise neu gezeichnet werden muß. wenn ein Fenster zum erstenmal angezeigt wird oder durch Aktionen des Benutzers ein Teil des Fensters sichtbar wird. 2. und s die Komponente Canvas. Das Graphics-Objekt besitzt verschiedene Operationen. Jedesmal.0 10. dann wird die gewünschte Figur in die betreffende Komponente gezeichnet.und Textelementen. und einen Font. Wird innerhalb von paint eine der Zeichenoperationen des übergebenen Graphics-Objekts aufgerufen. Dies ist zum Beispiel dann der Fall.

s drawOval(int Hello World x. int y. int style. Standardmäßig sind folgende Schriftarten vorhanden: Serif. s drawLine(int x. int height. drawOval. lightGray. white. s translate(int x. start legt den Startwinkel und end den Endwinkel fest. Dabei gibt name die Schriftart an. fillOval. fillArc alternativ zu drawRect. SansSerif. Der Kilometerzähler soll in einem blauen Kreis dargestellt werden. int start. int y1) Zeichnet eine Linie von x.2. magenta. ausgehend von der Drei-Uhr-Position im mathematisch positiven Sinn.0 X int width.green). orange. style den Schriftschnitt und size die Schriftgröße in Punkten. ITALIC und PLAIN. s setFont(Font font) Setzt für den Grafik-Kontext die Schriftart neu fest. Monospaced. int x1. yellow. red. das durch die übergebenen Parameter spezifiziert wird. y).12. int size) Durch Aufruf des Konstruktors wird eine neue Schriftart erzeugt. 0. wobei x und y die Position der linken oberen Ecke 5 Y des Rechtecks angeben. green.1 Zeichnen von Objekten s drawRect(int LE 7 Abb. 5. s fillRect. folgende Schriftschnitte sind vorhanden: BOLD. int height) Zeichnet ein Rechteck in 50 den übergebenen Ausmaßen. Ist width = height. dann erhält man einen Kreis. Für die Angabe des Rechtecks gelten analog die Angaben wie für drawRect. y1. Zeichnet eine Ellipse innerhalb des Rechtecks.12-2: Positionierung von Text im GrafikKoordinatensystem x. Aufruf: z. int y. BOLDITALIC. blue. Der Winkel wird in Grad angegeben. s drawArc(int x. Folgende Standardfarben stehen zur Verfügung: black.B. int y. gray. y nach x1. Dazu wird in der Klasse Fallstudie ZaehlerGUI eine Operation paint eingefügt: 249 . 2. drawArc Das Zeichenobjekt wird mit der aktuellen Farbe ausgefüllt gezeichnet. Beispiel 1b: um ein Amaturenbrett nachzubilden. setColor(Color. Weitere Operationen sind: weitere s setColor(Color c) Operationen Festlegen der Zeichenfarbe für das Zeichenobjekt. cyan. int width. int width. int y) Verschiebt ein Koordinatensystem relativ zum Nullpunkt des Grafikkontextes. darkGray. int height) drawString ("Zeichenkette". Alle folgenden Textoperationen benutzen diese Schriftart. int end) Zeichnet einen Kreisbogen innerhalb des durch die ersten vier Parameter festgelegten Rechtecks. pink. int y. x. 50). hier: drawString ("Hello World". Die Klasse Font besitzt folgenden Konstruktor: public Font(String name.

import java.270). //}} } public void maleGesicht (int xPos.event.10.150).192. wechsleDruckknopf. add(wechsleDruckknopf).fillOval(30. wechsleDruckknopf. Graphics g) { 250 .blue).BOLD.addActionListener(einAktionsAbhoerer).setBackground(new Color(12632256)). //}} public void init() { //{{INIT_CONTROLS setLayout(null). public class Smilie extends Applet { boolean Wechsel = false. setSize(430.LE 7 Abb.awt.12-3: Grafische Darstellung des KM-Zählers 2.12-3.96. //Farbe neu setzen g. //Graphics import java.150. Es ergibt sich die Ausgabe der Abb. wechsleDruckknopf.drawString("KM-Stand". Einen ersten Vorschlag zeigt folgendes Programm: import java. wechsleDruckknopf. Beispiel 4: Fallstudie Die Firma ProfiSoft möchte ihre Web-Präsentation verbessern und möchte zur Begrüßung der Besucher einige bewegte Smilie-Gesichter anzeigen.70.applet.setBounds(120.white). int yPos. 2. 2.15)). Color Farbe.setColor(Color. wechsleDruckknopf = new Button(). //Schriftart.setLabel("Wechsle").*.*.85). //}} //{{REGISTER_LISTENERS AktionsAbhoerer einAktionsAbhoerer = new AktionsAbhoerer().12 Einführung in die Grafik-Programmierung in Java public void paint (Graphics g) { //Farbe setzen g.33). Font. } Der Führungstext wird entfernt und durch einen gezeichneten Text ersetzt.setFont(new Font("SansSerif".*. Schriftschnitt //und Schriftgröße neu setzen g. //{{DECLARE_CONTROLS Button wechsleDruckknopf. //Text zeichnen g.awt. //Kreis zeichnen g.setColor(Color.

yPos+37).yPos. // Haare } public void maleBebrilltesGesicht (int xPos. // Nase g. yPos + 25.g). xPos+43. yPos + 20). yPos -12).fillOval(xPos. yPos. 3. 3).drawLine(xPos+30. } public void maleHaarigesGesicht (int xPos. yPos -12). // Kopf g. yPos + 20). 10).drawLine(xPos+48. // rechtes Brillenglas g.drawOval(xPos.yPos. 12. yPos + 18. xPos + 30. 20. 3). 10. // Kopf g. yPos + 23.drawLine(xPos+30.yPos.drawLine(xPos+37. // Kopf g. // Haare g.60). 3. yPos + 24. yPos+45.60. yPos + 27.yPos+45).drawLine(xPos+30.yellow.60. yPos -12). 3). // Haare g. yPos + 25. xPos + 30.drawLine(xPos+30. xPos + 38.fillRect(xPos+17. // linkes Auge g. Graphics g) { maleGesicht (xPos.fillRect(xPos+17. yPos + 24.Color. g.fillRect(xPos+40.drawOval(xPos+25. yPos -12).setColor(Color. 3).drawLine(xPos+30. // Nase g. // rechter Bügel } public void maleBebrilltesGesichtMundAuf (int xPos. int yPos.drawLine(xPos+20. 3.60).drawLine(xPos+30.60).fillRect(xPos+40.drawLine(xPos+30.g).1 Zeichnen von Objekten g.yPos. 10. xPos + 30. yPos + 18. yPos + 24). yPos + 23.g). 3. 12.yellow. xPos + 22.yPos. yPos + 23.2.60.drawLine(xPos+24.yPos. int yPos.drawLine(xPos+20. // Steg g. g. yPos. yPos + 23. yPos. // rechtes Auge g. // Mund g.yellow. 3.yPos+45). yPos + 27.drawArc(xPos+20. yPos+45.drawLine(xPos+12.setColor(Farbe). xPos+3.yPos.g).yPos. xPos + 30. 3). // rechtes Auge g.yellow. // linkes Auge g. // Mund g. // Haare g. Graphics g) { maleGesicht (xPos. yPos + 18. 3. yPos.60). yPos+36. Graphics g) { maleGesicht (xPos. // Haare } public void maleHaarigesGesichtAugeZu (int xPos. xPos + 40.12). xPos+35.drawLine(xPos+30. // Haare g. // linker Bügel g. 12. // linkes Brillenglas 251 LE 7 . Graphics g) { maleGesicht (xPos. // Kopf g.Color. // rechtes Auge g. // rechtes Auge g. xPos + 38. // Kopf g.drawOval(xPos.drawLine(xPos+30.fillRect(xPos+17.black). // linkes Auge g.drawOval(xPos+12. -180). yPos + 24. yPos + 23. xPos + 30. xPos+57.60. yPos -12). // linkes Auge g.yPos. 3.12). xPos + 40. // Mund g. yPos -12).drawLine(xPos+30.drawOval(xPos+35. // Nase g.fillRect(xPos+17.12). xPos + 22. yPos+42.Color. yPos + 23.yPos+35). yPos + 24). 3).Color. 3). g.yPos+37). xPos + 30.fillRect(xPos+40. g. yPos. // linkes Brillenglas g.yPos+35). yPos + 23. // Nase g.60.drawOval(xPos.drawOval(xPos. yPos + 24.12. int yPos. // Mund g. g. 0.drawOval(xPos+12. int yPos. yPos.60).

} } class AktionsAbhoerer implements ActionListener { public void actionPerformed(ActionEvent event) { Wechsel = !Wechsel.20. } else { maleHaarigesGesicht (120.LE 7 2. maleBebrilltesGesicht (230.drawOval(xPos+35.drawLine(xPos+24.g).12).drawLine(xPos+12. 2. xPos+35. yPos + 20). // linker Bügel g. xPos+57.12 Einführung in die Grafik-Programmierung in Java g.blue). 252 . xPos+3. maleBebrilltesGesichtMundAuf (230.12-4: Smilie-Grafik 2. yPos + 24). yPos + 24. // Steg g. yPos + 18. yPos + 24.g). yPos + 24.g). Abb.20.20. 2. setBackground(Color. yPos + 20).12-4 zeigt einen Schnappschuß aus der Smilie-Anzeige. repaint(). //Aufruf von paint } } } Abb. 12.g). // rechtes Brillenglas g.drawLine(xPos+48.2 Bilder laden und anzeigen In Java können Bilder (images) – genauer gesagt bitmaps im gifoder jpg-Format – von einem externen Speicher oder aus dem Netz geladen und auf dem Bildschirm angezeigt werden. // rechter Bügel } public void paint( Graphics g ) { if (Wechsel) { maleHaarigesGesichtAugeZu(120.12.20.

z. s public abstract Image getImage(URL url) URL verweist auf ein Bild im Netz. können über die entsprechenden Operationen der Klasse dungen einbinden getImage Toolkit Bilder einbinden. um die URL zu erhalten. Anwendungen.2. so aus: Image meinBild. getImage kann auf zwei verschiedene Arten aufgetImage gerufen werden: s public Image getImage(URL url) Hier wird der Pfad zu einem Bild als absolute URL angegeben. z.gif"). String name) In dieser Version wird zusätzlich der Name des Bildes relativ zu der URL angegeben.B. erhält man die URL durch Aufruf dieser Operation. Jeder Komponente in Java ist ein aktuelles Toolkit zugeordnet. "Strand. Die Deklaration sieht z.12. s public URL getCodeBase() Diese Operation verwendet man. Diese Operation benutzt man in der Regel in Kombination mit den getImage-Operationen. meinBild = getToolkit(). die als Ergebnis ein Objekt der Klasse 253 .gif"). Ein Objekt der Klasse Frame besitzt. Bei einem applet wird hierzu die Operation getImage der Klasse Bilder in applets einbinden Applet verwendet.B. die Operation getToolkit(). Dadurch wird eine Verknüpfung zwischen einem Objekt der Klasse Image und dem Bild hergestellt. Das Erzeugen eines Objekts dieser Klasse geschieht durch Aufruf der Operation getImage. auf das man anschließend die Operation getImage anwenden kann. In jeder Anwendung. ob ein applet oder eine Anwendung vorliegt. sollte zumindest ein Frame als Komponente verwendet werden.2 Bilder laden und anzeigen LE 7 Image Ein Bild wird in einem Java-Programm durch ein Objekt der Klasse Image repräsentiert.B. auf der sich das APPLET-Tag befindet. in der sich das applet selbst befindet.getImage("Strand. s public URL getDocumentBase() Erfolgt die Angabe relativ zur HTML-Seite. Die Klasse Toolkit stellt in Java die Verbindung von der AWT-Bi- bliothek zu dem jeweils verwendeten Betriebssystem her. die nicht über die Operationen der Klasse Applet Bilder in Anwenverfügen. meinBild = getImage(getCodeBase(). wie die anderen Komponenten auch. Die Herstellung einer solchen Verknüpfung unterscheidet sich je nachdem. Dieses aktuelle Toolkit erhält man durch Aufruf der folgenden Operation: s public Toolkit getToolkit() getToolkit() Als Ergebnis der Operation erhält man das aktuelle Toolkit-Objekt. Dies geschieht folgendermaßen: s public abstract Image getImage(String filename) filename gibt den Pfad zu einem Bild auf dem lokalen Computersystem an. s public Image getImage(URL url. in der ein Bild eingebunden werden soll.

12 Einführung in die Grafik-Programmierung in Java Toolkit liefert.this). Ohne einen frame kann ein Bild in einer Anwendung nicht angezeigt werden. int y.14 bis 2.drawString("URLDocument= " + getDocumentBase(). z. Skalierungen und Verzerrungen sind daher möglich. Das Bild wird innerhalb eines Rechtecks gezeichnet. z.applet. Da die Schnittstelle Image Observer von der Klasse Component implementiert wird.70. nicht jedoch das Bild geladen. public void init() { //Image-Objekt durch Aufruf von getImage erzeugen meinBild = getImage(getCodeBase().30. int y. int x.gif").this). g. } public void paint(Graphics g) { g. //Zeichnen des Bildes g. int height.*. Folgende Varianten dieser Operation sind am wichtigsten: s drawImage(Image img. innerhalb eines applets oder eines frames stattfindet. die den Aufbereitungsvorgang von Bildern überwacht.B. public class BildGUI extends Applet { private Image meinBild. } } 254 Beispiel . wenn die Kapitel 2.10. ImageObserver ist eine Schnittstelle (interface). kann der erforderliche Parameter durch das Schlüsselwort this bereitgestellt werden.awt.LE 7 2. "Strand. 10. 10. Die linke obere Ecke des Bildes erscheint an der übergebenen Position. g. Im folgenden wird das einfachste applet und die einfachste Anwendung für das Laden und das Anzeigen eines Bildes gezeigt: /*Programmname: Laden und Anzeigen eines Bildes * GUI-Klasse: BildGUI (applet) */ import java.drawImage(meinBild.20. Dies geschieht erst. das durch die übergebenen Werte definiert ist. Mit getImage wird nur ein neues Objekt der Klasse Image angelegt. wenn der Aufruf von drawImage innerhalb der Klasse einer Komponente.*. s drawImage(Image img. ImageObserver observer) Hinweis: Dieser Textabschnitt wird erst voll verständlich.drawImage(meinBild. import java. int x.30). wenn das Bild zum ersten Mal mit der Operation drawImage der Klasse Graphics gezeichnet oder der Ladevorgang explizit gestartet wird.drawString("URLCodeBase= " + getCodeBase(). int width.B. ImageObserver observer) Laden und Zeichnen eines Bildes Das Bild wird in Originalgröße gezeichnet.50).16 behandelt sind. Es wird hierbei an die Größe des Rechtecks angepaßt.

setVisible(true).this).resize(400. } public void paint(Graphics g) { g. 2. } //Klassenoperation main public static void main(String args[]) { //Erzeugen eines Objekts von BildGUI einBildGUI = new BildGUI().*. Abb.2 Bilder laden und anzeigen /*Programmname: Laden und Anzeigen eines Bildes * GUI-Klasse: BildGUI (Anwendung) */ import java. //Konstruktor analog zu init() public BildGUI() { meinBild = getToolkit().2.awt.12-5: Ausgabe eines Bildes 255 . 2.20. einBildGUI. } } LE 7 Abb.12.getImage("Strand. public class BildGUI extends Frame { //Attribute private Image meinBild.12-5 zeigt die Ausgabe des applets.30.300).drawImage(meinBild. //Referenz-Attribut als Klassenattribut static BildGUI einBildGUI. einBildGUI.gif").

Dadurch ist es z. int sy2. sy1 = 0.12 Einführung in die Grafik-Programmierung in Java Zum Arbeiten mit Bildern gibt es noch eine Reihe von Operationen. public class BildGUI extends Applet { private Image meinBild. Die Skalierung erfolgt so. int height. Beispiel /*Programmname: Laden. int sx1. g.30). wird –1 zurückgegeben.drawString("Breite= " + Breite. import java. "Strand. public void init() { meinBild = getImage(getCodeBase(). int width.drawImage(meinBild. int dx1.*. Ein horizontales Spiegeln wird durch ein Vertauschen der horizontalen Werte für das Zielrechteck realisiert.drawString("Höhe= " + Hoehe. int dx.30. dy2 = Hoehe + 30 //Quellrechteck: sx1 = 0.*. dy1 = 30. Das folgende Beispiel zeigt den Einsatz dieser Operationen. s public abstract int getWidth(ImageObserver observer) Gibt analog die Breite des Bildes an.Breite. 100. int dx2.LE 7 2. 10. int sy1.this). ein Bild zu spiegeln. int dy1.gif").30). das auf das Laden wartet.B. int sx2.awt. int dy2. int y. //Nochmalige horizontal gespiegelte Ausgabe //Zielrechteck: dx1 = Breite * 2. Eine Auswahl wird im folgenden beschrieben: Klasse Image s public abstract int getHeight(ImageObserver observer) Gibt die Höhe des Bildes an. } public void paint(Graphics g) { //Höhe und Breite ermitteln int Hoehe = meinBild. möglich. //dx2 = Breite. g. Anzeigen und Spiegeln eines Bildes * GUI-Klasse: BildGUI (applet) */ import java. observer gibt das Objekt an. ImageObserver observer) Diese Operation überträgt eine unskalierte Version des Bildes (s = source) in ein Zielrechteck (d = destination) und nimmt die Skalierung beim Übertragen vor.getWidth(this).applet.Hoehe. daß die erste Koordinate des Quellrechtecks auf die erste Koordinate des Zielrechtecks abgebildet wird usw. s public abstract void copyArea(int x. //sy2 = Hoehe 256 .getHeight(this).20. Ist sie unbekannt. //Unskalierte Ausgabe g. Klasse Graphics s public abstract boolean drawImage(Image img. int Breite = meinBild. sx2 = Breite. int dy) Kopiert einen Bereich um die angegebenen Distanzen dx und dy.

Hoehe / 2. call by value →Parameterübergabemechanismus. der während der Operationsausführung ein Wert zugewiesen wird.0.Breite / 2. Der formale Parameter verhält sich wie eine lokale Variable.copyArea(Breite.copyArea(20.Breite. } } LE 7 Abb. Funktion →Prozedur.6 zeigt die Ausgabe des Programms. Beim Verlassen der →Operation wird der Wert des formalen Parameters dem aktuellen Parameter zugewiesen. Abb.30. 2.12-6: Manipulation von Bildern call by reference →Parameterübergabemechanismus. Innerhalb der →Operation bewirkt jede Verwendung des formalen Parameters eine indirekte Referenzierung auf den aktuellen Parameter. Hoehe / 2.Hoehe.this).Glossar g.drawImage(meinBild. g.30. die einen Ausgabeparameter (→Parameter) besitzt.Breite.30.20. bei dem die gerufene →Operation nur mit einer Kopie der Eingabeinformationen arbeitet. call by result →Parameterübergabemechanismus für Ausgabeparameter. die durch den Wert des aktuellen Parameters initialisiert wird. bei dem der Verweis auf den aktuellen Parameter an den formalen Parameter übergeben wird.Hoehe + 30.12. Hoehe).0. //Ausschnitt kopieren g. -Breite / 2.Breite * 2. Der formale Parameter dient als uninitialisierte lokale Variable. 2. Breite . Hoehe).Breite / 2. Beim Aufruf der Operation wird die Adresse des aktuellen Parameters in die Speicherzelle des formalen Parameters kopiert. Änderungen an dieser Kopie haben keine Rückwirkungen auf die Original-Attribute. Der Name des formalen Ausgabeparameters ist identisch mit dem Funk- 257 .

der Realisierung der Operation. Formale Parameter stehen in der Parameterliste der →Operations-Deklaration. Eine Funktion wird in →Ausdrücken aufgerufen. Überladen (overloading) →Operationen mit gleichen Namen können mehrmals in einer Klasse vorkommen. Das Schlüssselwort protected gilt im Zusammenhang mit der Vererbung. Parameterübergabemechanismus Art. Bei der Abarbeitung entsteht eine dynamische Schachtelungsstruktur. Operationskopf In Java wird eine Operation folgendermaßen deklariert: s private.h. Ein Prozeduraufruf ist eine Anweisung im Gegensatz zu einem Funktionsaufruf (→Funktion). Eine Operationsdeklaration besteht aus einem Operationskopf Operationsdeklaration und einem Operationsrumpf. einen eigenen Namen besitzt und als →Operation in einer Klasse deklariert wird (Java). an der diese Dienstleistung benötigt wird. getrennt durch einen Punkt. dann wird die Punktnotation angewandt. der eine Verzweigung zur Operationsdeklaration bewirkt.LE 7 Glossar/Zusammenhänge tionsnamen. steht ein →Prozeduraufruf (Angabe des Prozedurnamens und der aktuellen Parameter). Die Zuordnung von aktuellen zu formalen Parametern erfolgt durch Positionszuordnung. dann ist private anzugeben (lokale Operation). Der Informationsaustausch erfolgt über Ein. aktuelle Parameter befinden sich in der Parameterliste beim Aufruf (→Parameterübergabemechanismus). die die Ausführung einer deklarierten →Prozedur bewirkt. Parameter →Attribute. An der Stelle im Programm. Gehört die Prozedur zu dem Objekt einer fremden Klasse. die in Kapitel 2. eine Dienstleistung in Form einer →Operation zur Verfügung. Klassen bestehen aus Attributen und Operationen (Methoden). 258 . in der formale →Parameter beim →Operations-Aufruf durch aktuelle Parameter ersetzt werden. die eine Dienstleistung erbringt. die am Informationsaustausch zwischen →Operationen beteiligt sind.12 behandelt wird. Parameterliste Liste hinter dem Operationsnamen. overloading →Überladen. Soll die Operation nur innerhalb der eigenen Klasse aufrufbar sein. dann ist public anzugeben. in der die einzelnen →Parameter aufgeführt sind. Attributdeklarationen legen die Eigenschaften von Attributen fest. die sich selbst direkt oder indirekt aufrufen. Rekursive Algorithmen →Operationen. dem Botschaftssender. protected oder public: Sichtbarkeitsbereich der Operation. Darf die Operation von anderen Klassen in Anspruch genommen werden. Der Informationsaustausch geschieht über →Parameter.h. Prozeduraufruf Anweisung. Nach dem Objektnamen folgt.und Ausgabeparameter (→Parameter). d. Operation Oberbegriff für →Prozedur und →Funktion. sie werden in der →Parameterliste aufgeführt. Funktionale Abstraktion Stellt dem Anwender. wenn die Anzahl und/oder die Typen der →Parameter unterschiedlich sind. so daß die Leistung ohne Kenntnis der Implementierung. d. die Anzahl und die Typen ihrer formalen →Parameter. der Prozedurnamen eventuell gefolgt von der aktuellen →Parameterliste. Prozedur Anweisungsfolge. in Anspruch genommen werden kann. Der Compiler ordnet anhand der →Signatur die richtige Operation beim Aufruf zu. Operationsdeklarationen die Eigenschaften von Operationen. Signatur Name einer →Operation. Methode →Operation.

Wie die Leistung intern innerhalb der Operation erbracht wird. Liegt eine Funktion vor. solange sich ihre Signaturen unterscheiden. dann sollte der Aufruf innerhalb eines Ausdrucks erfolgen. Als Parameterübergabemechanismus wird call by result angewandt. dann wird vor den Operationsnamen der Objektname gefolgt von einem Punkt geschrieben (Punktnotation).Zusammenhänge LE 7 Typ des Ergebnisparameters. wenn es sich bei der Operation um eine Funktion handelt. d. Erfolgt der Aufruf aus einer fremden Klasse. Den Kern des Operationsrumpfes bilden die Anweisungen. dann ist die Operation überladen (overloading).h. die die jeweilige Dienstleistung der Operation erbringen. Damit die Dienstleistung einer Operation in Anspruch genommen werden kann. s Formale Parameterliste. Nach dem Operationsnamen folgt in Klammern die aktuelle Parameterliste – falls vorhanden. In Java werden in der Parameterliste zwei Parameterarten verwendet: n Für einfache Typen Eingabeparameter mit call by value als Parameterübergabemechanismus und n für Klassen Referenzparameter mit call by reference als Parameterübergabemechanismus. In einer Klasse können mehrere Operationen denselben Namen besitzen. Im Operationsrumpf können lokale Attribute deklariert und angewandt werden. dann sind nur die runden Klammern zu schreiben. Der Objektname gibt dabei das Objekt an. Eine Operation stellt für den Anwender eine funktionale Abstraktion zur Verfügung. wenn es sich bei der Operation um eine Prozedur handelt (besitzt keinen Ergebnisparameter). ist für ihn nicht sichtbar und nicht von Interesse. der Anwender muß nur wissen. Handelt es sich bei der Operation um eine Prozedur. Sie gelten nur innerhalb der jeweiligen Operation. sonst wird der Ergebniswert ignoriert. wie er die Operation aufruft. void. n Name des Parameters. von dem die jeweilige Operation in Anspruch genommen werden soll. dann ist der Prozeduraufruf eine eigenständige Anweisung. Fehlt die Parameterliste. Mehrere Parameter werden durch Kommata getrennt. Die formale Parameterliste ist folgendermaßen aufgebaut: n Typ des Parameters. Liegt eine solche Situation vor. dann spricht man von rekursiven Algorithmen. s Name der Operation. eingeschlossen in runde Klammern. s Operationsrumpf Überladen funktionale Abstraktion Operationsaufruf Rekursion 259 . Bei dem Ergebnisparameter kann es sich auch um ein Objekt handeln. muß die Operation innerhalb einer anderen Operation (der eigenen Klasse oder einer fremden Klasse) aufgerufen werden. Rufen sich Operationen selbst oder gegenseitig auf.

public void drucke() {} public boolean gibStatus () {return Status. /9/ Unter. 5 Lernziel: Grafiken programmieren und Bilder in Java einbinden können. um was für einen Typ es sich handelt. Welchen Sinn macht diese Unterscheidung? 3 Lernziel: Anhand von Beispielen zeigen können. /4/ Ein Tank kann um eine bestimmte Menge geleert werden. meldet der Tank eine Überschreitung der Soll-Füllhöhe. wie die beschriebenen Parameterübergabemechanismen funktionieren. Programmieren Sie ein Java-applet zur grafischen Darstellung eines Tanks. Achten Sie darauf. /7/ Die Füll. daß die Sollfüllhöhe jedes Tanks auch über die Benutzungsoberfläche eingegeben werden kann. Beschreiben Sie bei den folgenden Java. /5/ Wird beim Leeren die Höhe 0 unterschritten./ Leerungmenge in Litern kann in einem Textfeld eingegeben werden. meldet der Tank dies. und welche Parameter die Operation verwendet.LE 7 Analytische Aufgaben Muß-Aufgabe 15 Minuten Aufgaben 1 Lernziel: Die Unterschiede zwischen Prozeduren und Funktionen einschließlich der Syntax darstellen können.} public static int gibObjektanzahl() {return 0.Operationen. String zweiString) {return null. Muß-Aufgabe 30 Minuten 260 .} public int zaehleZeichen(String einString) {return 0. a = b. Erweitern Sie das Tank-Beispiel aus Aufgabe 4 so. /8/ Druckknöpfe erlauben das Füllen und Leeren um den eingestellten Betrag./ Überschreitungen werden als Statusmeldung ausgegeben. /2/ Ein Tank kann um eine bestimmte Menge gefüllt werden. Die Vorbelegung der Sollfüllhöhe soll bei 100 liegen. } Muß-Aufgabe 15 Minuten Funktioniert diese Implementierung? Begründen Sie Ihre Antwort. Betrachten Sie die folgende Java-Operation: public void tausche(int a.} Muß-Aufgabe 15 Minuten 2 Lernziel: Die Vorteile der funktionalen Abstraktion an Beispielen erläutern können.} public String verkette(String einString. /1/ Ein Tank besitzt eine Soll-Füllhöhe und eine Ist-Füllhöhe (in Litern). int b) { int x. daß durch die grafische Darstellung des Tanks seine Sollfüllhöhe erkannt wird. /6/ Die grafische Darstellung umfaßt einen Tankbehälter und einen Flüssigkeitsstand. /3/ Wird beim Füllen die Soll-Füllhöhe überschritten. x = a. b = x. Erklären Sie den Unterschied zwischen aktuellen und formalen Parametern. Konstruktive Aufgaben Muß-Aufgabe 60 Minuten 4 Lernziel: Grafiken programmieren und Bilder in Java einbinden können.

Aufgaben 6 Lernziel: Grafiken programmieren und Bilder in Java einbinden können. sollen Digitalzähler verwendet werden. eine zweite Variante addiert zwei float-Zahlen. Erweitern Sie das bisherige Java-Programm entsprechend der neuen Funktionalität. Eine schwarze senkrechte Linie markiert hierbei die 90°-Position. Beachten Sie die korrekten Parameterübergabemechanismen und erläutern Sie die verwendeten Übergabetypen. ein Druckknopf bestätigt die Ausführung. dann ist er bei beiden Zählern zu erhöhen und anzuzeigen. der Oberarm entsprechend zwischen –90° und +90°. 7 Lernziel: Grafiken programmieren und Bilder in Java einbinden können. /1/ Ein Roboterarm besitzt einen minimalen und maximalen Winkel. Erweitern Sie das Roboter-Beispiel aus Aufgabe 6 um einen über die Oberfläche steuerbaren Unterarm! 8 Lernziel: Die Unterschiede zwischen Prozeduren und Funktionen einschließlich der Syntax darstellen können. Die Firma ProfiSoft erhält vom Wasserwirtschaftsamt einen Auftrag. /5/ Relative und absolute Positionierungswinkel können in Textfelder eingegeben werden. Finden Sie zu jedem Aufgabenpunkt ein geeignetes Beispiel und deklarieren Sie (falls möglich) die Funktion/Prozedur in korrekter Java-Syntax: a Funktion mit zwei Eingabeparametern b Prozedur ohne Eingabeparameter c Prozedur mit je einem Eingabeparameter für die unterschiedlichen Parameterübergabemechanismen. d Prozedur mit zwei Ein/Ausgabeparametern 9 Lernziel: Operationen schreiben und den jeweils geeigneten Parameterübergabemechanismus auswählen können. die folgende Anforderungen erfüllen: 261 LE 7 Kann-Aufgabe 60 Minuten Kann-Aufgabe 30 Minuten Muß-Aufgabe 15 Minuten Muß-Aufgabe 30 Minuten Muß-Aufgabe 30 Minuten Kann-Aufgabe 30 Minuten . Programmieren Sie ein Java-applet zur grafischen Darstellung eines Roboter-Oberarms. Schreiben Sie eine Klasse »Werkzeug«. /4/ Eine Überschreitung der absoluten Winkelgrenzen wird gemeldet (Statuszeile). Die Firma ProfiSoft erhält von der Firma »KFZ Zubehoer GmbH« einen erweiterten Auftrag: /6/ Der Gesamtkilometer-Zähler soll ebenfalls digital angezeigt werden. /8/ Wird der Zählerstand erhöht. /7/ Im Gegensatz zum Tageskilometer-Zähler kann der GesamtkilometerZähler nur einmal auf Null gesetzt werden (Voreinstellung). die mehrere Operationen »plus« zur Verfügung stellt. Ändern Sie die Fachkonzept-Klasse nicht! 10 Lernziel: Überladene Operationen bei eigenen Problemlösungen geeignet verwenden können. /3/ Ein Roboterarm kann auch relativ positioniert werden. Eine Variante addiert zwei int-Zahlen. Um die Pegelstände von Flüssen anzeigen zu können. /2/ Der Oberarm kann absolut zwischen 45° und 135° positioniert werden. 11 Lernziel: Operationen schreiben und den jeweils geeigneten Parameterübergabemechanismus auswählen können. /6/ Der Oberarm wird grafisch durch eine gefärbte Linie repräsentiert. eine dritte Variante verkettet zwei Zeichenketten.

2. Schreiben Sie eine Operation vervielfacheZeichenkette(). Von welchem Typ sind Operation und Parameter? 13 Lernziel: Einfache rekursive Operationen schreiben können. die die Summe der ersten n natürlichen Zahlen berechnet. Muß-Aufgabe 15 Minuten 12 Lernziele: Referenztypen erklären und richtig einsetzen können und anhand von Beispielen zeigen können. die zu berechnende Fakultät einzugeben. wie die beschriebenen Parameterübergabemechanismen funktionieren. die eine Eingabezeichenkette n mal hintereinanderhängt und dieses Ergebnis als String zurückgibt. /2/ Alle Zähler sind mit Null zu initialisieren.16) eine geeignete Benutzungsoberfläche. Objekte sowohl als Eingabeparameter als auch als Ergebnisparameter bei Funktionen verwenden können. Muß-Aufgabe 40 Minuten Abb. d Binden Sie die Funktion in ein einfaches applet ein.9. a Schreiben Sie zunächst eine Version unter Verwendung der Summenformel n Σ i = 2 (n + 1) i=1 n b Schreiben Sie anschließend eine iterative Version. c Schreiben Sie eine rekursive Operation. die n-Leerzeichen in einem Textfeld (textarea) ausgibt. Rufen Sie diese Operation innerhalb von nFak auf. Modifizieren Sie die bisherige Fachkonzeptklasse Zaehler entsprechend und gestalten Sie eine geeignete Benutzungsoberfläche mit zwei Pegelstands-Anzeigern. Operationen schreiben und den jeweils geeigneten Parameterübergabemechanismus auswählen können. Geben Sie das Ergebnis in einem mehrzeiligem Textfeld (textarea) aus. um bei jedem Aufruf den aktuellen Wert von n um n -Leerzeichen nach rechts eingerückt auszugeben. 2. das eine Eingabe der Zahl n in einem Textfeld ermöglicht und die Ausgabe der drei nach a.12-7. Auf die Trennung GUI–Fachkonzept können Sie in diesem Fall der Einfachheit halber verzichten. Schreiben Sie eine Funktion bildeSumme.LE 7 Aufgaben /1/ Die Zähler können Aufwärts und Abwärts gezählt werden. Eine mögliche Benutzungsoberfläche zeigt Abb. a Schreiben Sie zu der Funktion nFak (Abschnitt 2. b Erweitern Sie die Operation nFak so. die es ermöglicht. daß bei jedem Aufruf der aktuelle Wert von n ausgeben wird. 262 .12-7: Verdeutlichung des dynamischen Ablaufs einer Rekursion Klausur-Aufgabe 40 Minuten 14 Lernziel: Einfache rekursive Operationen schreiben können. c Schreiben Sie nun eine rekursive Version. b und c gebildeten Ergebnisse (die natürlich identisch sein sollten) in einem Textbereich ermöglicht. /3/ Die Zähler können jeweils um ± 1 oder um ± 5 verändert werden.

qualitätsgerecht und aufwandsgerecht auswählen und einsetzen können. Kontrollstrukturen 264 Die Sequenz 265 Die Auswahl 265 Die Wiederholung 272 Der Aufruf 282 Geschachtelte Kontrollstrukturen 282 Anordnung von Auswahlanweisungen 287 Auswahl von Kontrollstrukturen 290 Strukturierte Programmierung 290 Behandlung von Ausnahmen 294 2.5 2. Die Darstellungsformen Struktogramm und Java-Syntax ineinander überführen können.3 2.9 263 .7 2. Wiederholung. Syntax und Semantik linearer Kontrollstrukturen (Sequenz.6 2.1 2.13.LE 8 2 Grundlagen der Programmierung – Kontrollstrukturen s s s s s s s Programmablaufpläne (PAP) kennen.13.2 bis 2. Struktogramme lesen und erstellen können.13. Aufruf) in den Darstellungsformen Struktogramm und Java-Syntax erläutern können. wissen verstehen anwenden beurteilen s Die Kapitel 2.12 müssen bekannt sein. Für gegebene.13.13.8 2.13. Den Begriff »strukturiertes Programmieren« kennen. Auswahl.13 2.4 2. Lineare Kontrollstrukturen ineinander schachteln können.13.13.2 2.13. geeignete Problemstellungen die dafür angemessenen linearen Kontrollstrukturen problemgerecht.

Anweisungen Kontrollstrukturen Ziele Abb.h.13 Kontrollstrukturen In der Programmierung unterscheidet man prinzipiell s einfache Anweisungen und s Steueranweisungen. in welcher Reihenfolge. Kontrollstrukturen sollen – es ermöglichen.13.8). 2.0f. problemangepaßter Form zu beschreiben. Kontrollstrukturen steuern die Ausführung von Anweisungen. Radius = Durchmesser / 2.13-1: Gliederung von Anweisungen einfache Anweisungen Kontrollstrukturen Sequenz Auswahl Wiederholung Aufruf strukturierte Programmierung Seit der Entwicklung der strukturierten Programmierung Anfang der 70er Jahre gilt es als »Stand der Technik«. s Wiederholung. – mit minimalen.13 Kontrollstrukturen 2. z. Eine problemadäquate Umsetzung von Problemlösungen in Kontrollstrukturen wird durch folgende vier semantisch unterschiedliche Kontrollstrukturen ermöglicht (Abb.13-1): s Sequenz. ob bzw. Einfache Anweisungen sind Zuweisungen mit oder ohne Ausdrücke.B. – eine leichte Zuordnung zwischen statischem Algorithmustext und dynamischem Algorithmuszustand erlauben. s Aufruf anderer Algorithmen. daß sich die Problemstruktur im Algorithmus widerspiegelt. nur diese vier Kontrollstrukturen zu verwenden (siehe Abschnitt 2. 264 . s Auswahl. 2. s Java-Syntax und s Programmablaufplan-Notation. Im folgenden wird die Semantik dieser vier Kontrollstrukturen skizziert. – leicht lesbar und verständlich sein. Gleichzeitig werden diese Kontrollstrukturen in drei verschiedenen Notationen angegeben: s Struktogramm-Notation. orthogonalen Konzepten ein breites Anwendungsspektrum abdecken. – so beschaffen sein. wie oft Anweisungen ausgeführt werden sollen. Problemlösungen in natürlicher.LE 8 2. sie geben an. Kontrollstrukturen genannt. – Korrektheitsbeweise von Algorithmen erleichtern. d.

Flußdiagramme sind seit 1969 in Gebrauch und genormt /DIN 66001/. Aneinanderreihung (Abb. Urheber des HypermediaSystems Hyperties. Die Notation ist in /DIN 66261/ genormt.1 Die Sequenz Erfordert eine Problemlösung. 265 Prof. wird sie zwar in den Vergleichen mit aufgeführt. University of Maryland . Promotion an der State University of New York. Die Programmablaufplan-Notation (PAP) benutzt grafische PAP Symbole.13. aber nicht detailliert behandelt. } 2. auch Verzweigung oder Fallunterscheidung genannt.2. die durch Linien miteinander verbunden sind.2 Die Auswahl Sollen Anweisungen nur in Abhängigkeit von bestimmten Bedingungen ausgeführt werden. s Mehrfachauswahl. Miterfinder der StruktogrammNotation (1973). Dr. Einen Quervergleich grafischer Notationen für Kontrollstrukturen enthält /DIN EN 28631/. 2. PAP bzw. um Kontrollstrukturen zu beschreiben. Es gibt drei verschiedene Auswahl-Konzepte. dann verwendet man das Konzept der Auswahl.2 Die Auswahl LE 8 Die Struktogramm-Notation beruht auf einem Vorschlag von /Nassi. Die Kenntnis dieser Notation ist noch erforderlich. Bei der Sequenz erfolgt die Abarbeitung immer von oben nach unten und von links nach rechts (falls in Java mehr als eine Anweisung in einer Zeile steht). In Java besteht der Rumpf einer Operation aus Anweisungen Java (statements) (Abb. dann formuliert man eine Sequenz bzw. heute Professor of Computer Science. Da diese Darstellung eine Reihe von Nachteilen aufweist.13-2). daher auch Nassi-Shneiderman-Diagramm genannt. Ben Shneiderman * 1947 in New York. Struktogramme Shneiderman 73/. da manche Programme in dieser Notation dokumentiert sind.13-3). 2. USA.und zweiseitigen Auswahl. daß mehrere Anweisungen hintereinander auszuführen sind. Wegbereiter der direkten Manipulation von Benutzungsoberflächen und der SoftwarePsychologie (Bücher: Software Psychology 1980. und ermöglicht eine grafische Darstellung von Kontrollstrukturen. In den bisherigen Beispielen wurden in einem Operationsrumpf sowohl lokale Attribute deklariert als auch Zuweisungen und Anweisungen mit Ausdrücken (StatementExpression) aufgeführt. public void erhoeheUmEins() { MerkeZahl = MerkeZahl + 1.13-4 zeigt die Darstellungsformen der ein.13.13. s zweiseitige Auswahl. die jeweils für bestimmte Problemlösungen geeignet sind: s einseitige Auswahl. 2. Abb. 2. Designing the User Interface 1987).

continue Identifier .LE 8 2. ) ( Statement Expression . ) . StatementExpression if ( Expression .13 Kontrollstrukturen MethodDeclaration MethodHeader Operations-Deklaration MethodBody MethodBody Block . Operations-Rumpf Block { LocalVariableDeclarationStatement Statement } Statement Block . TryStatement Abb.13-2: Java-Syntax für Anweisungen 266 . ) Statement else Statement switch ( Expression ) { case default ConstantExpression : : LocalVariableDeclarationStatement Statement } while do for ( Statement ( Expression while . 2. ) Statement ForInit Expression ForUpdate break Identifier .

dx + ey = f. wahr. Bei Java beginnen die Ja-Anweisungen hinter dem geklammerten Konvention Ausdruck. Die Ja-Anweisungen sollten textuell eingerückt unter dem Ausdruck in einer neuen Zeile beginnen. die Attribut-Deklarationen ebenfalls anzugeben. das die Attribut-Deklarationen enthält. Ist die Bedingung erfüllt bzw. Bei Programmiersprachen fehlt bei der einseitigen Auswahl der else-Zweig. Die einzelnen Anweisungen werden durch Semikolon (. Im folgenden wird vor den Anweisungsteil des Struktogramms immer ein Viereck gesetzt (durch eine doppelte Linie getrennt). 2. dann werden die Ja-Anweisungen ausgeführt.13-3: Notation der Sequenz Java Anweisung1. 267 . 2. LE 8 Abb. PAP Anweisung1 Anweisung2 Anweisung3 Durch die Bedingungen wird eine Auswahl der auszuführenden Anweisungen vorgenommen. sonst die Nein-Anweisungen. Bei der einseitigen Auswahl handelt es sich um einen Sonderfall der zweiseitigen Auswahl.) voneinander getrennt. Obwohl Struktogramme ursprünglich nur zur Darstellung von Hinweis Anweisungen entwickelt wurden. Anweisung3. Das Struktogramm zeigt Abb.2 Die Auswahl Sequenz Struktogramm allgemein Anweisung1 Anweisung2 Anweisung3 Erläuterung Ein beliebig groß gewähltes Viereck wird nach jeder Anweisung mit einer horizontalen Linie abgeschlossen.Beispiel riablen: ax + by = c. Programm zur Lösung von zwei linearen Gleichungen mit zwei Va. Einfache Anweisungen werden durch Rechtecke dargestellt.2.13-5. Anweisung2. sollte man sich angewöhnen. Im else-Zweig steht keine Anweisung.13. die wiederum durch Ablauflinien verbunden werden.

Anweisung(en) Java if (Ausdruck) Ja-Anweisung.LE 8 2. sonst die Nein-Anweisungen ausgeführt. d. y float Nenner Nenner = a * e – b * d ja // Eingabe-Parameter // Ergebnis-Parameter // Hilfsgröße abs(Nenner) > Eps Fehler: "Nenner = 0" nein x = (c * e – b * f)/Nenner y = (a * f – c * d)/Nenner Eine mögliche Java-Lösung sieht folgendermaßen aus: /*Programmname: Lineare Gleichung * Fachkonzept-Klasse: LineareGleichung * Aufgabe: Berechnet jeweils eine * lineare Gleichung und speichert die Werte */ 268 . kann auch ein Block stehen: {Anweisungen.13-5: Struktogramm zur Lösung von zwei linearen Gleichungen Operation berechne float a. dann werden die Ja-Anweisungen. 2. else Nein-Anweisung.} Semantik analog Java. Bei der einseitigen Auswahl entfällt das Rechteck mit Nein-Anweisungen. Anstelle von Anweisung.und zweiseitigen Auswahl Abb. b. Abb.und zweiseitig) Struktogramm Ausdruck Wahr Ja-Anweisung Falsch Nein-Anweisung (bei einseitiger Auswahl leer) Ist der Ausdruck wahr. Das Ergebnis des Ausdrucks muß vom Typ boolean sein. e. f float x.13 Kontrollstrukturen allgemein Erläuterung Auswahl (ein. PAP Ausdruck Wahr Ja-Anw. Falsch Nein-Anw. 2. Anweisung(en). Semantik analog zum Struktogramm. Bei der einseitigen Auswahl fehlt »else Anweisung«. c.13-4: Notationen der ein.

b * d.b * f) / Nenner.berechne(a. } //Leseoperationen public float getx () { return x. } else ergebnisTextbereich.f).d.append("x= " + String. if (ok) { //Block in der Ja-Anweisung ergebnisTextbereich.2.getx()) + "\n"). //Die mathematische Operation abs() befindet sich //als Klassenoperation in der Standardklasse Math if (Math.valueOf(ersteGleichung.13.y.abs(Nenner) > Eps) { x = (c * e .0E-6f.valueOf(ersteGleichung. y = (a * f .b.gety()) + "\n").e.append("Fehler: Nenner = 0").2 Die Auswahl public class LineareGleichung { //Attribute zur Speicherung der Ergebnisse float x. //einzelne Anweisung als Nein-Anweisung 269 . ergebnisTextbereich.float d.append("y= " + String.float f) { //Lokale Attribute float Nenner.c. return true. float e. } public float gety () { return y. } else return false. //Für Abfrage auf Gleichheit final float Eps = 1.c * d) / Nenner. } } LE 8 Ausschnitt aus der Klasse LineareGleichungGUI: //Aufruf der Operation berechne() der Fachkonzept-Klasse boolean ok = ersteGleichung. //Nenner berechnen und auf Null abfragen Nenner = a * e .float b. //Konstante //Konstruktor public LineareGleichung() { } //Operation zur Lösung von zwei linearen //Gleichungen mit zwei Unbekannten public boolean berechne(float a.float c.

dann werden alle Anweisungen bis zum nächsten break oder dem Ende der switch-Anweisung durchgeführt.13 Kontrollstrukturen Java Die Benutzungsoberfläche zeigt Abb. Die Werte der konstanten case-Ausdrücke müssen disjunkt sein. und es wird hinter der switch-Anweisung fortgefahren.13-6: Benutzungsoberfläche des Programms »Lineare Gleichung« 2. 2. Fehlt die break-Anweisung. 2. b Ist eine der case-Konstanten gleich dem Wert des Ausdrucks.13-6. /*Programmname: Ziffern in Worte * GUI-Klasse: ZiffernInWorteGUI * Eine eingegebene Ziffer wird in Worten ausgegeben */ Beispiel 270 . byte. dann werden alle Anweisungen hinter default ausgeführt. Der Typ des Ausdrucks muß char. Jede im Block enthaltene Anweisung kann mit einer oder mehreren caseMarkierungen und maximal einer default-Markierung markiert sein. Die optionale break-Anweisung sorgt für einen Sprung an das Ende der switch-Anweisung.LE 8 Abb. 2. und alle Anweisungen hinter dieser case-Markierung werden der Reihe nach ausgeführt. In Java übergibt die switch-Anweisung in Abhängigkeit vom Wert des Ausdrucks hinter switch die Kontrolle an eine von mehreren Anweisungen. d Trifft kein Fall zu und gibt es keine default -Anweisung. dann wird die Mehrfachauswahl verwendet (Abb.13-7). short oder int sein. c Trifft kein Fall zu und gibt es eine default-Anweisung. dann wird nichts unternommen. Eine switch-Anweisung wird folgendermaßen abgearbeitet: a Der Ausdruck hinter switch wird ausgewertet. Der Rumpf einer switch-Anweisung muß ein Block sein. Muß zwischen mehr als zwei Möglichkeiten gewählt werden. Jeder konstante Ausdruck einer case-Markierung muß typverträglich mit dem Ausdruck hinter switch sein. dann tritt der entsprechende Fall ein.

4 import java. Ist ein entsprechender Fall nicht aufgeführt.13-7: Notationen der Mehrfach-Auswahl . break. 2 Fall 3 Anw..awt. 3 default AusnahmeAnweisungen Anweisung(en) Java switch (Ausdruck) { case konstanterAusdruck1: Anweisung(en). import java. i = Integer.. default: Anweisung. public class ZiffernInWorteGUI extends Applet { //Attribute . int Zahl = i. 1 /DIN 66261/ LE 8 Erläuterung Ausdruck Fall 2 Anw. 271 Abb.. Integer i. PAP Auswahl = Fall 1 Fall 2 Fall 3 others Anw. //Innere Klasse class AktionsAbhoerer implements ActionListener { public void actionPerformed(ActionEvent event) { String eineZahlAlsText. Shneiderman 73/ Ausdruck Fall 1 Anw.1 Anw.13.*. } Anweisung(en). wird die Anweisung hinter default ausgeführt.2 Die Auswahl Mehrfachauswahl allgemein Struktogramm /Nassi.getText(). break.*. 3 default AusnahmeAnweisungen Fall 1 Anw. 2.2 Anw.2.valueOf(Merke). case konstanterAusdruck2: Anweisung(en).3 Anw. Anweisung(en) Der Ausdruck dient als Selektor zum Auswählen der einzelnen Fälle. . 1 Fall 2 Anw.. //Integer ist eine Klasse! //Inhalt des Eingabefeldes in eine Zahl umwandeln String Merke = eingabeTextfeld.applet.intValue(). 2 Fall 3 Anw.

break. sondern die nächste case -Anweisung ausgeführt (»Fall durch die Markierung«). } ergebnisTextfeld. so ist das Konzept der Wiederholung 272 .13. case 2: eineZahlAlsText = "Zwei". case 0: eineZahlAlsText = "Null". break.3 Die Wiederholung Sollen eine oder mehrere Anweisungen in Abhängigkeit von einer Bedingung wiederholt oder für eine gegebene Zahl von Wiederholungen durchlaufen werden. break. – Den default-Fall als letzten Fall hinschreiben. case 7: eineZahlAlsText = "Sieben". 2. break. Der Java-Interpreter wertet nur einmal zu Beginn der switch-Anweisung den Ausdruck aus und springt dann zu der entsprechenden Marke. case 5: eineZahlAlsText = "Fünf". 2. break.break.13-8 zeigt die Benutzungsoberfläche von »ZiffernInWorte«. default: eineZahlAlsText = "Fehlerhafte Eingabe.13 Kontrollstrukturen //Zahl in einen Text umwandeln switch(Zahl) { case 1: eineZahlAlsText = "Eins". bitte nur eine Ziffer eingeben!". break. break. sonst wird nicht an das switchEnde gesprungen.setText(eineZahlAlsText). case 9: eineZahlAlsText = "Neun".LE 8 2. break. – Jeden Fall mit break abschließen. case 8: eineZahlAlsText = "Acht". case 4: eineZahlAlsText = "Vier". case 3: eineZahlAlsText = "Drei". Abb.13-8: Benutzungsoberfläche von »ZiffernInWorte« Aus Gründen einer sicheren Programmierung sollten bei der Regeln switch-Anweisung immer folgende Regeln eingehalten werden: – Immer einen default-Fall vorsehen. 2. break. case 6: eineZahlAlsText = "Sechs". } }//Ende innere Klasse } Abb. Ab da sind für ihn alle Marken uninteressant.

Wiederholung mit Abfrage nach jedem Wiederholungsdurchlauf for (Startausdruck.13-9): s Wiederholung mit Abfrage vor jedem Wiederholungsdurchlauf. Schleife zu verwenden. } Anweisung(en). Schrittweite) { Wiederholungsanweisungen.13-9: Notationen der Wiederholung Wiederholung Struktogramm allgemein Ausdruck Wiederholungsanweisung(en) Anweisung(en) Erläuterung Wiederholung mit Abfrage vor jedem Wiederholungsdurchlauf Wiederholungsanweisung(en) Ausdruck Anweisung(en) Wiederholung mit Abfrage nach jedem Wiederholungsdurchlauf for (Startausdruck. Endeausdruck. Schrittweite) Wiederholungsanweisung(en) Anweisung(en) Wiederholung mit fester Wiederholungszahl (Zählschleife. 2. Laufanweisung) Java while (Ausdruck) { Wiederholungsanweisungen.3 Die Wiederholung LE 8 3 Wiederholungskonstrukte bzw. Anweisung(en). Endeausdruck. Drei Wiederholungskonstrukte werden unterschieden (Abb. PAP Schleife 1 Ausdruck Schleife 2 Schleife 3 AW = 1 SW = 1 EW = 10 Anweisung Wiederholung mit fester Wiederholungszahl (Zählschleife. s Wiederholung mit Abfrage nach jedem Wiederholungsdurchlauf. } while (Ausdruck).2. Laufanweisung) analog Struktogramm AW = Anfangswert SW = Schrittweite EW = Endwert Anweisung Anweisung Ende Schleife 1 Ausdruck Ende Schleife 2 Ende Schleife 3 273 . 2. Abb. } Anweisung(en).13. Wiederholung mit Abfrage vor jedem Wiederholungsdurchlauf do { Wiederholungsanweisungen. s Wiederholung mit fester Wiederholungszahl.

Die Bedingung muß daher am Anfang der Wiederholung bereits einen eindeutigen Wert besitzen. der angibt. Bei der Wiederholung mit Abfrage nach jedem Wiederholungsdurchlauf wird solange wiederholt. Dann wird hinter der zu wiederholenden Anweisung bzw. Einige Probleme erfordern auch ein Abwärtszählen.LE 8 2. Auf diese Möglichkeit sollte verzichtet werden. daß nach der geforderten Wiederholungszahl der Abbruch erfolgt. /*Programmname: Potenz * GUI. wie die Bedingung erfüllt ist. Die Zählervariable wird als Nebeneffekt des Schrittweiten-Ausdrucks pro Durchlauf entsprechend modifiziert. Die for-Anweisung in Java ist bei undisziplinierter Verwendung eine gefährliche Konstruktion. Sie sollte daher nur defensiv – wie im obigen Beispiel – benutzt werden. wenn die Schleife so initialisiert wird. Bei der Wiederholung mit Abfrage vor jedem Wiederholungsdurchlauf wird solange wiederholt. ob die Zählervariable erhöht oder erniedrigt werden soll und um welchen Betrag. dann wird die Wiederholungsanweisung keinmal ausgeführt. } + 1) Beispiel Programmierhinweis Die Java-Syntax erlaubt noch mehrere Möglichkeiten. Anweisungsfolge fortgefahren. for (int Grad = VonWinkel. Grad <= BisWinkel. Eine Wiederholung mit Abfrage nach jedem Durchlauf läßt sich auf eine Wiederholung mit Abfrage vor jedem Durchlauf zurückführen. wie die Bedingung erfüllt bzw. da die Bedingung erst am Ende abgefragt wird. der Ausdruck wahr ist. Ist die Bedingung bereits am Anfang nicht erfüllt.13 Kontrollstrukturen Abfrage vor Wiederholung Abfrage nach Wiederholung Zählschleife Java Die ersten beiden Wiederholungskonstrukte bezeichnet man als bedingte Wiederholung. dann wird die sogenannte Zählschleife bzw. In Java wird im Startausdruck der Zählschleife die Zählervariable deklariert und initialisiert.. Laufanweisung verwendet. Die zu wiederholenden Anweisungen werden also in jedem Fall einmal ausgeführt. daß die Bedingung am Anfang erfüllt ist. Der Endeausdruck definiert die Abbruchsgrenze. Auch dies kann mit der Zählschleife dargestellt werden. Liegt bei einem Problem die Anzahl der Wiederholungen von Anfang an fest..und Fachkonzept-Klasse: PotenzGUI * Aufgabe: Potenzierung einer Zahl */ Beispiel 274 . Grad = Grad { . Insbesondere können Ausdrücke weggelassen werden. Bei Schrittweite handelt es sich um einen Ausdruck. Die Anzahl der Wiederholungen wird durch eine Zählvariable mitgezählt und die Bedingung so gewählt.

f = Float.floatValue().*. //Eingabe //Eingabe. //Ausgabe //Hilfsgrößen String Merke. Integer i.getText(). float Potenz. Fehlermeldung Ergebnis = "Fehler: Exponent muß > 0 sein!". //Float ist eine Klasse //Inhalt der Eingabefelder in Zahlen umwandeln Merke = basisTextfeld. while(Exponent >= 1) { Potenz = Potenz * Basis.0f.awt.1. }//Ende Operation }//Ende innere Klasse } LE 8 Die zugehörige Benutzungsoberfläche zeigt Abb.valueOf(Merke).applet. // Berechnung durchführen if(Exponent >= 1) //Exponent ist ok. Basis = f.toString(Potenz). ergebnisTextfeld.event. Ergebnis. Exponent = i. 2. Annahme: positive ganze Zahl int Exponent. Exponent = Exponent .13.13-10. import java.3 Die Wiederholung import java.valueOf(Merke). //Innere Klasse class AktionsAbhoerer implements ActionListener { public void actionPerformed(ActionEvent event) { float Basis. } else //Exponent ist nicht ok (< 1).awt. //Potenzierung kann durchgeführt werden { //Algorithmus Potenzierung Potenz = 1. Merke = exponentTextfeld.setText(Ergebnis). import java.. 275 . //Integer ist eine Klasse Float f.2.*..intValue().getText(). public class PotenzGUI extends Applet { //Attribute . } //Zahl in Text umwandeln Ergebnis = Float. i = Integer.*.

2. private float QuadratAGeschw = 0.13-11: Formeln zum »schiefen Wurf« Beim schiefen Wurf mit der Anfangsgeschwindigkeit v0 für t = 0 und dem Wurfwinkel α (0 < α < π/2) gelten folgende Formeln: W= tw = H= 2 v0 y H vy sin 2α g Größte Wurfweite Zeit zum Erreichen von W v0 2v0 sin α g v0 sin α 2g 2 2 0 Größte Wurfhöhe Wurfweite nach Ablauf der Zeit t Bahngeschwindigkeit nach Ablauf der Zeit t tH = vx v0 sin α g xH W Zeit zum Erreichen von H x x = v0 t cos α 2 vB = v0 – 2g y y = v0 t sin α – g t2 2 Wurfhöhe nach Ablauf der Zeit t 276 .13 Kontrollstrukturen Beispiel Der schiefe Wurf läßt sich durch die Formeln der Abb.0f. private float AGeschw = 0. /* Programmname: Schiefer Wurf * Fachkonzept-Klasse: Wurf * Aufgabe: Stellt Operationen zum Berechnen * eines schiefen Wurfs zur Verfügung * Mathematische Operationen werden von der Klasse Math verwendet */ public class Wurf { //Attribute private final float g = 9. //Konstruktor public Wurf() { } //Interne Hilfsoperationen private float Gradbogen(float Winkel) Abb. private final float pi = (float)Math.0f.81f.13-10: Benutzungsoberfläche des Programms Potenz 2.13-11 beschreiben. 2. 2.LE 8 Abb.PI.

} public float gibSteigHoehe(float Winkel) { return (QuadratAGeschw * SinAlfa(Winkel) * SinAlfa(Winkel)) / (g*2).sin(Gradbogen(Winkel)). } public float gibWurfWeite(float Winkel) { return QuadratAGeschw * SinAlfa(2 * Winkel) / g. } public float gibHoehe(float Winkel.cos(Gradbogen(Winkel)).0f.0f * tH(Winkel).g/2 *x*x/QuadratAGeschw/ CosAlfa(Winkel)/CosAlfa(Winkel)). } public float gibWurfZeit(float Winkel) { return 2.13. } private float CosAlfa(float Winkel) { return (float)Math. float x) { // Wurfhoehe bei Startwinkel Winkel in Entfernung x // Formel x nach t aufgelöst und in Formel y eingesetzt return (x*TanAlfa(Winkel) . } public float gibSteigZeit(float Winkel) { return tH(Winkel). } //Operationen public void setAnfangsGeschw(float AnfangsGeschw) { AGeschw = AnfangsGeschw. QuadratAGeschw = AnfangsGeschw * AnfangsGeschw.sin(Gradbogen(Winkel)) / g. } public float getAnfangsGeschw() { return AGeschw.2. } private float TanAlfa(float Winkel) { return (float)Math. } private float SinAlfa(float Winkel) { return (float)Math.tan(Gradbogen(Winkel)). } private float tH(float Winkel) { return AGeschw * (float)Math. } } LE 8 277 .3 Die Wiederholung { return pi * Winkel / 180.

event. Wurfweite.. import java. wurfZeichenflaeche = new java. wurfZeichenflaeche.*.addActionListener (einAktionsAbhoerer).*.120. * Anfangsgeschwindigkeit * Ausgaben: Tabelle mit Winkel. berechnenDruckknopf.applet. //{{DECLARE_CONTROLS . Anfangsgeschw. add(wurfZeichenflaeche). } //Innere Klasse class AktionsAbhoerer implements ActionListener { public void actionPerformed(ActionEventevent) { StringMerke.LE 8 2.13 Kontrollstrukturen /* Programmname: Schiefer Wurf * GUI-Klasse: WurfGUI * Aufgabe: Erstellung einer Grafik und einer Tabelle * für den schiefen Wurf * Eingaben: Winkelbereich (VonWinkel.setBackground(new Color(15395562)). BisWinkel = 0..*. //Dient zum Wandeln der Texteingabe in Zahlen Integer i.168).Canvas().awt. import java. wurfZeichenflaeche. BisWinkel).awt..awt. AGeschw = 0.. Steighöhe. * Wurfzeit. //}} } public void paint(Graphics g) { //Zeichnen der Wurfparabel auf der Zeichenfläche erstelleGrafik(wurfZeichenflaeche). //}} //Operationen public void init() { einWurf = new Wurf(). //}} //{{REGISTER_LISTENERS AktionsAbhoerer einAktionsAbhoerer = new AktionsAbhoerer(). //Integer ist eine Klasse //Inhalt der Eingabefelder in Zahlen umwandeln 278 .456. public class WurfGUI extends Applet { //Attribute private int VonWinkel = 0. Steigzeit * + grafische Ausgabe */ import java. //Eingaben private Wurf einWurf.. //{{INIT_CONTROLS .setBounds(36.

valueOf(Merke). //Breite und Höhe begrenzen den Zeichenraum int maxX = cDim.width.height.intValue().min(skalierung1.getGraphics(). //Größe der Zeichenfläche Dimension cDim = c.gibWurfWeite(VonWinkel) != 0.getSize(). Merke = geschwTextfeld.height).getText(). weiten Wurf ist die Breite der //Zeichenfläche der limitierende Faktor float skalierung1 = (float)Math.cDim. BisWinkel = i.0. } }//Ende innere Klasse private void erstelleGrafik(Canvas c) { if((einWurf != null) && (einWurf. //Hintergrund löschen g.0f)) { //Nur dann zeichnen. skalierung2).cDim. kurzen Wurf ist die Höhe der //Zeichenfläche der limitierende Faktor //Bei einem niedrigen. float dieHoehe2 = einWurf.gibSteigHoehe(BisWinkel). wenn ein gültiger Wurf //vorhanden ist //Graphics der Zeichenfläche besorgen Graphics g = c. maxY/dieHoehe1). AGeschw = i. //Als endgültiger Skalierungsfaktor wird der kleinere //gewählt. i = Integer.gibSteigHoehe(VonWinkel). i = Integer.gibWurfWeite(VonWinkel). int maxY = cDim. beinhaltet Zeichnen der //Wurfparabeln repaint().clearRect(0.getText(). float dieWeite2 = einWurf.13. //Neuzeichnen des Fensters.getText().width.valueOf(Merke). 279 LE 8 . Merke = bisWinkelTextfeld.intValue().2. float skalierung2 = (float)Math. //Weite und Höhe von Wurf1 (bei VonWinkel) //und Wurf2 (bei BisWinkel) besorgen float dieWeite1 = einWurf.intValue().min(maxX/dieWeite2.min(maxX/dieWeite1.3 Die Wiederholung Merke = vonWinkelTextfeld. i = Integer. maxY/dieHoehe2). //Skalierungsfaktoren der beiden Würfe holen //Bei einem hohen. //Erstellen der Tabelle erstelleListe(). float dieHoehe1 = einWurf.valueOf(Merke).gibWurfWeite(BisWinkel). daß beide Würfe //vollständig innerhalb der Zeichenfläche gezeichnet //werden können float skalierung = (float)Math. Dadurch ist sichergestellt. VonWinkel = i.

Graphics g.yi).append(Merke + "\t"). Merke = Float. skalierung. daher Linie //auf sich selbst g. dummy = (float)((long)(10000.LE 8 2. if((Winkel == VonWinkel) || (Winkel == BisWinkel)) tabelleTextbereich.setColor(Linienfarbe).0f * einWurf. g. //Zahlen in Texte wandeln einWurf.yi.red. float Skalierung.toString(Winkel). Winkel <= BisWinkel. int maxY) { float y. tabelleTextbereich. g. int yi = (int)(Skalierung * y). //Punkt zeichnen //drawPixel oder setPixel gibt es nicht.toString(dummy / 10000. //Zeichenbreite von 0 bis max //in 1-Pixel-Schritten durchlaufen for(float x = 0. //Über Skalierung in Pixel-Koordinaten umrechnen int xi = (int)(Skalierung * x). maxX. x <= Weite. } } private void erstelleListe() { String Merke. maxY).setAnfangsGeschw(AGeschw). BisWinkel. maxY). float Weite. int maxX.0f. zeichneWurf(Color. VonWinkel. 280 .append("\t"). tabelleTextbereich.blue.13 Kontrollstrukturen //Die Skalierung ist in x und y Richtung identisch //Dadurch bleibt die Winkeltreue erhalten zeichneWurf(Color. x).append("*"). Winkel++) { Merke = Integer.toString(AGeschw). if(AGeschw != 0) { float dummy.xi. //ein Wurf beginnt aber unten links. x += Weite/maxX) { //Höhe bei aktueller x-Position berechnen y = einWurf. dieWeite2. maxX.gibHoehe(Winkel.yi. Merke = Integer. tabelleTextbereich. //also die Koordinaten vertikal spiegeln yi = maxY . //Koordinatensystem beginnt oben links. dieWeite1. skalierung.append(Merke).drawLine(xi. int Winkel. } } private void zeichneWurf(Color Linienfarbe. g. for(int Winkel = VonWinkel.gibWurfWeite(Winkel))).0f).

gibWurfZeit(Winkel))).0f * einWurf. tabelleTextbereich.0f).toString(dummy / 10000. dummy = (float)((long)(10000. tabelleTextbereich.append(Merke + "\t").2.0f).3 Die Wiederholung tabelleTextbereich.13-12 zeigt die textuelle und grafische Ausgabe des Programms »Schiefer Wurf«.0f).gibSteigHoehe(Winkel))). Merke = Float.0f * einWurf. dummy = (float)((long)(10000.toString(dummy / 10000.toString(dummy / 10000.0f * einWurf.gibSteigZeit(Winkel))).append(Merke + "\t" + "\n").append(Merke + "\t"). Merke = Float. tabelleTextbereich. }//Ende for }//Ende if }//Ende erstelleListe }//Ende WurfGUI LE 8 Abb.13.append(Merke + "\t"). dummy = (float)((long)(10000. Merke = Float.13-12: Benutzungsoberfläche des Programms »Schiefer Wurf« 281 . 2. Abb. 2.

gefolgt von der Liste der aktuellen Parameter.13 Kontrollstrukturen n + 1/ -Schleife 2 Es gibt Fälle. Ein Aufruf erfolgt durch die Angabe des Operationsnamens (Prozedur-. 2.h. Dies ist insbesondere dann sinnvoll. Konzeptionell hat man die Kontrollstruktur Wiederholung so verallgemeinert.LE 8 2. Nach Ausführung der aufgerufenen Operation (Prozedur. d.5 Geschachtelte Kontrollstrukturen Schachtelung Kapitel 2. daß aus dem Wiederholungsteil hinter das Ende der Wiederholung verzweigt bzw. gesprungen wird. die bewirken. daß Struktogramms innerhalb des Wiederholungsteils ein oder mehrere UnterbreDarstellung chungen (breaks) oder Aussprünge programmiert werden kön(nicht einheitlich verwendet) nen. zählt der Aufruf zu den Kontrollstrukturen. Eine Operation kann sich auch selbst aufrufen (rekursiver Aufruf).11 Komplexe Abläufe können durch Schachtelung von Kontrollstrukturen beschrieben werden.4 Der Aufruf Soll in einer Operation eine andere Operation angewandt werden. es wird zur jeweiligen break oder Wiederholungsbedingung verzweigt.B. Funktion) wird die rufende Operation hinter der Aufrufstelle fortgesetzt.11 Abschnitt 2. 2. Im Prinzip kann man die Kontrollstrukturen in beliebiger Kombination beliebig tief ineinander schachteln. 2. dann darstellung spricht man von einer n + 1/2-Schleife. Innerhalb von Wiederholungsanweisungen können wieder Wiederholungsanweisungen oder/und Auswahlanweisungen stehen.13.11. innerhalb der Wiederholungsanweisungen die laufende Wiederholung abzubrechen. durch das Senden einer Botschaft (Abb. dann geschieht dies durch einen Aufruf bzw. die eine weitere Verarbeitung der Wiederholungsanweisungen überflüssig machen.Schleife wird im übernächsten Abschnitt behandelt. Ein Beispiel zur n + 1/2. Funktionsnamens). in denen es notwendig ist. 282 . und continue s die Operation. sondern auch in einer Prozedur durch return. Struktogramm.Wird eine Wiederholung auf eine dieser beiden Arten verlassen. Da durch einen Aufruf die sequentielle Ausführung der Anweisungen unterbrochen wird. durch ein return beendet wird (In Java ist dies nicht nur in einer Funktion.13. möglich). bei einer Berechnung innerhalb einer Wiederholung Fehler auftreten. wenn z. s die aktuelle Wiederholung abgebrochen wird und sofort eine neue Wiederholung beginnt (continue).13-13). in der sich die Wiederholung befindet.

public class PrimzahlGUI extends Applet { //Attribute private int N = 0. import java.applet. d.2. LE 8 Erläuterung Nach Ausführung der aufgerufenen Operation wird die rufende Operation hinter der Aufrufstelle fortgesetzt. muß Z durch 2 und alle * ungeraden Zahlen von 3 bis Wurzel(Z) dividiert werden.. * Ist der Rest einer solchen Division gleich 0.event.*.awt. PAP Anweisung1 Operations-Name (aktuelle Parameter) Anweisung2 Abb. Um festzustellen. //Eingabe.h. bis zu N werden alle Primzahlen ermittelt private String Ergebnis.und Fachkonzeptklasse: PrimzahlGUI * Aufgabe: Berechnung der ersten N Primzahlen * Eine ganze Zahl Z>1 heißt Primzahl. Anweisung2. 2. * Für die Ermittlung von Primzahlen gibt es keine geschlossene * Lösung. //Ausgabe (als Zeichenkette) .13-13: Notationen des Aufrufs /* Programmname: Primzahl * GUI. Operationsname (aktuelleParameter). */ import java.*. dann liegt * keine Primzahl vor.. wenn sie ohne Rest nur * durch 1 und durch sich selbst teilbar ist. gefolgt von der Liste der aktuellen Parameter. import java. Primzahlen können nicht durch eine Formel * berechnet werden.13. Ein Aufruf erfolgt durch Angabe des Operationsnamens.5 Geschachtelte Kontrollstrukturen Aufruf Struktogramm allgemein Anweisung1 Operations-Name (aktuelle Parameter) Anweisung2 Java Anweisung1.*. * ob eine Zahl eine Primzahl ist. Beispiel Primzahl 283 .awt.

//Rest ist = 0 if((Teiler * Teiler) >= Zahl) { Ergebnis = Ergebnis.concat("\n"). }//Ende while }//Ende if ergebnisTextbereich.LE 8 2. N = i. //Berechnung if(N <= 1) Ergebnis = "N muß > 1 sein!". }//Ende actionPerformed }//Ende innere Klasse }//Ende PrimzahlGUI 284 . //Integer ist eine Klasse //Inhalt des Eingabefelds in Zahl umwandeln Puffer = grenzeTextfeld. Integer i. //Hilfsgröße Ergebnis = "2\n3".intValue(). //3 ist Primzahl else { int Zahl = 5. //Jede Zahl durch alle ungeraden //Zahlen teilen if((Zahl % Teiler) == 0) break. i = Integer. } } while ((Teiler * Teiler) < Zahl).toString(Zahl)).13 Kontrollstrukturen //Innere Klasse class AktionsAbhoerer implements ActionListener { public void actionPerformed(ActionEvent event) { //Lokale Attribute String Puffer. else if(N < 3) Ergebnis = "2\n". while(Zahl <= N) { Teiler = 1. //Anfügen an bisherigen String Ergebnis = Ergebnis.valueOf(Puffer). do { Teiler = Teiler + 2. Zahl = Zahl + 2.concat (Integer.getText(). //Ausgabe int Teiler.append(Ergebnis). //2 ist Primzahl else if(N < 4) Ergebnis = "2\n3".

13. Teiler = Teiler + 2. N < 3 ja Ergebnis = "2 3". (Zahl % Teiler) = 0 ? (Teiler * Teiler) >= Zahl nein nein nein nein //Eingabe //Ausgabe //Hilfsgröße Abb. Ausgabe(Ergebnis). wenn man das Programm als Struktogramm darstellt (Abb. while ((Teiler*Teiler)< Zahl) Zahl = Zahl+2.13-14). Ausgabe("Die ersten N Primzahlen lauten").13-14: StruktogrammDarstellung des Programms »Primzahl« ja Ergebnis.Anfügen (Zahl). 2. N < 4 Ergebnis = "2 3".2.5 Geschachtelte Kontrollstrukturen LE 8 Die Schachtelung wird noch deutlicher. int Teiler. 285 . Eingabe(N). Programm Primzahl int N = 0. N <= 1 ja Ergebnis = "2". 2. while (Zahl <= N) Teiler = 1. ja Ergebnis = "N muß > 1 sein". int Zahl = 5.

unwesentlich geänderte Struktogramm sieht in Java folgendermaßen aus: if(n > 0) { if(a > b) Z = a. //end if Programmierhinweis ja j Z = a a > b n > 0 n Z = b nein Durch die ungünstige Syntaxstruktur in Java kann es leicht zu Fehlinterpretationen der Semantik beim Lesen eines Programms kommen. Ada mit elsif. else if(B3) A3. Da Java ein if-Konstrukt nicht mit end if abschließt. //end if //end if ja j Z = a a > b Z = b n > 0 n nein Das nebenstehende. else A4. } //end if else Z = b. Beispiele Das nebenstehende Struktogramm sieht in Java folgendermaßen aus: if(n > 0) if(a > b) Z = a. ist ein besonderes Sprachkonstrukt nicht erforderlich. z.LE 8 2. Einige Programmiersprachen besitzen zur Formulierung dieser Auswahlketten besondere Sprachkonstrukte. sogenannte Auswahlketten. //end if Bedingung1 w A2 B2 w A3 B3 A4 Auswahlketten Beispiel wahr Anweisung1 falsch f f 286 .13 Kontrollstrukturen Insbesondere bei geschachtelten Auswahlanweisungen ist auf den korrekten Anschluß jeder Anweisung zu achten. Daher sind zusätzliche Kommentare unbedingt nötig! Auswahlketten Manche Problemlösungen enthalten regelmäßig ineinandergeschachtelte Auswahlanweisungen. else Z = b. Das nebenstehende Struktogramm sieht in Java folgendermaßen aus: if(Bedingung1) Anweisung1 else if(B2) A2.B.

Schleife1: //Name der Schleife while(Ausdruck) { Anweisungen. In Abhängigkeit von der Aufgabenstellung muß daher genau analysiert werden. jede Anweisung und jeden Anweisungs. while(Ausdruck) { Anweisungen. } Anweisungen. 2.6 Anordnung von Auswahlanweisungen Jede Bedingung. welche Anordnung der Auswahlanweisungen die geringste Laufzeit ermöglicht. Eine Schwachstromversicherung deckt alle Schäden an empfindli.000 16. z. Der Jahresbeitrag für die Versicherungssumme errechnet sich im Falle einer Einzelversicherung für Büro.Beispiel chen elektronischen Bürogeräten ab. 287 . Ein Beenden der gerade aktiven Anweisung reicht dazu nicht aus. mit continue auf die Marke Schleife1 verzweigt. if(Fehler2) continue Schleife1. die bei der Ausführung eines Programms ausgewertet werden muß. Eine Marke ist ein Bezeichner gefolgt von einem Doppelpunkt.B.Versicherungssumme in DM Prämie in ‰ maschinen aufgrund bis 5.4 gen (Auszug).001 bis 10. if(Fehler1) break Schleife1.000 8.13. die beispielsweise durch einen plötzlichen Stromausfall oder unsachgemäße Handhabung entstehen könnten. } //Ende Schleife1 Beispiel Mit break wird hinter das Ende der Schleife1.8 der nebenstehenden von 5.000 12. die irgendwo innerhalb der mit Marken versehenen Anweisung auftreten.2. Hinter break oder continue muß dann der entsprechende Markenbezeichner angegeben werden. kostet Zeit.13.6 Anordnung von Auswahlanweisungen LE 8 Beenden geschachtelter Anweisungen In der Praxis müssen aufgrund erkannter Fehler ineinandergeschachtelte Wiederholungsanweisungen und Mehrfach-Auswahlanweisungen vollständig verlassen werden. In Java ist es möglich. Anweisungen.6 Vertragsbedingunüber 10.Java block mit einer Marke (label) zu versehen. Anweisungen. Schleife1: Durch Marken versehene Anweisungen werden von den Anweisungen break oder continue »angesprungen«.

break. dann sind die beiden folgenden Abfragen eigentlich überflüssig.0. break.0. } } 288 . 2. case 1: praemie = VSumme * 12.8 / 1000.0)) / 100. Aus drei Fällen muß genau ein Fall ausgewählt werden.4 / 1000.0 ja VSumme > 10000 nein Prämie = VSumme * 8. /*Programmname: Versicherung1 * Fachkonzeptklasse: Versicherung1 * Aufgabe: Laufzeitoptimierte Berechnung von * Versicherungsprämien * Einsatz des switch-Konstrukts */ class Versicherung1 { public double berechnePraemie(double VSumme) { //Berechnung double praemie = 0.13 Kontrollstrukturen Eine unreflektierte Umsetzung dieser Aufgabenstellung führt zu der Lösung 1 (Abb. Ist die konkrete Versicherungssumme <= 5000 DM.0 ja VSumme > 5000 and VSumme <= 10000 nein Prämie = VSumme * 12.8 / 1000.6 / 1000.6 / 1000.0/100.case . break. Java In Java läßt sich diese Aufgabe durch eine switch-Anweisung lösen.4 / 1000. Dennoch werden sie ausgeführt.1. Abb.Konstrukt int fall = (int)((VSumme . //Lösung mit switch .0) / 5000.0.13-15: Direkte Umsetzung der Aufgabenstellung VSumme eingeben ja VSumme <= 5000 nein Prämie = VSumme * 16.0 Prämie ausgeben Bei dieser Lösung werden unabhängig von der konkreten Versicherungssumme nacheinander immer drei Bedingungen überprüft.floor((double)(praemie * 100. Dies führt zu einer unnötigen Verlängerung der Laufzeit des Programms.0).0. 2. der nicht //größer als das Argument und gleich einer ganzen //Zahl ist return (double)Math. } //floor ist eine Klassenoperation der Klasse Math //floor ermittelt den größten float-Wert.LE 8 2. switch (fall) { case 0: praemie = VSumme * 16. Von der Aufgabenstellung her handelt es sich um eine Mehrfachauswahl.0.13-15). default: praemie = VSumme * 8.

Dabei ist es allerdings wichtig zu wissen. Gegenüber der Lösung 1 ist die zusammengesetzte Bedingung entfallen.0) praemie = VSumme * 16. } } In 70 Prozent aller Fälle wird nur eine Bedingung ausgewertet.0.2. dann ist die folgende Lösung 2 die beste (Abb. 2.0. welche Abfragen mit welcher Häufigkeit auftreten.6 / 1000. In Abhängigkeit von den Annahmen und Voraussetzungen eines Problems spielt die richtige Wahl der Abfragereihenfolge eine große Rolle.8 / 1000.6 1000. daß es in vielen Fällen sinnvoll ist. 289 .0 Prämie = Prämie ausgeben ja VSumme <= 5000 VSumme * 16. um ein optimales Programm zu entwickeln. Auswahlanweisungen ineinander zu schachteln.0.0. Das Beispiel hat gezeigt.4 1000. mitberücksichtigt werden.0.13.4 / 1000.6 Anordnung von Auswahlanweisungen LE 8 Bei dieser Lösung muß allerdings die Zeit.8 1000.0)) / 100.0) praemie = VSumme * 8.13-16: Verbesserte Lösung der Aufgabenstellung /*Programmname: Versicherung2 * Fachkonzept-Klasse: Versicherung2 * Aufgabe: Laufzeitoptimierte Berechnung von * Versicherungsprämien * Einsatz von geschachtelteten if-Anweisungen */ class Versicherung2 { public double berechnePraemie(double VSumme) { double praemie = 0. die zum Berechnen des switch-Ausdrucks benötigt wird. Eine Verbesserung der 1. else if(VSumme <= 5000.0 Prämie = nein nein VSumme * 12. else praemie = VSumme * 12. Ist beispielsweise in 70 Prozent aller Fälle die Versicherungssumme größer als 10 000. sonst zwei.. return (double)Math.DM.floor((double)(praemie * 100.13-16): VSumme eingeben ja Prämie = VSumme > 10000 VSumme * 8. Lösung ist durch ein Schachteln von ifAnweisungen möglich. 2.0 Abb. // Lösung mit if if(VSumme > 10000.

LE 8 2.13. Zwischen dem Eingang und dem Ausgang gilt das Lokalitätsprinzip. Marshall 86. daß klar zwischen einer Auswahl und einer Wiederholung unterschieden wird.13 Kontrollstrukturen 2.h.8 Strukturierte Programmierung /Böhm. Daher bezeichnet man diese Kontrollstrukturen auch als »lineare Kontrollstrukturen«. s Bei der while-Schleife muß die Bedingung am Anfang der Wiederholung bereits einen eindeutigen Wert besitzen. Die hier vorgestellten Kontrollstrukturen haben ein gemeinsames Kennzeichen. Eine Auswahl ist dadurch charakterisiert. d. der Kontrollfluß verläßt den durch Eingang und Ausgang definierten Kontrollbereich nicht. 285/). aus denen genau eine zur Laufzeit auszuwählen ist. 290 Regeln Regeln Prinzip der Lokalität . d. Wesentlich ist. Alternativen ein Fall ausgewählt werden muß (zweifache Auswahl) oder – aus mehreren Fällen ein Fall ausgewählt werden muß (Mehrfachauswahl). daß sie die gegebene Problemstellung möglichst gut widerspiegeln.h. Jacopini 66/ haben nachgewiesen. Die Auswahlkriterien für die Wiederholungsanweisung zeigt Abb. S. Sie besitzen – bis auf die break. dann verläuft der Kontrollfluß linear durch einen Algorithmus. s Die Mehrfachauswahl ist immer dann zu verwenden. s Bei geschachtelten Auswahlanweisungen sind wahrscheinliche Abfragehäufigkeiten zu berücksichtigen. Folgende Regeln sollten bei Wiederholungsanweisungen beachtet werden: s Endlos-Schleifen und n + 1/2-Schleifen sind nur dann zu verwenden. um übersehene Alternativen abfangen zu können. wenn dies unbedingt erforderlich ist. s Die Mehrfachauswahl ist immer mit Fehlerausgang (default) zu verwenden.13-17 (in Anlehnung an /Messer.und continue-Anweisungen – jeweils genau einen Eingang und einen Ausgang. streng sequentiell vom Anfang bis zum Ende. daß alle Kontrollflüsse durch eine Auswahlkonstruktion und eine Wiederholungskonstruktion beschrieben werden können.7 Auswahl von Kontrollstrukturen Kontrollstrukturen sind so auszuwählen. daß entweder – ein Fall in Abhängigkeit von einer Bedingung eintritt (einfache Auswahl) oder – aus zwei Fällen bzw.13. s Wird in einer zweifachen Auswahl ein Zweig für die Fehlerbehandlung verwendet. dann sollte dies der else-Zweig sein. wenn es mehr als zwei disjunkte Alternativen gibt. Betrachtet man jede Kontrollstruktur makroskopisch. 2. 2.

for ( .. ) {.. do {. } ja do { ......} while (true).. Anweisungen. .. } Alle Anweisungen bis zu der über die Wiederholung entscheidenden Anweisung vor die Schleife stellen und am Ende des Schleifenkörpers wiederholen 2. } while (true).. Muß der gesamte Wiederholungsteil bei jeder Wiederholung ausgeführt werden? nein nein nein nein nein ja nein Anweisungen. .. } Gibt es am Anfang der zu wiederholenden Anweisung eine Anweisung. if ( ) continue. if ( ) continue. die über die Wiederholung entscheidet? Muß kein Wiederholungsteil mindestens einmal ausgeführt werden? ja while ( ) { .. if ( ) break.. while ( ) { . } while ( ).. ..13-17: Auswahlkriterien für die Wiederholungsanweisung LE 8 . oder kann sie aus Daten berechnet werden? ja for (A..8 Strukturierte Programmierung 291 Abb. } Ist die Anzahl der Wiederholungen bekannt.... technische Prozesse usw... ..E.13. . . if ( ) break. Gibt es mehrere unterschiedliche Abbruchbedingungen? ja while ( ) {.S) { .Ist eine unendliche Wiederholung erforderlich? ja für Dialogprogrammierung..} oder do {.. 2...

wenn er nach endlich vielen Schritten abgearbeitet ist. Sind die Abbruchbedingungen in Wiederholungen falsch gesetzt. zusammen mit O. die jedesmal. Edsger Wybe Dijkstra * 1930 in Rotterdam. In vielen Sprachen (Assembler. 72/ prägte den Begriff »Structured Programming« und subsumierte unter diesem Begriff verschiedene methodische Ansätze. ob er dazu dient. da bei einem Sprung nicht klar ist. R. University of Texas at Austin Die Einhaltung der Lokalität und Linearität erleichtert auch den Korrektheitsbeweis eines Algorithmus.2 Termination 2. einen niedrigeren (höheren) Wert hat als bei der vorherigen Wiederholung. die zur Verbesserung der Programmzuverlässigkeit beitragen sollten. 292 . daß nach einer endlichen Anzahl von Durchläufen die Endebedingung erfüllt ist. Wegbereiter der strukturierten Programmierung (Buch: Notes on Structured Programming 1972.-J.13 Kontrollstrukturen Prof. dann spricht man auch von Strukturiertem Programmieren im engeren Sinne. s Lokalität und Linearität sind nicht garantiert. Hoare). wenn die Wiederholung ausgeführt wird. A. Folgende Minimalanforderung muß erfüllt sein: s Durch mindestens eine Anweisung im Wiederholungsteil muß eine Variable derart verändert werden. Dahl und C.LE 8 Kapitel 3. Anweisungen zu wiederholen oder ob es sich um Sprünge zur Realisierung von Auswahlbedingungen handelt. Zur Korrektheitsprüfung eines Algorithmus gehört der Nachweis der Termination. da mit Sprüngen an beliebige Stellen des Algorithmus und damit auch in andere Kontrollstrukturen hineingesprungen werden kann. als ein bestimmtes Minimum (Maximum). Eine einfache Auswahl hat aber semantisch nichts mit einer Wiederholung zu tun. Erfinder von Algorithmen und des SemaphorKonzeptes. dann kann ein Algorithmus in eine »unendliche« Schleife geraten. Die Weiterentwicklung dieser Ansätze in verschiedenen Richtungen führte zu oft sehr weit auseinanderliegenden Definitionen des Begriffs »Strukturierte Programmierung«. Dr. In vielen Fällen kann man folgende Methodik anwenden: s Man suche irgendeine ganzzahlige Größe G. Promotion an der Universität Amsterdam. /Dijkstra 69. die eine Rückwirkung auf die Bedingung haben. s Die Terminierung kann nicht oder nur mit großem Aufwand sichergestellt werden. Damit eine bedingte Wiederholung überhaupt enden kann. »goto-Anweisung« verstößt gegen die oben aufgestellten Anforderungen: s Eine Sprunganweisung verwischt völlig den semantischen Unterschied zwischen einer Auswahl und einer Wiederholung. muß es innerhalb des Wiederholungsteils eine oder mehrere Anweisungen geben. seit 1984 Professor and Schlumberger Centennial Chair in Computer Science. Das in älteren Programmiersprachen noch enthaltene Steuerkonstrukt »Sprung« bzw. Werden in einem Algorithmus oder in einem Programm nur lineare Kontrollstrukturen verwendet. Niederlande. BASIC) und grafischen Darstellungen (PAP) wird eine Kombination von einfacher Auswahl und Sprung zur Darstellung einer bedingten Wiederholung benutzt. aber nie kleiner (größer) werden kann. Bei ausschließlicher Anwendung der dargestellten Kontrollstrukturen müssen nur die bedingten Wiederholungen überprüft werden. Ein Algorithmus terminiert.

Auswahl und Wiederholung wird nicht unterstützt.. die diese Arbeit automatisch erledigen. if . Die Wortsymbole sind selbsterklärend. Vorgenommene Erweiterungen entsprechen nicht der ursprünglichen Intention. Die Syntax moderner Programmiersprachen ist so gestaltet. den Algorithmus mit einer Wiederholung neu zu strukturieren. Für die Darstellungen von Kontrollstrukturen sind die grafischen und textuellen Beschreibungsmittel unterschiedlich geeignet: Struktogramme ermöglichen eine optimale grafische Darstellung von linearen Kontrollstrukturen.13. um gut lesbare Kontrollstrukturen zu erhalten. die Alternativen werden vertikal angeordnet. In Java gibt es keine Sprunganweisungen (goto). Besonders vorteilhaft bei Struktogrammen ist.und continue-Anweisungen dar. s Die Fehleranfälligkeit steigt bei der Verwendung der Sprunganweisung. C++ PAP 293 . wenn man einen Algorithmus formuliert hat und am Ende merkt. Als schwerwiegender Nachteil des Programmablaufplanes (PAP) erweist sich. Die Programmiersprachen Java. Der in Struktogrammen verfügbare Platz ermöglicht außerdem die Wahl aussagekräftiger Namen. Insgesamt bieten PAP dem Benutzer zu große Freiheiten.. daß die Auswahl in ablaufadäquater Form dargestellt wird.h. d. Es gibt jedoch Struktogramm-Generatoren. während in textuellen Darstellungsformen eine horizontale Anordnung erfolgt. daß das Problem einen Rücksprung an den Anfang erfordert. daß eingeschachtelte Kontrollstrukturen textuell nach rechts eingerückt werden (manuell oder automatisch durch Formatierer). Wiederholungen). dann wird man nicht gezwungen. Eine eingeschränkte und damit disziplinierte Form des »Sprungs« stellen die break.2. C++ und C sind in dieser Hinsicht nicht vorbildlich. so daß PAP zur Beschreibung von linearen Kontrollstrukturen keine adäquaten Mittel zur Verfügung stellen. Schachtelungsstrukturen s Wertung Struktogramme Programmiersprachen Java. Die Schachtelungsstruktur von Kontrollstrukturen wird dadurch optisch hervorgehoben. da es nicht möglich ist. Das manuelle Zeichnen und Ändern ist aufwendig. und jede Konstruktion wird durch ein spezifisches Wortsymbol explizit abgeschlossen (loop ..h. Sprünge darzustellen. daß die Syntax die Semantik der linearen Kontrollstrukturen optimal unterstützt.8 Strukturierte Programmierung LE 8 Das strukturierte Denken in Sequenz. s Syntax und Semantik einer Sprunganweisung sind nicht selbsterklärend. Die Attribute können am Anfang in einem eigenen Kasten beschrieben werden. end if). daß es für grundlegende Kontrollstrukturen keine eigenen Symbole gibt (Mehrfachauswahl. da durch einen Sprung jederzeit die »Notbremse gezogen werden kann«. Daher sind ein konsequentes Einrücken und zusätzliche Kommentare erforderlich. end loop. d.

Der Programmablauf verzweigt von der Stelle. 2. s Leichte Überprüfbarkeit der Terminierung. Von der Methodik her ist folgende Reihenfolge einzuhalten: 1 Immer zuerst die Kontrollstrukturen entwerfen. Die ausschließliche Verwendung von linearen Kontrollstrukturen bringt folgende Vorteile: s Vereinheitlichung der Programmierstile. In Java gibt es eine Reihe vordefinierter Ausnahmen. Java-Programme können durch throw-Anweisungen auch Ausnahmen explizit auslösen. Eine Übersicht über diese Ausnahmen gibt Abb. die die Ausnahme abfängt.9 Behandlung von Ausnahmen Führt die Ausführung eines Programms zu einer Situation. dann liegt eine Ausnahme-Situation (exception) vor. Dadurch können Fehlerbedingungen an aufrufende Programme übergeben werden. In den meisten Programmiersprachen führt eine Ausnahmesituation zu einem Abbruch des laufenden Programms (das Programm »stürzt« ab). 2. in PAP kaum erkennbar. an der das Ausnahmeereignis stattfand. s Statische Überprüfung der Korrektheit möglich. um Informationen von der Stelle. Eine Ausnahme wird also an der Stelle des Auftretens ausgelöst (thrown) und an der Stelle abgefangen (caught). z. d. Jede Ausnahme wird durch ein Objekt der Standard-Klasse Throwable dargestellt.h.B. s Übersichtliche. an die Ausnahmebehandlungsroutine zu übergeben.13 Kontrollstrukturen Vorteile Methodik sind z. s Für gleichartige Probleme entstehen gleichartige KontrollflußStrukturen. Erwartet man. dann schließt man dieses Programmstück in einen try-Block ein. in der eine reguläre Weiterarbeit nicht sinnvoll ist.13-18. PAP sollten daher bis auf Sonderfälle nicht verwendet werden. 294 Java vordefinierte Ausnahmen Abfangen von Ausnahmen . an der das Ausnahmeereignis aufgetreten ist. die in entsprechenden Situationen vom Java-Interpreter ausgelöst werden. Standardisierung der Kontrollflüsse. Die Attribut-Deklaration kann in die Symbolik nicht integriert werden. an der der Programmablauf fortgeführt werden soll. Ein solches Objekt kann dazu benutzt werden. bei einer Division durch Null.13. s Die Auswirkungen jeder Kontrollstruktur sind übersehbar.LE 8 2. daß in einem Programmstück eine vordefinierte oder selbstdefinierte Ausnahme eintreten kann. gut lesbare und verständliche Anweisungsteile von Algorithmen. zu einer vom Programmierer anzugebenden Stelle. In Java wird in einer solchen Situation eine Ausnahme (exception) ausgelöst. 2 Erst dann die elementaren Anweisungen überlegen.B.

lang ClassNotFoundException: Eine Klasse oder Schnittstelle des angegebenen Namens konnte nicht gefunden werden. IllegalAccessException: Es wurde versucht. InterruptedException: Während der aktuelle Thread wartete.13-18: Vordefinierte Ausnahmen in Java Hinweis: In der nebenstehenden Abbildung sind wichtige vordefinierte Ausnahmen in Java aufgeführt. IllegalThreadStateException: Ein Thread war für die geforderte Operation nicht in passendem Zustand. NumberFormatException: Es wurde versucht.io. InstantiationException: Es wurde versucht. auf andere Threads.FileNotFoundException: Eine Datei mit einem durch Dateiname oder Pfad angegebenen Namen wurde nicht im Dateisystem gefunden.2. obwohl der String nicht das geeignete Format hatte. Joy. in das Java-modifizierte UTF-8-Format konnte nicht beendet werden. Die Abbildung dient zum Nachschlagen. ClassCastException: Es wurde versucht.net.13.UnknownHostException: Der Name eines Netzwerkcomputers konnte nicht zu einer Netzwerkadresse aufgelöst werden. NegativeArraySizeException: Es wurde versucht. oder sie wurde für ein nicht passendes Objekt aufgerufen.net. die auf ein nicht gesperrtes Objekt warten.EOFException: Das Dateiende wurde angetroffen. eine Referenz auf ein Objekt explizit in einen nicht passenden Typ umzuwandeln.net. einen String in einen Wert von numerischem Typ umzuwandeln. java. die als URL oder als Teil einer URL angegeben war.io.InterruptedIOException: Während der aktuelle Thread auf die Beendigung einer E/A-Operation wartete. socket) betreffende Operation konnte nicht normal beendet werden. 202ff/ 295 . CloneNotSupportedException: Die Operation clone der Klasse Object wurde zum Klonen eines Objekts aufgerufen.MalformedURLException: Eine Zeichenkette. ein Feld mit negativer Länge zu erzeugen. da sie nicht öffentlich und in einem anderen Paket ist. IndexOutOfBoudsException: Ein Index von irgendeiner Sorte (z. java. IllegalMonitorStateException: Ein Thread versuchte. java. eine Nullreferenz zu verwenden. Weitere Standardausnahmen Paket java. aber die aktuell ausführende Operation hat keinen Zugang zur Definition der angegebenen Klasse. 2.UTFDataFormatException: Eine geforderte Umwandlung einer Zeichenkette von dem bzw.net. java. java.net java. ArrayStoreException: Es wurde versucht. Paket java. für ein Feld. Paket java. S.IOExeption: Eine geforderte Ein-/Ausgabe-Operation konnte nicht normal beendet werden. hat ihn ein anderer Thread unter Verwendung der Operation interrupt der Klasse Thread unterbrochen. obwohl eine Objektreferenz gefordert war. weil die Zeichenkette zu lang oder die angeblichen UTF-8-Daten nicht das Ergebnis der Kodierung einer Unicode-Zeichenkette nach UTF-8 waren. ein Objekt einer Klasse unter Verwendung der Operation newinstance der Klasse Class zu erzeugen. Quelle: /Gosling. bevor eine Eingabeoperation normal beendet werden konnte. dessen Klasse nicht mit dem Elementtyp des Feldes zuweisungskompatibel ist. eine Zeichenkette oder einen Vektor) oder ein durch zwei Indexwerte oder durch einen Index und eine Länge gegebener Teilbereich waren außerhalb des zulässigen Bereiches. eine in einer Zeichenkette mit ihrem vollqualifizierten Namen angegebene Klasse zu laden. zu warten oder diese zu benachrichtigen.ProtocolException: Ein Aspekt eines Netzwerkprotokolls wurde nicht korrekt durchgeführt.io. ein Feld oder abstrakt ist.io. Steele 97. wie die Division ganzer Zahlen durch Null. ArithmeticException: Es ist eine außergewöhnliche arithmetische Situation entstanden.netSocketException: Eine einen Kommunikationsendpunkt (engl.io java. die bisher nicht behandelt wurden.B. aber das spezifizierte Klassenobjekt kann nicht erzeugt werden. da es eine Schnittstelle. SecurityException: Es wurde eine Sicherheitsverletzung entdeckt. Abb. NullPointerException: Es wurde versucht. java. hat ihn ein anderer Thread unter Verwendung der Operation interrupt der Klasse Thread unterbrochen.9 Behandlung von Ausnahmen LE 8 Standardausnahmen des Java-Laufzeitsystems Klasse RuntimeException RuntimeException: Es ist ein Laufzeitfehler aufgetreten. in ein Feldelement einen Wert zu speichern.UnknownServiceException: Die Netzwerkverbindung kann den geforderten Dienst nicht unterstützen. java. die Klasse dieses Objekts implementiert aber nicht die Schnittstelle Cloneable. java. Daher sind auch Ausnahmen aufgeführt. IllegalArgumentException: Einer Operation wurde ein ungültiger oder nicht passender Parameter übergeben. hatte nicht das richtige Format oder benannte ein unbekanntes Protokoll.io.

. .getText().intValue(). //Beenden der Prozedur } // Zahl in einen Text umwandeln switch(Zahl) . //Integer ist eine Klasse! // Inhalt des Eingabefeldes in eine Zahl umwandeln int Zahl. Es muß daher die Möglichkeit geben. } catch(NumberFormatException x) { ergebnisTextfeld. } catch (ExceptionClass a) { Ausnahmebehandlung } Beispiel In dem Programm ZiffernInWorte (Abschnitt 2...13. Wandelt man den eingegebenen Text mit der Operation Integer. Integer i. try { i = Integer. Diese Ausnahme wird im anschließenden catch-Konstrukt behandelt. Es muß also überprüft werden.ValueOf(Text) in eine Zahl um.setText("Fehlerhafte Eingabe. signalisiert man die Ausnahmesituation über 296 . In Programmiersprachen. was beim Eintreten der entsprechenden Ausnahme geschehen soll: try { Anweisung. In vielen Fällen soll die Ausnahmebehandlung von der Operation durchgeführt werden.ActionEvent event) { String eineZahlAlsText. return.valueOf(Merke).event.. ob keine Buchstaben eingegeben wurden.2) wird kein Ergebnis ausgegeben. die angeben. die über keine explizite Ausnahmebehandlung verfügen. Zahl = i. dann wird von Java die Ausnahme NumberFormatException ausgelöst.. Anweisung. und enthält Text keine Zahl.13 Kontrollstrukturen Im Anschluß an den try-Block formuliert man eine oder mehrere Ausnahmebehandlungsroutinen (exception handlers). bitte eine Ziffer eingeben!"). String Merke = eingabeTextfeld. In diesem Fall wird eine entsprechende Fehlermeldung ausgegeben: public void actionPerformed(java.awt. eine aufgetretene Ausnahme an die rufende Operation weiterzugeben.LE 8 2. wenn anstelle einer Zahl ein oder mehrere Buchstaben eingegeben werden. die die Operation mit der aufgetretenen Ausnahme aufgerufen hat.

doubleValue().getMessage()).setText(Double.setText("Fehler: Summe muß größer Null sein").Beispiel 1a schnitt 2.6) ohne Ausnahmekonzept: public double berechnePraemie(double VSumme) { double praemie = 0.9 Behandlung von Ausnahmen LE 8 einen Ergebnisparameter. //Aufruf mit Überprüfung auf Fehler double Praemie = eineVersicherung. public double berechnePraemie(double VSumme) throws Exception { double praemie = 0.13. //Aufruf public void ermittlePraemie() { String MerkeText = textField1.toString(Praemie)). textField2. Double d = Double.setText("Ausnahme aufgefangen: " + e. //Lösung mit if if(VSumme > 10000.13.berechnePraemie(VSumme).0. if(Praemie > 0) textField2.getText().. double VSumme = d. //Prüfung des Eingabeparameters if(VSumme <= 0) return -1d. //Prüfung des Eingabeparameters if(VSumme <= 0) throw new Exception("Summe muß größer Null sein").. //Aufruf mit Überprüfung auf Ausnahmeauslösung try { double Praemie = eineVersicherung. } 297 Beispiel 1b .toString(Praemie)). Dadurch belastet man diese Parameter mit Ausnahmen und verschlechtert die Lesbarkeit der Programme.setText(Double.0. } catch (Exception e) { textField2.berechnePraemie(VSumme).0) .2..valueOf(MerkeText).0) . //Lösung mit if if(VSumme > 10000. wird die Operations-Deklaration um eine throw-Klausel ergänzt und im Operationsrumpf wird eine Ausnahme ausgelöst. } Damit in Java eine Ausnahme an den Aufrufer gemeldet werden kann. else textField2. Berechnung der Prämie in der Klasse Versicherung2 (siehe Ab..

In der Operation wird bei fehlerhaftem Eingabeparameter (VSumme <= 0) ein Objekt der Ausnahmeklasse Exception erzeugt (new Exception ("Fehlerbezeichnung")). kann eine throw-Anweisung stehen: ThrowStatement: throw ThrowableInstance . 2.6-2): Throws: throws TypeNameList TypeNameList: TypeName TypeNameList .13 Kontrollstrukturen Java-Syntax Die Benutzungsoberfläche zeigt Abb. TypeName Überall.13-19: Beispiel für das Abfangen einer fehlerhaften Eingabe 2. Der String enthält eine Nachricht. Im Beispiel 1b löst die Operation berechnePraemie nur eine Ausnahme vom Typ Exception aus. Die throw-Anweisung beendet die Operation und ermöglicht es dem Aufrufer. 2. Hinter der Parameterliste eines Konstruktors oder einer Operation kann eine throw-Klausel stehen (siehe auch Abb. Das Abfangen geschieht in der aufrufenden Operation in einer try-catch-Anweisung. ein solches Objekt zu erhalten: – Verwendung eines Parameters in der catch-Klausel.LE 8 Abb. die ausgegeben werden kann. – Erzeugung eines Objekts mit dem new-Operator (siehe Beispiel 2). Der Exception-Konstruktor nimmt einen String als Parameter entgegen. dann wird hinter dieser Anweisung der Programmablauf abgebrochen. wo eine Anweisung (statement) stehen kann.13-19. 2. wenn die Ausnahme abgefangen wird. die von einer Operation ausgelöst werden können. Es gibt zwei Möglichkeiten. wobei der Aufruf im try-Teil stehen muß. Die throws-Klausel hinter der Parameterliste listet die AusnahmeTypen auf. und es 298 . die Ausnahme abzufangen. Befindet sich in einer Operation eine throw-Anweisung. ThrowableInstance muß ein Objekt der Klasse Throwable sein.

Die aktuelle Klasse des Ausnahmeobjekts bekommt man durch e3.13-20: Syntax und Semantik von try-catch in Java finally Block try Block CatchClause CatchClause catch ( FormalParameter ) Block Eine CatchClause muß genau einen Parameter besitzen. wird ausgeführt. Exception. Mit Hilfe des finally-Konstrukts können auch dann noch Anweisungen ausgeführt werden. Als Typ muß eine Ausnahme-Klasse angegeben sein.B.13. Die CatchClause. Wird im try-Block eine Ausnahme ausgelöst. egal was im try-Block passiert. Beispiel try { Anweisungen. finally-Konstrukt Wird in Java eine Ausnahme ausgelöst. dann muß die Operation eine throw-Klausel hinter der Parameterliste besitzen. daß er für die Ausnahmebehandlung sorgen muß.getMessage(). der Ausnahmeparameter genannt wird. dann werden die catch-Konstrukte durchlaufen. keine Ausnahme ist eingetreten. d. Der finally-Block wird ausgeführt.getName().h. um z. dann wird die weitere Ausführung der Operation abgebrochen. Besitzt die rufende Operation selbst keine Ausnahmebehandlung. dann wird nichts weiter unternommen.9 Behandlung von Ausnahmen LE 8 wird zur nächsten catch-Klausel verzweigt. 2.B. Wird die Ausführung des try-Blocks normal beendet. Die catch-Konstrukte werden übergangen. die den aktuellen Parameter akzeptiert. die eine Ausnahme auslösen könnten } catch (MalformedURLException e1) { //Notaktion bei fehlerhaften URLs } catch (UnknownHostException e2) { // Notaktion bei unbekanntem Netzwerkcomputer } catch (IOException e3) { // Notaktion bei allen anderen Ein-/Ausgabeproblemen } Die Ausnahmeobjekte e1. wenn eine Ausnahme eintritt. Eine detaillierte Fehlermeldung erhält man – falls vorhanden – durch e3.2. Enthält die eigene Operation keine catch-Klausel. um dem Aufrufer damit anzuzeigen.getClass(). z. Abschlußarbeiten durchzuführen. e2 und e3 können genauere Informationen über die Ausnahme besitzen. 299 . dann muß sie ebenfalls hinter der Parameterliste eine throw- TryStatement try Block CatchClause Abb. Mehrere CatchClauses werden von links nach rechts abgearbeitet.

die im Wiederholungsteil einer Wiederholungs-Anweisung stehen.}).13-20 zusammengestellt.LE 8 2. Ein Aufruf erfolgt normalerweise durch Angabe des Algorithmusnamens und der aktuellen Parameter. ob (→Auswahl) und wie oft (→Wiederholung) Anweisungen ausgeführt werden. Syntax und Semantik der Ausnahmebehandlung sind in Abb. Programmablaufplan-Notation In DIN 66001 genormte. die einen diskreten Wertebereich aufwärts oder abwärts durchläuft (for (Start. →bedingte Wiederholung). die zweiseitige und die Mehrfachauswahl. aber keine Sprünge (goto) (→strukturiertes Programmieren).}). Ausnahme Fehlerhafte Situationen während der Programmausführung führen zur Auslösung von Ausnahmen. werden solange wiederholt.13 Kontrollstrukturen Klausel haben. Beschreibung eines Algorithmus durch ausschließliche Verwendung von →linearen Kontrollstrukturen (keine goto bzw. Kontrollstrukturen Geben an. grafische Darstellungsform für →Kontrollstrukturen von Algorithmen. sonst terminiert das Programm nicht. if ( ) continue). Fallunterscheidung →Auswahl. Auswahlkette Sonderform geschachtelter if-Anweisungen (→Auswahl). bzw. PAP →Programmablaufplan-Notation. Aufruf Beschreibt den Wechsel der Kontrolle von der aufrufenden Stelle zu dem aufgerufenen Algorithmus und die Rückkehr hinter die Aufrufstelle nach Beendigung des aufgerufenen Algorithmus. damit ihr Aufrufer weiß. →Auswahl.. 300 . am Ende (do { } while ( )) oder innerhalb der Wiederholungsstruktur festgelegt wird (if ( ) break. Auswahl Ausführung von Anweisungen in Abhängigkeit von Bedingungen (auch Verzweigung oder Fallunterscheidung genannt). Man unterscheidet die einseitige. daß Ausnahmen übergeben werden können. Bedingte Wiederholung →Wiederholungs-Anweisung.S. in welcher Reihenfolge (→Sequenz). bis eine Bedingung den Abbruch der Wiederholung verursacht (→Zählschleife. Strukturiertes Programmieren i.. Lineare Kontrollstrukturen →Kontrollstrukturen. ob andere Programme aufgerufen werden (→Aufruf). AufOderAb) {. Sprungkonstrukte). Durch das Sprachkonstrukt elsif ist in einigen Programmiersprachen eine kompakte Formulierung möglich. auf die der Programmierer reagieren kann.. Zählschleife →Wiederholungs-Anweisung.. Laufanweisung →Zählschleife. Ende. bei der der else-Teil wieder if-Anweisungen enthält. Schachtelung Innerhalb von →Kontrollstrukturen können wiederum Kontrollstrukturen stehen. bei der die Anzahl der Wiederholungen durch eine Zählvariable festgelegt ist. Schleife →Wiederholung. bei der die Anzahl der Wiederholungen durch eine Bedingung am Anfang (while ( ) {. →Wiederholung und →Aufruf verwenden. exception →Ausnahme. Verzweigung →Auswahl. Mindestens eine der Anweisungen in der Wiederholungsstruktur muß eine Rückwirkung auf die Bedingung haben. die nur →Sequenz.e. Die Anweisungen werden in der Regel durch ein Semikolon voneinander getrennt. Nassi-Shneiderman-Diagramm →Struktogramm-Notation. Sequenz Anweisungen werden von links nach rechts und von oben nach unten ausgeführt (Aneinanderreihung). Struktogramm-Notation grafische Darstellung →linearer Kontrollstrukturen. 2. Wiederholung Alle Anweisungen.

– Bei einer do-Schleife daran denken..1 – Geschachtelte Anweisungen durch Kommentare gut beschreiben und strukturieren. oder Programmablaufplan (PAP) dargestellt werden. Beim Schreiben eines Java-Programms sollten zusätzlich folgende Java-Regeln Regeln eingehalten werden: – In einer switch-Anweisung jeden Fall mit break beenden. die genau einen Ein. Beim Programmieren sollten folgende Regeln eingehalten werden: allgemeine Regeln – Bei einer zweifachen Auswahl ist im else-Teil als Kommentar anzugeben.. ob und wie oft Anweisungen ausgeführt werden sollen. wenn die Bedingung erfüllt ist (umgekehrt wie im Struktogramm und in vielen anderen Programmiersprachen). – Die for-Schleife nur diszipliniert verwenden und immer alle drei Teile in folgender Form verwenden: for(Zaehlvariable = Anfangswert. die Rückgabe von Ergebnissen von der Benachrichtigung über Fehler zu trennen. Es lassen sich vier verschiedene Arten unterscheiden: die Sequenz. die durch einige Programmiersprachen besonders unterstützt werden. – Die Mehrfachauswahl immer mit Fehlerausgang (default) programmieren. in welcher Reihenfolge. Alle Arten lassen sich beliebig miteinander kombinieren und ineinander schachteln. Verzweigung). die Auswahl (Fallunterscheidung. welche Bedingungen gelten. dann verwendet man eine Zählschleife (Laufanweisung). sonst die bedingte Wiederholung. erlaubt nur solche Kontrollstrukturen. Durch die Einführung einer Ausnahme-Verarbeitung ist es möglich. Um bei Fehlern einen Programmabbruch während der Laufzeit zu vermeiden. Ineinandergeschachtelte Auswahlanweisungen ergeben Auswahlketten. Algorithmen können sowohl textuell in einer Programmiersprache oder grafisch als Struktogramm. Man nennt solche Kontrollstrukturen daher lineare Kontrollstrukturen. Ist die Anzahl der Wiederholungen bekannt. auch Nassi-Shneiderman-Diagramm genannt. die Wiederholung (Schleife) und der Aufruf.then break. Zaehlvariable <= Endwert.und einen Ausgang haben. daß die Schleife wiederholt wird. den default-Fall als letzten Fall aufführen.13-21.e. führen einige Programmiersprachen beim Auftreten von Ausnahmen (exceptions) eine Ausnahmebehandlung durch. Einen Überblick über die Kontrollstrukturen gibt Abb. 2. auf die der Programmierer reagieren kann.Zusammenhänge LE 8 Kontrollstrukturen legen innerhalb eines Algorithmus fest. Zaehlvariable = Zaehlvariable + 1) //Alternativ: Zaehlvariable = Zaehlvariable . Die strukturierte Programmierung i. – Das Beenden von n + 1/2-Schleifen immer mit einer Bedingung vornehmen: if. 301 .S.

LE 8 Abb. default:. } //end while //kein eigenes Konstrukt do {..13-21: Kontrollstrukturen im Überblick Zusammenhänge/Literatur Sprachkonzept Sequenz Java Anweisung1... Jacopini 66/ Böhm C. Jacopini G.. Parameter2... Structured Programming...}] //end if if(expression) {. Flow Diagrams. } //end for Operationsname(Parameter1. } while(expression)... break. S.. 1966 /Dijkstra 69/ Dijkstra H.} //end if //kein eigenes Konstrukt switch(expression) { case expression: ..W.und zweiseitige Auswahl w ? f if(expression) {.. 2.. . Anweisung2.... break. 9...).. Anweisung3.. New York: Petrocelli 1969.... Aufruf Legende: [ ] = optional Zitierte Literatur /Böhm.. Ein. i=i+1) {. } //end switch while(expression) {.:. if(expression) break.. 222–226 302 . break.. } //end while while(true) {. case. for(i=1.. Auswahlketten Mehrfachauswahl while-Schleife n+1/2-Schleife break Schleife mit Bedingung am Ende Zählschleife for ..} [else {. in: Software Engineering – Concepts and Techniques. i<=10.... in: Communications of the ACM.. turing machines and languages with only two formations rules..} else if(expression) {.

i = 1. Java – Die Sprachspezifikation. Marshall I. Aug. Oxford: Blackwell Scientific Publications 1986 /Nassi. in: Structured Programming.Literatur/Aufgaben /Dijkstra 72/ Dijkstra H..println(i). Berlin: Beuth-Verlag.. Verbessern Sie das Programm durch Verwendung der korrekten Kontrollstrukturen. 1983 /DIN 66261/ Sinnbilder für Struktogramme nach Nassi-Shneiderman..out... } else if(Wert == 2) Analytische Aufgaben Muß-Aufgabe 30 Minuten 303 . 1997 /Messer. } else if(Wert == 1) { System. Modula-2: Constructive Program Development. August 1994 /Gosling.println("Wert ist 1"). while(i < 10) { System. Joy B. i = i + 1.out. Shneiderman B..out.out. Berlin: Beuth-Verlag. // Beendet while-Schleife } if(Wert == 0) { System. int Wert) { int i.println("Wert ist 0"). Das folgende Java-Programm ist zwar syntaktisch korrekt und erfüllt einen Zweck. London: Academic Press. Marshall 86/ Messer P. Notes on Structured Programming. S. break. Flowchart Techniques for Structured Programming. public void durchlaufeKontrollstrukturen (boolean Bedingung. Steele G. 12–26 LE 8 1 Lernziel: Kontrollstrukturen problemgerecht.println("Bedingung ist wahr"). } while(Bedingung == true) { System. Bonn: AddisonWesley. 1972. in: SIGPLAN. Berlin: Beuth-Verlag.. Joy. 1973. Steele 97/ Gosling J.. 1–82 /DIN 66001/ Sinnbilder und ihre Anwendung. November 1985 /DIN EN 28631/ Programmkonstrukte und Regeln für ihre Anwendung. die Kontrollstrukturen wurden jedoch unzweckmäßig verwendet. S. W. Shneiderman 73/ Nassi I. qualitätsgerecht und aufwandsgerecht auf Problemstellungen anwenden können.

noch 2"). wie sie bei Fehleingaben reagieren. Führen Sie folgenden Schleifenumformungen durch: a Formulieren Sie eine Java-Zählschleife. qualitätsgerecht und aufwandsgerecht auf Problemstellungen anwenden können. 3 Lernziele: Struktogramme lesen und erstellen können. c Zeichnen Sie ein Struktogramm zu a und b. In den bisherigen Beispiel-Programmen werden Fehleingaben nicht abgefangen. In vielen Anwendungen werden Zufallszahlen benötigt. 4 Lernziele: Struktogramme lesen und erstellen können. Syntax und Semantik linearer Kontrollstrukturen in den Darstellungsformen Struktogramm und Java-Syntax erläutern können. Stellt eine Programmiersprache eine entsprechende Operation bereit. } } Kann-Aufgabe 60 Minuten 2 Lernziel: Kontrollstrukturen problemgerecht.out. c Formen Sie diese while-Schleife in eine Schleife mit Bedingung am Ende um. a Formen Sie die allgemeine Java-Schleife mit Bedingung am Ende in eine while-Schleife um. b Formen Sie die allgemeine Java-Zählschleife in eine while-Schleife um. } else { System. dann kann man diese verwenden. damit an den entsprechenden Stellen Fehlermeldungen ausgegeben werden. Die Größen haben folgende Bezeichnungen: Konstruktive Aufgaben Muß-Aufgabe 15 Minuten Muß-Aufgabe 20 Minuten Kann-Aufgabe 45 Minuten 304 .println("Wert ist 2"). die von n (n > 3) auf 3 mit der Schrittweite -2 zählt. Die Darstellungsformen Struktogramm und Java-Syntax ineinander überführen können. und ergänzen Sie die Beispiele um die geeigneten Konstrukte. noch 1. b Formen Sie diese Zählschleife in eine while-Schleife um. Soll eine neue Zufallszahl ermittelt werden. wie ein Zufallszahlengenerator mit der multiplikativen Kongruenz-Methode arbeitet: Man nehme eine beliebige ganze Zahl xn (1 ≤ xn ≤ m) und multipliziere sie mit einer ganzen Zahl a (a > 0). Das Ergebnis dividiere man durch die ganze Zahl m (m > a). qualitätsgerecht und aufwandsgerecht auswählen und einsetzen können.13 daraufhin.out. Dieser Zufallsgenerator wird durch die iterative Gleichung xn+1 = (a * xn) mod m beschrieben. Der Rest dieser ganzzahligen Division ist die erzeugte Zufallszahl. Im folgenden wird erläutert. 5 Lernziel: Kontrollstrukturen problemgerecht.println("Wert ist weder 0.LE 8 Aufgaben { System. Eine andere Möglichkeit besteht darin. Testen Sie die Beispiele von Kapitel 2. einen eigenen Zufallszahlengenerator zu programmieren. Die Darstellungsformen Struktogramm und Java-Syntax ineinander überführen können. d Stellen Sie die Schleifen aus a – c als Struktogramm dar. dann wird die jeweils zuletzt erzeugte Zahl als Zahl xn benutzt.

erzeugt werden. die den Zufallszahlengenerator modelliert. das die Intervallgrenzen ymin und ymax einliest und eine Zufallszahl liefert. 1) in ein anderes offenes Intervall (ymin. 6 Lernziele: Kontrollstrukturen problemgerecht. das prüft. Finger Aktionen: Rotieren (nur beim Körper und bei der Hand) Beugen (nur bei der Schulter. FSR Grad: 0º bis +180º (absolut) Schreiben Sie ein Java-Programm. Nach einer gewissen Zeit wiederholen sich die erzeugten Zahlen (Periode). die sich im Java-Paket java. Als Startwert muß eine ganze Zahl zwischen 1 und m-1 eingegeben werden. Für die Transformation des Intervalls (0. Aktion. sollte der Multiplikator wie folgt gewählt werden: √m < a Ein solcher Zufallszahlengenerator erzeugt regellose Zahlen im Bereich von 1 bis m-1. Zunächst wird die vom Generator erzeugt Zahl in das offene Intervall (0. ymax) ergibt sich die Formel: y = (ymax ymin) * xtrans + ymin Die Zufallszahlen sollen im abgeschlossenen Intervall [ymax. qualitätsgerecht und aufwandsgerecht auf Problemstellungen anwenden können. Um möglichst lange Perioden zu erhalten.Aufgaben a xn m xn+1 Multiplikator gegebene Größe Modul erzeugte Zufallszahl a > 0 und ganz 1<xn<m und ganz m>a und ganz 0< xn+1<m und ganz LE 8 Man erhält scheinbar regellose Zahlen.util befindet. sollte m möglichst groß gewählt werden.h. HRR Grad: –90º bis +180º (absolut) FSA. ob eingegebene Kommandos dieser Syntax entsprechen und innerhalb der erlaubten Winkel liegen. Muß-Aufgabe 90 Minuten 305 . die die Operationen der Java-Klasse Random liefern. Damit eine möglichst regellos aussehende Zahlenfolge entsteht. b Vergleichen Sie die Ergebnisse mit den Werten. dem Arm und der Hand) Schließen (nur beim Finger) Parameter 1: Absolut oder Relativ Parameter 2: Gradangabe (mit oder ohne Vorzeichen) Folgende Kommandos sind erlaubt: KRA. Verwenden Sie eine GUI-Klasse und eine Fachkonzeptklasse. a Erstellen Sie ein Programm in Java. Parameter1. Lesen Sie die Kommandoteile einzeln ein. einschließlich der Intervallgrenzen ymax und ymin. ymin]. Die Kommandos haben folgenden Aufbau: Objektbezeichnung Aktionsbezeichnung Parameter 1 Parameter 2 Objekte: Körper. Schulter. HBR Grad: –45º bis +45º (absolut) HRA. Parameter2. Eine Bereichstransformation kann nach folgenden Formeln vorgenommen werden. ABR Grad: –45º bis +45º (absolut) HBA. so daß anschließend die folgenden Variablen initialisiert sind: Objekt. die sich mit einer Periodenlänge von m wiederholen. 1) transformiert: xtrans = xzufall/m. die im Intervall von 0 bis m-1 liegen. KRR Grad: –135º bis +135º (absolut) SBA. Arm. gut geeignet sind Primzahlen. d. SBR Grad: –45º bis +45º (absolut) ABA. Hand. Ein Roboter ROB/1 kann durch Kommandos gesteuert werden. Lineare Kontrollstrukturen ineinander schachteln können.

Entwerfen Sie einen Algorithmus bzw. die angibt. In einer Bank oder Sparkasse wird eine Tabelle benötigt. Schreiben Sie einen Algorithmus in Java. 10 Pf. daß er aus dem zu zahlenden Fahrpreis und dem eingeworfenen Geldbetrag das Wechselgeld ermittelt. 1 * 50 Pfennig. Es können beliebig viele Kommandos hintereinander eingegeben werden. 306 . d Der Automat verfügt über folgende Münzarten: 5 DM.. Eingabe: zu zahlender Fahrpreis: 1. 50 Pf. der für ein Anfangskapital von 100 DM und für die Zinssätze von 3 Prozent bis 10 Prozent (in Schritten von 0. 1 DM. c Es können nicht mehr als 10 DM als Geldbetrag eingeworfen werden.. auf welchen Betrag ein Anfangskapital nach einem Jahr bei Verzinsung nach verschiedenen Zinssätzen anwächst. kleinste Einheit 5 Pfennig). Der eingeworfene Geldbetrag ist als float-Wert zu erfassen (zwei Stellen hinter dem Punkt).LE 8 Aufgaben Geben Sie als Ausgabe eine Kommandonummer aus. Geldbetrag: 5. wenn die Kommandosyntax und -semantik verletzt wurde. die folgender Zuordnung entspricht: KRA = 1. Beispiel Klausur-Aufgabe 30 Minuten 8 Lernziel: Kontrollstrukturen auswählen und einsetzen können.00 DM. Es gelten folgende Annahmen und Einschränkungen: a Der zu zahlende Fahrpreis ist ein float-Wert (Pfennigbeträge kommen nicht vor. KRR = 2.65 DM. daß das Endkapital für das Anfangskapital von 100 DM. 2 DM. daß der Automat möglichst wenige Münzen zur Ausgabe benötigt.00 DM Ausgabe: 1 * 2 DM.20 DM eingeworfener Geldbetrag: 5. b Der zu zahlende Fahrpreis ist immer kleiner oder gleich 10 DM und größer als 0 DM. die als Wechselgeld zurückgegeben wird. Das Wechselgeld soll jedoch so ausgegeben werden. 3 * 10 Pfennig Testen Sie das Programm (mindestens) mit folgenden Beispielen: 1 Fahrpreis: 2. Geldbetrag: 9. e Auszugeben ist die Anzahl der jeweiligen Münzart.5 Prozent steigend) das Endkapital nach folgender Formel berechnet und ausgibt: Endkapital = Anfangskapital * (1 + Zinssatz in % / 100) Erweitern Sie anschließend den Algorithmus so. 1 * 1 DM. f Der eingeworfene Geldbetrag ist größer oder gleich dem zu zahlenden Fahrpreis. das folgendes Problem löst: Ein Fahrkartenautomat soll so gesteuert werden.00 DM 2 Fahrpreis: 7. ein Java-Programm. 250 DM und 750 DM berechnet wird. 5 Pf.20 DM. SBA = 3 bis FSR = 12. Muß-Aufgabe 60 Minuten 7 Lernziel: Kontrollstrukturen auswählen und einsetzen können. Geben Sie eine aussagekräftige Fehlermeldung aus.

Mehrfachvererbung.14.13 müssen bekannt sein.4 In den Kapiteln 2. Zuerst die Theorie: Vererbung 308 Intuitive Einführung 308 Einfach.15 2. Verbergen und Polymorphismus erklären können.14. sollten Sie sich vergewissern.17 werden wichtige neue Konzepte der Hinweis Objektorientierung behandelt.LE 9 2 Grundlagen der Programmierung – Vererbung und Polymorphismus Die Begriffe Oberklasse.2 2.15. Unterklasse. Überschreiben und Verbergen problemgerecht einsetzen können. s In Java-Programmen die Konzepte Vererbung. daß Sie die bisherigen Konzepte theoretisch und praktisch beherrschen.14 2.14. Sie setzen die Beherrschung der bisherigen Konzepte voraus.3 2.14.und Mehrfachvererbung 309 Überschreiben und Verbergen 314 Polymorphismus 315 Dann die Praxis: Vererbung in Java 318 Die Java-Syntax und -Semantik der Vererbung 318 Java-Beispiel für die Vererbung 320 Java-Beispiel für das Überschreiben und Verbergen 330 Sonderfälle 334 2.1 2.2 2. s Die beim Vererben. 307 . Überschreiben.14 bis 2. Polymorphismus. Bevor Sie mit den folgenden Kapiteln fortfahren.15. s Die UML-Notation beim Zeichnen von Klassen-Diagrammen verwenden können.4 2. Überschreiben und Verbergen zu berücksichtigenden Regeln – insbesondere in Java – angeben und anwenden können. Einfachvererbung.15. abstrakte Klasse. s s verstehen anwenden Die Kapitel 2. Diese Konzepte eröffnen neue Möglichkeiten der Programmierung.1 2.15.3 2.2 bis 2. Gut geeignet dazu ist das Praktikum 2 (siehe Anhang C).

5. Abb.LE 9 2. 2. Analog wie beim Einfamilienhaus läßt sich eine Klasse »Geschäftshaus« bilden (Abb.1 wurde die Firma Nobel & Teuer vorgestellt. »Verkaufspreis« sowie die Operation »anfragen Verkaufspreis« besitzen. Diese Firma hat sich nun entschlossen. daß beide Klassen die Attribute »Besitzer«.14-2: Vererbung Immobilie {abstract} Besitzer Adresse Baujahr Verkaufspreis anfragen Verkaufspreis Einfamilienhaus Haustyp Wohnfläche Anzahl Bäder Hat Schwimmbad Garten Geschäftshaus Anzahl Büroräume Geschoßzahl Hat Aufzug Hat Tiefgarage erfragen Anzahl Büroräume 308 . »Baujahr«.14-2).14-1: Klassen Einfamilienhaus und Geschäftshaus Einfamilienhaus Haustyp Besitzer Adresse Wohnfläche Anzahl Bäder Hat Schwimmbad Garten Baujahr Verkaufspreis anfragen Verkaufspreis Geschäftshaus Besitzer Adresse Anzahl Büroräume Geschoßzahl Hat Aufzug Hat Tiefgarage Baujahr Verkaufspreis anfragen Verkaufspreis erfragen Anzahl Büroräume Vergleicht man die Klassen Einfamilienhaus und Geschäftshaus. »Adresse«. auch noch Geschäftshäuser anzubieten.14-1).14 Zuerst die Theorie: Vererbung 2. 2. dann sieht man.14. 2. 2. 2.1 Intuitive Einführung In Abschnitt 2.14 Zuerst die Theorie: Vererbung Das grundlegend neue Konzept der objektorientierten Programmierung gegenüber der prozeduralen Programmierung ist die Vererbung. die Einfamilienhäuser vermittelt. Nach einer kurzen intuitiven Einführung wird zunächst die theoretische Seite betrachtet. Diese Attribute und die Operation werden in eine neue Klasse »Immobilie« eingetragen (Abb. Abb.

2 Einfach. Da jede Immobilie entweder ein Einfamilienhaus oder ein Geschäftshaus ist. »Klasse A« und »Klasse B« in Abb. Man unterscheidet daher konkrete Klassen. ihren Oberklassen. Polymorphismus bedeutet. Vererbung subclass.14-4 erklärt. Verhalten und Assoziationen erbt. Basisklassen) verfügen kann. 2. abgeleitete Klasse) über die Eigenschaften. von denen eine Klasse Eigenschaften. »Klasse B« ist direkte Oberklasse von »Klasse C1« und »Klasse C2«.14-3: Polymorphismus :Geschäftshaus drucken drucken Interpretation von »drucken« 2. ist es nicht sinnvoll. Durch die Vererbung entsteht eine Klassenhierarchie bzw.und Mehrfachvererbung LE 9 Vererbung Die Klasse Immobilie vererbt alle ihre Attribute und Operationen an die Klassen Einfamilienhaus und Geschäftshaus. Oberklas. 309 . Dadurch können in verschiedenen Klassen die gleichen Namen für gleichartige Operationen verwendet werden. Operationen.14. »Klasse A« ist direkte Oberklasse von »Klasse B«. 2. Die Klasse Einfamilienhaus besitzt also zusätzlich zu ihren eigenen Attributen und Operationen alle Attribute und Operationen der Klasse Immobilie. enthält aber in der Regel zusätzliche Informationen (Attribute.2. z. von der Klasse Immobilie Objekte zu erzeugen. superclasses.Oberklassen und sen dieser Klasse. und abstrakte Klassen. Der Mechanismus der Vererbung wird anhand der Abb. von denen keine Objekte erzeugt werden können. daß dieselbe Botschaft an Objekte verschiedener Klassen einer Vererbungshierarchie gesendet werden kann und diese Objekte die Botschaft ganz unterschiedlich interpretieren können (Abb. Analog gilt dies für die Klasse Geschäftshaus.14-3). eine Vererbungsstruktur. Drucken. 2. das Verhalten und die Assoziationen einer oder mehrerer allgemeiner Klassen (Oberklassen. von denen Objekte erzeugt werden können.14. :Einfamilienhaus drucken drucken Grundriß Interpretation von »drucken« Außenansicht Polymorphismus Abb. daß eine spezialisierte Klasse (Unterklasse.B.2 Einfach. 2. In einer Vererbungsstruktur heißen alle Klassen. kurz Klassen genannt. Eine Unterklasse ist vollständig konsistent mit ihrer Oberklasse bzw. Assoziationen).14-4 sind Unterklassen Oberklassen von »Klasse C1« und »Klasse C2«.und Mehrfachvererbung Vererbung bedeutet.

Operationen und Assoziationen ihrer Unterklasse sind nicht sichtbar. Verhalten und Assoziationen von einer Klasse erben. In der UML-Notation zeigen von den Unterklassen zu den direkUML-Notation ten Oberklassen Pfeile. Operationen und Unterklassen »unsichtbar« Assoziationen und die ihrer Oberklassen. 2. Die Attribute. alternativ Bei einer abstrakten Klasse wird der Klassenname kursiv angegeben. die in einer Klassenhierarchie Eigenschaften. sind Unterklassen dieser Klasse. »Klasse B«. »Klasse C1« und »Klasse C2« sind Unterklassen von »Klasse A«. Oberklassen sollen in Diagrammen über den Unterklassen stehen. 2. Abb. »Klasse C1« und »Klasse C2« sind direkte Unterklassen von »Klasse B«. transparentes Dreieck ist. Abb. Abstrakte Klassen werden in diesem Buch mit einem grauen Hintergrund dargestellt (vgl. Es ist möglich. Zusätzlich oder alternativ kann in geschweiften Klammern das Wort abstract stehen. sofern diese für sie sichtbar sind.14-2).LE 9 Objektebene 2. wobei die Pfeilspitze ein weißes bzw.14 Zuerst die Theorie: Vererbung Klassenebene ObjektA: KlasseA KlasseA AttributA KlassenattributA = W OperationA() KlassenoperationA() direkte Oberklasse von Klasse B 1 KlasseX Assoziation :KlasseX Verbindung AttributA = Wert1 (link) :KlasseX :KlasseY ObjektB: KlasseB AttributB = Wert2 AttributB = Wert3 KlasseB AttributB KlassenattributA = W OperationB() direkte Unterklasse von Klasse A direkte Oberklasse der Klassen C1 und C2 1 KlasseY Assoziation direkte Unterklasse von Klasse B direkte Unterklasse von Klasse B :KlasseX :KlasseY ObjektC1: KlasseC1 AttributC1= Wert4 AttributB = Wert5 AttributA = Wert6 KlasseC1 AttributC1 KlassenattributA = W OperationC1() KlasseC2 AttributC2 KlassenattributA = W OperationC2() :KlasseX :KlasseY ObjektC2: KlasseC2 AttributC2= Wert7 AttributB = Wert8 AttributA = Wert9 Alle Klassen. entweder von jeder Unterklasse zur direkten Oberklasse einen Pfeil zu zeichnen oder die Linien von mehreren Unterklassen zusammenzuführen und vom Vereinigungspunkt einen Pfeil zur gemeinsamen Oberklasse zu zeichnen. Jede Klasse »kennt« nur ihre eigenen Attribute.14-4: Beispiel für den Vererbungsmechanismus 310 .

2. 2 Alle Operationen. dann wird wiederum zur nächsten direkten Oberklasse verzweigt (hier KlasseA). dann besitzen es auch alle Objekte von »KlasseB«. Ist sie dort auch nicht vorhanden. 3 Besitzt »KlasseA« ein Klassenattribut mit dem Wert W. sind auch in den Unterklassen gültig. Ist sie dort vorhanden. geht es bei der Vererbung nicht nur darum. Da Beispiel sie inzwischen auch Software-Produkte und Software-Komponenten von anderen Firmen für ihre eigenen Entwicklungen bezieht. 4 Existiert eine Assoziation zwischen »KlasseA« und einer Klasse »KlasseX«. Analog gilt dies für Klassenoperationen. dann wird sie bei der direkten Oberklasse gesucht (hier KlasseB). Diese Gemeinsamkeiten werden in eine neue Oberklasse Geschäftspartner ausgelagert (Abb. Dabei werden einige Attribut.14-5).und Operationsnamen verallgemeinert. Sichtbarkeitsbereich und Restriktionen. Ist sie nicht vorhanden. die auf Objekte von »KlasseA« angewandt werden können. dann wird zu KlasseC2 verzweigt und dort OperationA() gesucht. Zugriffsart. Wird beispielsweise die Botschaft OperationA() an ObjektC2 gesandt. 2. »AttributB« und »AttributA« angelegt werden muß. Die anderen Eigenschaften von Attributen. da KlasseA keine direkte Oberklasse mehr besitzt. »KlasseC1« und »KlasseC2«.2 Einfach. 5 Auf Objekte von »KlasseC1« können »OperationC1()«. wird ein Fehler gemeldet. können auch auf die Unterklassen der »KlasseA« angewandt werden. die auf »KlasseA« angewandt werden können.14-6).14. sind auch auf alle Objekte der Unterklassen von »KlasseA« anwendbar. dann wird diese Operation auf das ObjektC2 angewandt. Wie das Beispiel zeigt. Es handelt sich um ein und dasselbe Attribut. Ist sie dort nicht vorhanden. Die Firma ProfiSoft möchte ihre Kundenverwaltung erweitern. »OperationB()« und »OperationA()« angewandt werden. daß beim Erzeugen eines Objekts der »KlasseC1« ein Objekt mit Speicherplätzen für »AttributC1«. die Objekte der Unterklassen können Verbindungen mit Objekten der »KlasseX« herstellen. Attributwerte von »AttributA« werden nicht vererbt. gemeinsame Eigenschaften und Verhaltenweisen zusammenzu311 . dann besitzen auch alle Unterklassen von »KlasseA« dieses Klassenattribut mit dem Wert W. dann wird diese Assoziation an alle Unterklassen von »KlasseA« vererbt. Der beschriebene Vererbungsmechanismus bedeutet. d. Beide Klassen haben gemeinsame Attribute und Operationen.2. benötigt sie auch eine Lieferantenverwaltung (Abb. Alle Klassenoperationen. wie Typ.und Mehrfachvererbung LE 9 Eine Oberklasse vererbt folgendes an ihre Unterklassen (wenn Was wird vererbt? alle Attribute und Operationen als öffentlich gekennzeichnet sind): 1 Besitzen alle Objekte von »KlasseA« ein »AttributA«.h.

2. Man muß sagen können: Jedes Objekt der Unterklasse »ist ein« (is a) Objekt der Oberklasse. ein Window ist ein Container. 2.15-2). eine Component ist ein Object. Ein weiteres Beispiel für eine Generalisierungs-/Spezialisierungshierarchie zeigt die Hierarchie der Fensterklassen in Java (Abb.14 Zuerst die Theorie: Vererbung Kunde Firmenname: String Firmenadresse: String Auftragssumme: int Kunde() aendernAdresse setFirmenname setFirmenadresse setTelefonnr setAuftragssumme getFirmenname getFirmenadresse getAuftragssumme Lieferant Lieferantenname: String Firmenadresse: String Verbindlichkeiten: float Ansprechpartner: String Lieferant() aendernAdresse setLieferantenname setFirmenadresse setTelefonnr setVerbindlichkeiten setAnsprechpartner getLieferantenname getFirmenadresse getVerbindlichkeiten getAnsprechpartner Abb. ein Container ist eine Component. 312 .14-5: Klassen mit gemeinsamen Attributen/ Operationen 2. Spezialisierung darstellen. Man spricht daher bei einer Vererbung auch von einer »ist ein«-Beziehung zwischen Klassen.LE 9 Abb. 2. Es liegt immer eine »ist ein«-Beziehung vor: Ein FrameDialog ist ein Dialog. »ist ein« Beispielsweise ist ein Kunde ein Geschäftspartner. sondern eine Vererbungshierarchie muß immer auch eine Generalisierung bzw. Ebenfalls ist ein Lieferant ein Geschäftspartner.14-6: Einfachvererbung Geschäftspartner {abstract} Firmenname: String Firmenadresse: String aendernFirmenadresse setFirmenname setFirmenadresse getFirmenname getFirmenadresse (abstrakte) Oberklasse von Kunde und Lieferant Kunde Auftragssumme: int Kunde() setAuftragssumme getAuftragssumme Lieferant Verbindlichkeiten: float Ansprechpartner: String Lieferant() setVerbindlichkeiten setAnsprechpartner getVerbindlichkeiten getAnsprechpartner Generalisierung Spezialisierung fassen. ein Dialog ist ein Window.

in der jede Klasse – mit Ausnahme der Wurzel – genau eine direkte Oberklasse besitzt.2 Einfach.und der AnalogDigital-Anzeige keine andere Anzeige gibt. Sie kann als azyklisches Netz dargestellt. der Rumpf der Operation ist leer. daß eine Klasse von ihren Oberklassen zwei Attribute oder Operationen gleichen Namens erbt. Man spricht dann von einer abstrakten Operation. 2. Mehrfachvererbung abstrakte Klasse Abb.14. Die Klasse Beispiel »Uhr-Anzeige« ist hier als abstrakte Klasse modelliert. Es wird nur die Signatur der Operation angegeben. 2. von dieser Klasse Objekte zu erzeugen.und Mehrfachvererbung LE 9 Einfachvererbung Die Einfachvererbung ist eine Vererbungsstruktur. der Analog. in der jede Klasse mehrere direkte Oberklassen besitzen kann. Hier muß festgelegt werden. Abb. Bei der Mehrfachvererbung kann der Fall auftreten. 2. d. Abstrakte Operationen werden in Kapitel 2.14-7 zeigt ein Beispiel für die Mehrfachvererbung. wie diese Konflikte zu lösen sind. Es ist jedoch nicht beabsichtigt. 2. Uhr-Anzeige Stunde Minute Abb. Es entsteht eine Baumhierarchie.14-6 und Abb. Eine abstrakte Klasse kann auf zwei verschiedene Arten konzipiert werden: s Mindestens eine Operation wird nicht implementiert.14-7: Mehrfachvererbung Digital-Anzeige 13:47 Anzeigengröße Analog-Anzeige Ziffernblatt Stundenzeiger Minutenzeiger Digital-Analog-Anzeige Digital-Anordnung 13:47 313 . weil es – in diesem Modell – außer der Digital-.16 näher behandelt.h. s Alle Operationen werden – wie bei einer konkreten Klasse – vollständig implementiert. Die Mehrfachvererbung ist eine Vererbungsstruktur.2.15-2 beschreiben eine Einfachvererbung.

Mit anderen Worten: Die Schnittstelle der neuen Operation in der Unterklasse muß konform zur Operation der Oberklasse sein. } Überschreiben von Operationen Beispiel Konto Kontonr: int Kontostand: float buchen(float Betrag) getKontostand() Sparkonto buchen(float Betrag) Abb.14 Zuerst die Theorie: Vererbung 2. 2. 2.buchen(Betrag). Eine Unterklasse überschreibt (override) bzw.LE 9 2. daß das geerbte Attribut in der Unterklasse nicht sichtbar ist. In einer Unterklasse neu deklarierte Attribute können geerbte Attribute verbergen (hide). redefiniert (redefine) eine Operation einer Oberklasse. wenn sie eine Operation gleichen Namens enthält. daß der Kontostand nicht negativ werden kann.14. Die Operation buchen(float Betrag) der Klasse »Konto« kann folgendermaßen spezifiziert werden: Operation buchen(float Betrag) { Kontostand = Kontostand + Betrag. Bei der Redefinition ist folgende Einschränkung zu beachten: In einer redefinierten Operation müssen die Anzahl und die Typen der Ein-/Ausgabeparameter gleich bleiben.3 Überschreiben und Verbergen Durch das Konzept der Vererbung ist es in einer Unterklasse möglich. die zusätzlich zur Operation »buchen« der Klasse »Konto« dafür sorgt.8: Redefinition von Operationen Die redefinierte Operation »buchen« der Klasse »Sparkonto« kann folgendermaßen spezifiziert werden: Operation buchen(float Betrag) { //Lesender Zugriff auf das geerbte Attribut //durch Aufruf der geerbten Operation getKontostand if((getKontostand() + Betrag) >= 0) { Konto. In der Abb.14-8 enthält die Klasse »Sparkonto« die Operation »buchen«. Dies ist dann der Fall. 314 . //Aufruf der geerbten Operation } } Bei redefinierten Operationen wird im Rumpf oft die geerbte Operation aufgerufen. Vorteil Verbergen von Attributen Überschreiben erleichtert es den Unterklassen. Verbergen bedeutet. Die Operation der Unterklasse stellt eine echte Spezialisierung der Operation der zugehörigen Oberklasse dar. wenn der Name eines neu deklarierten Attributs mit dem Namen eines geerbten Attributs identisch ist.14. geerbte Operationen zu überschreiben und geerbte Attribute zu verbergen. das Verhalten einer bestehenden Klasse zu erweitern. Die Attribute einer Klasse können sowohl deklariert als auch geerbt sein.

dann können beide Attribute einen unterschiedlichen Typ besitzen. daß der Sender einer Botschaft nicht wissen muß.15. 315 . flexible und leicht änderbare Systeme zu entwickeln.4 Polymorphismus Zugriff auf überschriebene Operationen und verborgene Attribute: super Ein wichtiges Konzept der objektorientierten Software-Entwicklung Polymorphismus ist der Polymorphismus. dann kann beim Aufruf der Operation. In Java geschieht dies durch Angabe des Schlüsselwortes super (siehe Abschnitt 2. eine Referenz auf ein Objekt der Klasse Konto oder eine Referenz auf ein Objekt der Unterklasse Sparkonto angegeben werden. Der Polymorphismus ermöglicht es. wo ein Objekt der Oberklasse erlaubt ist. Anders ausgedrückt: Steht auf der Parameterliste ein ReferenzAttribut vom Typ der Klasse Konto. Polymorphismus bedeutet.2. dann kann während der Laufzeit dort auch ein Objekt einer Unterklasse stehen. »–« und »*« sowohl auf ganze als auch auf reelle Zahlen angewendet. Klassen können wie Typen verwendet werden. ist eine besondere Notation erforderlich.14. den gleichen Namen für gleichartige Operationen zu verwenden. auf verborgene Attribute der Oberklasse zugreifen zu können. Das bedeutet. ganz unterschiedliche – Art darauf reagieren. und daß die Empfängerobjekte jeder Klasse auf ihre eigene – evtl. Der Algorithmus ist jedoch je nach Typ der Operanden ganz unterschiedlich. Der Begriff läßt sich wörtlich mit »viele Erscheinungsformen« übersetzen. zu welcher Klasse das Empfängerobjekt gehört. daß dieselbe Botschaft an Objekte verschiedener Klassen (einer Vererbungshierarchie) gesendet werden kann. 2. In den objektorientierten Sprachen wurde dieses Konzept systematisch weiterentwickelt und allgemein verfügbar gemacht. Dieses Konzept wird im folgenden am Beispiel der Programmiersprache Java näher erläutert. zur Laufzeit.2). die einen Parameter vom Typ der Oberklasse enthält.h. In den meisten Programmiersprachen werden die arithmetischen Operationen »+«. d. Dieser Mechanismus ermöglicht es. Generell gilt: Ein Objekt einer Unterklasse kann überall dort verwendet werden. daß ein Empfängerobjekt das gewünschte Verhalten besitzt.4 Polymorphismus LE 9 Wird ein Attribut durch ein anderes Attribut verdeckt. Spezifiziert man eine Operation. zu welcher Klasse das Objekt gehört und auch nicht. Der Sender muß nur wissen. welche Operation das gewünschte Verhalten erbringt. er muß nicht wissen. Um von einer Unterklasse überschriebene Operationen der Oberklasse aufrufen bzw. die auf Objekten verschiedener Klassen auszuführen sind.14.

wenn die Oberklasse Konto um weitere Unterklassen ergänzt wird. auf welches Objekt das Referenz-Attribut einObjekt zeigt.LE 9 Beispiel 2. 2.buchen(Zahlung).300. .00) spätes Binden Die Zuordnung des Aufrufs einObjekt.buchen(Zahlung) zur Operation »buchen« der Oberklasse oder zur Operation »buchen« der Unterklasse kann erst zur Laufzeit erfolgen. daß die Operation einausZahlungenInBar nicht geändert werden muß.20).. Zur Laufzeit: einausZahlungenInBar(einKonto.buchen(Zahlung) Sparkonto einSparkonto = new Sparkonto() buchen(float Betrag) einObjekt einSparkonto: Sparkonto Zur Laufzeit: einausZahlungenInBar(einSparkonto. einObjekt.-500.. Daher kann er nicht entscheiden. 300. Die Operation einausZahlungenInBar kann folgendermaßen aufgerufen werden: einausZahlungenInBar(einKonto.14 Zuerst die Theorie: Vererbung Eine Operation einausZahlungenInBar kann folgendermaßen spezifiziert werden (in Java): void einausZahlungenInBar(Konto einObjekt. Wichtig ist. -500.h. Im ersten Fall wird die Operation »buchen« der Oberklasse aufgerufen. von welchem Typ das Referenz-Attribut einObjekt ist. Diese »späte« Zuordnung bezeichnet man als »spätes Binden« oder »dynamisches Binden«. einausZahlungenInBar(einSparkonto.14-9).14-9: Veranschaulichung des Polymorphismus Beim Übersetzen dieser Operation ist dem Compiler nicht bekannt. im zweiten Fall die redefinierte Operation »buchen« der Unterklasse Sparkonto.00).20) Konto Kontonr: int Kontostand: float getKontostand() buchen(float Betrag) ? einObjekt einKonto = new Konto() einKonto: Konto Zur Übersetzungszeit: einObjekt. float Zahlung) { .. } Abb. d. 2. 316 .. welche Operation »buchen« aufzurufen ist (»buchen« der Oberklasse Konto oder redefiniertes »buchen« der Unterklasse Sparkonto) (Abb.

Die verwendete Programmiersprache muß diese Konzepte ermöglichen. daß der Polymorphismus nicht angewendet wurde und Klassenhierarchien schlecht durchdacht sind. void einausZahlungenInBar (Konto einObjekt. . break.. ohne Verwendung von Operationen.2. Beim Polymorphismus handelt es sich um ein Konzept. müssen auch alle Oberklassen verstanden werden.buchenSparkonto(Betrag). Ohne den Polymorphismus müßten bei der Programmierung umfangreiche Mehrfachauswahl-Anweisungen (switch) verwendet werden. case istSparkonto: einObjekt. int Kontodaten..h. zugegriffen werden kann. 317 . . final int istSparkonto = 1.4 Polymorphismus LE 9 Das hier skizzierte Polymorphismus-Konzept ist wirksam. spätes Binden und redefinierte Operationen zusammenwirken. seine eigene Klasse implizit kennt. break. Das Vorhandensein solcher Mehrfachauswahl-Anweisungen ist ein Indiz dafür. weil jedes Objekt seinen eigenen Typ bzw. spezialisierte Klassen erstellt werden. .Das Geheimnisprinzip wird verletzt. . Durch die Verwendung des Polymorphismus werden also große Mehrfachauswahl-Anweisungen überflüssig. wenn Vererbung.14. dann müssen unter Umständen auch ihre Unterklassen neu programmiert werden. + Änderungen sind leicht durchführbar. da in vielen Programmiersprachen von Unterklassen aus direkt auf Attribute der Oberklassen.Beispiel de Konstruktion notwendig: final int istKonto = 0. das sich Notation syntaktisch in keiner Notation niederschlägt. float Betrag) { switch(Kontodaten) { case istkonto: einObjekt.Um eine Unterklasse zu verstehen. Das Konzept der Vererbung besitzt folgende Vor. } } Neue Kontoarten führen zu Erweiterungen der switch-Anweisung.und Nachteile: Bewertung + Unter Verwendung existierender Klassen können mit wenig Aufwand neue. Bei der herkömmlichen prozeduralen Programmierung wäre folgen. da sich Änderungen von Attributen und Operationen in der Oberklasse automatisch auf alle Unterklassen der Vererbungshierarchie auswirken. Eine Mehrfachauswahl-Anweisung müßte entsprechend dem Typ eine entsprechende Aktion auslösen. d.buchenKonto(Betrag).Wird eine Oberklasse neu implementiert.

Diese Klasse heißt in Java Object und wird – neben vielen anderen Klassen – standardmäßig zur Verfügung gestellt. auch ein Objekt der Unterklasse erlaubt ist. In den bisherigen applet-Beispielen wurde bei den GUI-Klassen bereits von der Vererbung Gebrauch gemacht. auch auf jedes andere Objekt irgendeiner Klasse zeigen. dann nimmt Java automatisch an.15.15 Dann die Praxis: Vererbung in Java 2. Objekte auf Gleichheit zu überprüfen und den Wert eines Objekts in eine Zeichenkette umzuwandeln.15 Dann die Praxis: Vererbung in Java Java unterstützt die Einfachvererbung und in eingeschränkter Form die Mehrfachvererbung. 2. um Kopien von Objekten anzulegen.1 Die Java-Syntax und -Semantik der Vererbung Durch die Einfachvererbung in Java ergibt sich eine baumförmige Klassenhierarchie mit einer Wurzelklasse an der Spitze. an der ein Objekt einer Oberklasse stehen kann. das vom Typ Object ist. Object stellt Operationen zur Verfügung. stehen auch allen Klassen die in Object definierten Operationen zur Verfügung. Die Klasse Object ist abstrakt und wird nie direkt verwendet.15-1: Java-Syntax für Klassen ClassDeclaration Klassen-Deklaration class public abstract final Super extends ClassType Identifier Super Interfaces ClassBody ClassType TypeName 318 . daß die betreffende Klasse Unterklasse der aufgeführten Oberklasse ist (Abb. 2. Alle Klassen in Java erben von Object. 2. kann ein Referenz-Attribut. Auf diese Operationen wird in späteren Kapiteln eingegangen. daß Object die Oberklasse ist.LE 9 2.15-1). Da in einer Vererbungshierarchie an jeder Stelle. Die eingeschränkte Mehrfachvererbung ist über Schnittstellen möglich. Ist Object nicht explizit als Oberklasse einer Klasse angegeben. Der Hintergrund Object extends Oberklasse Abb.16 behandelt werden. In Java wird hinter dem Klassennamen durch »extends Oberklasse« angegeben. Da aber alle Klassen von Object abgeleitet sind. die in Kapitel 2.

2.15-2: Hierarchie der Fensterklassen Component Container Panel Window Applet Frame Dialog FrameDialog In Java kann durch das Schlüsselwort final vor dem Klassen. von der Klasse Applet zur Verfügung gestellt.. ein.} Beispiele Die Klasse Applet muß Oberklasse aller Java-applets sein..B. aber noch nicht implementiert sind.final namen angegeben werden. das sind Operationen.6 stellt eine Standardschnittstelle zwischen applets und ihrer Umgebung zur Verfügung. die deklariert. daß abstrakte Klassen es sich um eine abstrakte Klasse handelt. 319 .15-2). Eine abstrakte Operation wird ebenfalls durch das Schlüsselwort abstrakte abstract gekennzeichnet. start(). public class KundeGUI extends Applet {.15.. Das Schlüsselwort abstract vor dem Klassennamen legt fest.6. Abstrakte Klassen können abstrakte Operationen enthalten... daß von dieser Klasse keine Unterklassen gebildet werden können. public class KundeGUI extends Frame {... daß die Klassen Applet und Frame gemeinsame Oberklassen besitzen (Abb.Operationen heitliche Signaturen in allen Unterklassen sicherzustellen.1 Die Java-Syntax und -Semantik der Vererbung LE 9 dazu ist. Sie Abschnitt 2.} public class ZaehlerGUI extends Applet {.} Beispiel Applets und Anwendungen haben zum Teil gleiche Operationen verwendet. Abstrakte Operationen dienen dazu.. 2.2. Das liegt daran.. Bei den bisherigen Anwendungen hat die GUI-Klasse immer von der Klasse Frame geerbt. Die Operationen init(). daß jede bisher deklarierte GUI-Klasse eine Unterklasse der Standardklasse Applet ist. Von einer abstrakten Klasse können keine Objekte erzeugt werden. Spezialisierung Object Generalisierung Abb.. stop() und destroy() werden z.

daß eine Unterklasse auf Attribute und Hilfsoperationen seiner Oberklassen direkt zugreifen kann.2 beschriebenen Kunden. this.2 Java-Beispiel für die Vererbung Die Vererbung in Java wird im folgenden am Beispiel der in Abschnitt 2. String Firmenadresse) { this.14. Damit verbunden ist natürlich eine »Aufweichung« des Geheimnisprinzips. da Unterklassen in der Regel ihre Oberklassen gut kennen. Firmenadresse. Es ist anzunehmen.15 Dann die Praxis: Vererbung in Java protected nur in Sonderfällen benutzen Innerhalb einer Klasse sollte das Geheimnisprinzip gelten.und Lieferantenverwaltung * Fachkonzept-Klasse: Geschaeftspartner * Aufgabe: abstrakte Oberklasse Geschaeftspartner */ public abstract class Geschaeftspartner { //Attribute protected String Firmenname. 2. wenn sie schwierig anzuwenden ist. Durch das Schlüsselwort private vor den Attributen wird dies sichergestellt. Durch das Schlüsselwort protected (geschützt) – anstelle von private – vor den Attributen und Operationen wird dies erlaubt. Hilfsoperationen. Daher sollte von protected nur sehr vorsichtig Gebrauch gemacht werden.Firmenname = Firmenname.Firmenadresse = Firmenadresse.15. Greifen Unterklassen auf die Attribute einer Oberklasse direkt zu. dann müssen alle diese Unterklassen mit geändert werden.und Lieferantenverwaltung sieht unter Verwendung der Vererbung folgendermaßen aus: /* Programmname: Kunden. die nur innerhalb einer Klasse benötigt werden. Beispiel Das Java-Programm der Kunden. Private Attribute werden mitvererbt. Das erschwert die Änderbarkeit und Wartbarkeit eines Programms. Die Verwendung außerhalb der Vererbungshierarchie wird durch protected verhindert. In einer Vererbungshierarchie ist es manchmal sinnvoll. Eine Klasse kann eine Operation als protected deklarieren.und Lieferantenverwaltung der Firma ProfiSoft dargestellt. //Kombinierte Schreiboperation public void aendernAdresse (String Firmenname.LE 9 private 2. wenn die Attribute der Oberklasse sich ändern. Geschützte Operationen sind sinnvoller. daß von den Unterklassen aus diese Operation korrekt benutzt wird. es kann aber nur über Operationen auf sie zugegriffen werden. } 320 . sollten ebenfalls durch private vor externem Gebrauch geschützt werden.

und Lieferantenverwaltung * Fachkonzept-Klasse: Kunde * Aufgabe: Verwaltung der Kunden */ public class Kunde extends Geschaeftspartner { //Attribute protected int Auftragssumme = 0. } } /* Programmname: Kunden. 321 LE 9 . } //Lesende Operation public int getAuftragssumme () { return Auftragssumme. } //Schreibende Operation public void setAuftragssumme(int Summe) { Auftragssumme = Summe. //Konstruktor public Kunde(String Name) { //Aufruf der geerbten Operation setFirmenname(Name).Firmenadresse = Firmenadresse.2 Java-Beispiel für die Vererbung //Schreibende Operationen public void setFirmenname (String Firmenname) { this.Firmenname = Firmenname. } } /* Programmname: Kunden.und Lieferantenverwaltung * Fachkonzept-Klasse: Lieferant * Aufgabe: Verwaltung von Lieferanten */ public class Lieferant extends Geschaeftspartner { //Attribute protected float Verbindlichkeiten = 0.2. } //Lesende Operationen public String getFirmenname () { return Firmenname.0f. } public String getFirmenadresse () { return Firmenadresse. } public void setAdresse (String Firmenadresse) { this.15. protected String Ansprechpartner.

LE 9 2. public class KundeLieferantGUI extends Applet { //Deklarieren eines Kunden...und Lieferantenverwaltung * GUI-Klasse: KundeLieferantGUI * Aufgabe: Benutzungsoberfläche */ import java. //{{DECLARE_CONTROLS . private boolean KundenAnzeige = true. } //Lesende Operationen public float getVerbindlichkeiten () { return Verbindlichkeiten. //}} 322 .*.. //}} //Operationen public void init() { //{{INIT_CONTROLS . //Deklarieren der Interaktionselemente Label listeFuehrungstext.15 Dann die Praxis: Vererbung in Java //Konstruktor public Lieferant(String Firmenname) { //Direkter Zugriff auf Attribut der Oberklasse super. import java. private boolean KundeErfasst = false. private boolean LieferantErfasst = false. } //Schreibende Operationen public void setVerbindlichkeiten (float Summe) { Verbindlichkeiten = Summe. private boolean ersteAnzeige = true.und Lieferantenobjekts private Kunde einKunde.applet. } public void setAnsprechpartner (String Name) { Ansprechpartner = Name. private Lieferant einLieferant..*.awt.Firmenname = Firmenname. } } /* Programmname: Kunden. TextArea listeTextbereich. } public String getAnsprechpartner () { return Ansprechpartner.

//einAbhoerer bei den Druckknöpfen registrieren speichernDruckknopf.setAuftragssumme(MerkeZahl).getText().valueOf(MerkeText). } else { einLieferant = new Lieferant(MerkeText). Integer i = Integer. //Adresse eintragen einLieferant.addActionListener(einAbhoerer). MerkeZahl = i.setText("").setText("").15. //Auftragssumme eintragen MerkeText = summeTextfeld. } } public void anzeigeListe() { if(ersteAnzeige) { //dynamisches Anzeigen von Führungstext und //Textliste LE 9 323 .getText().//Anzeige freigeben MerkeText = nameTextfeld. summeTextfeld.addActionListener(einAbhoerer).setVerbindlichkeiten(MerkeZahl).setAdresse(adresseTextfeld. getText()). adresseTextfeld.2. einKunde. summeTextfeld. einLieferant. anzeigenDruckknopf. einLieferant.setAdresse(adresseTextfeld.setText(""). anzeigenDruckknopf. } public void speichereEingabe() { String MerkeText.setAnsprechpartner(leeresTextfeld.2 Java-Beispiel für die Vererbung //Neuen Abhoerer erzeugen AktionsAbhoerer einAbhoerer = new AktionsAbhoerer(this).setText("").intValue(). Integer i = Integer. //Verbindlichkeiten eintragen MerkeText = summeTextfeld. nameTextfeld.setEnabled(true).addActionListener(einAbhoerer).intValue(). wechselnDruckknopf. leeresTextfeld. MerkeZahl = i.setText(""). adresseTextfeld.valueOf(MerkeText).getText(). //Adresse eintragen einKunde.//Textfeld-Inhalt löschen if(KundenAnzeige) { einKunde = new Kunde(MerkeText).getText()). int MerkeZahl. LieferantErfasst = true.getText()).setText(""). KundeErfasst = true.

setFont(new Font("Dialog". listeTextbereich.15 Dann die Praxis: Vererbung in Java listeFuehrungstext = new Label("Kunden. //das zu einer Unterklasse von Firma gehört String MerkeText. if(Klassenname. ersteAnzeige = false. MerkeText = einGeschaeftspartner.getFirmenadresse(). //Aufruf von Anzeigen. listeTextbereich. int MerkeZahl.184.equals("Kunde")) //Abfrage auf Gleichheit { MerkeZahl = einKunde. listeTextbereich.96).getAuftragssumme(). add(listeFuehrungstext).360.0.216. listeTextbereich.BOLD. Übergabe //Objekt einKunde if(LieferantErfasst) anzeigen(einLieferant).append(Klassenname+"\n"). } else { float MerkeZahlf = einLieferant.und Lieferantenliste").getFirmenname().setBounds(36.170. MerkeText = einLieferant.append(MerkeText+"\n"+"\n"). listeFuehrungstext.getAnsprechpartner().0.append(MerkeText+"\n").append(MerkeText+"\n"+"\n").valueOf(MerkeZahlf). MerkeText = String. listeTextbereich = new TextArea("". MerkeText = einGeschaeftspartner. 12)). Font. add(listeTextbereich).getVerbindlichkeiten().getClass(). }//Ende if listeTextbereich. listeTextbereich.getName(). listeTextbereich. } } 324 . Klassenname.//Polymorphismus } private void anzeigen(Geschaeftspartner einGeschaeftspartner) { //Auf der Parameterliste darf jedes Objekt stehen.24). listeTextbereich.setForeground(new Color(0)).setBounds(36.append("\nNeue Liste\n"). //Klassennamen des Objekts holen listeTextbereich. zu dem das Objekt gehört //getClass() ist eine Operation der Klasse Object Klassenname = einGeschaeftspartner.TextArea. if(KundeErfasst) anzeigen(einKunde).valueOf(MerkeZahl). //Ausgabe des Klassennamens.append(MerkeText+"\n").SCROLLBARS_VERTICAL_ONLY). MerkeText = String.append(MerkeText+"\n").LE 9 2. listeFuehrungstext.

setBounds(168.setText("Kunden erfassen"). if (quelle == einGUI. // ! bewirkt Negation if(KundenAnzeige) { erfassenFuehrungstext.15-4. leererFuehrungstext.setText("Verbindlichkeiten").0).anzeigeListe(). 2. } public void actionPerformed(ActionEvent event) { //Ereignisquelle feststellen mit getSource Object quelle = event. 325 .wechselnDruckknopf) einGUI. summeFuehrungstext.2.setText("Auftragssumme"). summeFuehrungstext. public class AktionsAbhoerer implements ActionListener//wird von Java zur Verfügung gestellt { KundeLieferantGUI einGUI.event.setBounds(156.speichereEingabe(). 2.15.und Lieferantenverwaltung * Abhörer-Klasse: AktionsAbhoerer * Abhoerer-Klasse ist eigenständige Klasse */ import java.awt. //Referenz-Attribut: AktionsAbhoerer(KundeLieferantGUI einKundeLieferantGUI) { einGUI = einKundeLieferantGUI.//Reaktion auf Speichern else if (quelle == einGUI.getSource(). leererFuehrungstext.anzeigenDruckknopf) einGUI.156.2 Java-Beispiel für die Vererbung public void wechsleOberflaeche() { KundenAnzeige = ! KundenAnzeige. } } }//Ende KundeLieferantGUI /* Programmname: Kunden. } else { erfassenFuehrungstext.//Reaktion auf Anzeigen else if (quelle == einGUI.setText("").15-3 und Abb.0.*. leeresTextfeld.29). leeresTextfeld.156.setText ("Lieferanten erfassen").wechsleOberflaeche().setText("Ansprechpartner").speichernDruckknopf) einGUI. //Reaktion auf Kunde/Lieferant } } LE 9 Die Benutzungsoberfläche zeigen die Abb.120.

dann wird er vom Java-Compiler automatisch hinzugefügt.15-3: Beispiel für die Kundenerfassung 2. 2. 2.15-4: Beispiel für die Lieferantenerfassung und Listendarstellung Konstruktoren Manche Programmierumgebungen erlauben auch die Anzeige der Klassenhierarchie (Abb. da von ihr keine Objekte erzeugt werden sollen. Fehlt dieser StandardKonstruktor. Die abstrakte Klasse Geschaeftspartner benötigt eigentlich keinen Konstruktor. Daher benötigt auch die abstrakte Klasse einen »leeren« Standard-Konstruktor Geschaeftspartner(){}.LE 9 Abb.oder Lieferantenobjekts müssen allerdings auch die geerbten Attribute der abstrakten Klasse mitangelegt werden. diesen Konstruk326 .15-5). Es muß nun aber auch die Möglichkeit geben.15 Dann die Praxis: Vererbung in Java Abb. 2. Beim Anlegen eines Kunden.

Ein solcher Aufruf beginnt mit super. eines Oberklassenkonstruktors beginnt. s Die erste Anweisung kann aber auch ein expliziter Aufruf eines anderen Konstruktors aus der direkten Oberklasse sein. daß der Konstruktor-Rumpf mit einem Aufruf super().2.15-5: Klassenhierarchie des Programms Kunden. welcher Konstruktor aufgerufen wird. Firmenadresse. super (ArgumentListopt). Dies ist im Konstruktor-Rumpf wie folgt möglich: Syntax ConstructorBody: {ExplicitConstructorInvocationopt BlockStatementsopt} ExplicitConstructorInvocation: this (ArgumentListopt). dann setzt der Compiler implizit voraus. Dies ist ein Aufruf des parameterlosen Konstruktors seiner direkten Oberklasse. gefolgt von einer geklammerten aktuellen Parameterliste. } public class Kunde extends Geschaeftspartner { protected int Auftragssumme = 0. Genaugenommen sehen die Konstruktoren in dem Beispiel folgendermaßen aus: public abstract class Geschaeftspartner { protected String Firmenname. 2. // Konstruktor public Kunde (String Firmenname) { 327 this super .. gefolgt von einer geklammerten Argumentliste. // Automatisch ergänzter. } . Anhand dieser Argumentliste wird entschieden. voreingestellter Konstruktor public Geschaeftspartner () { super(). s Die erste Anweisung eines Konstruktor-Rumpfs kann ein expliziter Aufruf eines anderen Konstruktors derselben Klasse sein. s Beginnt ein Konstruktor-Rumpf nicht mit dem expliziten Aufruf eines Konstruktors.und Lieferantenverwaltung tor von den direkten Unterklassen aus aufzurufen.2 Java-Beispiel für die Vererbung LE 9 Abb.15. Der Aufruf beginnt mit this..

Steele 97.h.. d. Dieser Konstruktor wird ohne Auswirkungen ausgeführt und kehrt zurück.und Klassenattributen von Object aufgerufen. Da kein solcher Konstruktor in Object deklariert ist. In den Deklarationen von Firmenname und Firmenadresse gibt es keine Initialisierungsausdrücke. Dann wird der Rumpf des parameterlosen Konstruktors von Object ausgeführt. Beim Erzeugen eines Kundenobjekts einKunde = new Kunde ("Software & More") läuft folgendes ab: 1 Zuerst wird Speicherplatz für das neue Objekt bereitgestellt. daß der Konstruktor der Wurzelklasse Object aufgerufen wird. c Als nächstes werden alle Initialisierer von Objekt. hier 0 für Auftragssumme sowie die leere Zeichenkette für Firmenname und Firmenadresse. neue Exemplare angelegt. 8 Als nächstes wird der Initialisierer für Auftragssumme ausgeführt und die Variable auf Null gesetzt. Dies führt dazu. Dieser Prozeß kann durch einen expliziten Konstruktoraufruf gesteuert werden. Da dort keine weiteren Anweisungen stehen./ Auf der CD-ROM 1 befindet sich eine interaktive Animation zu diesen Abläufen. Dann wird der Rumpf des Konstruktors Geschaeftspartner() hinter super() ausgeführt. 6 Dadurch wird jeweils mindestens ein Konstruktor für jede Oberklasse aufgerufen. Kunde("Software & More"). // Aufruf der geerbten Operation set Firmenname(Firmenname) } . 328 . die in der Klasse und ihren Oberklassen deklariert sind.h. Firmenadresse und Auftragssumme. 4 Dannach wird die Parameterliste des Konstruktors von links nach rechts ausgewertet. 2 Im neuen Objekt werden für alle Attribute. d. erfolgen keine Aktionen. S. 5 Anschließend wird der Konstruktor der Klasse aufgerufen. Joy.LE 9 2. so daß hier keine Aktionen ausgeführt werden. 221 ff.15 Dann die Praxis: Vererbung in Java //impliziter Aufruf von super(). stellt der Übersetzer Object(){} zur Verfügung. 3 Alle diese Attribute werden auf ihre voreingestellten Werte initialisiert. } Literaturhinweis: /Gosling. a Der Konstruktor Kunde beginnt nicht mit einem Aufruf eines anderen Konstruktors. Daher wird automatisch ein voreingestellter Konstruktor der Form Kunde() {super().} durch den Java-Compiler zur Verfügung gestellt.. 7 Jetzt werden alle Initialisierer für die Objektattribute der Klasse Geschaeftspartner ausgeführt. für Firmenname. b Im Konstruktor der Klasse Geschaeftspartner wird ebenfalls super() aufgerufen. Es wird daher der parameterlose Konstruktor für Geschaeftspartner aufgerufen.

Damit ist die Erzeugung des Kundenobjekts abgeschlossen.getClass(). Da das Referenz-Attribut auch auf alle Unterklassen-Objekte von Geschaeftspartner verweisen kann.Abschnitt 2. wenn auf ein gleichnamiges Attribut der eigenen Klasse zugegriffen werden soll. Wurde ein Kunde erfaßt.Direktzugriff but Firmenname zugegriffen.15. analog wie this.11. In der Klasse Lieferant wird im Konstruktor direkt auf das Attri. weil das Attribut auf Oberklassenprotected und nicht private ist.getName(). 329 . Auf der Parameterliste wird eine Referenz auf das aktuelle Objekt übergeben.h. der Teil nach super(). Dies ist nur möglich. wird zur Laufzeit immer auf das richtige Objekt zugegriffen. Dies geschieht durch die Anweisung MerkeText = einGeschaeftspartner. muß in der Operation anzeigen noch festgestellt werden.2 Java-Beispiel für die Vererbung LE 9 9 Abschließend wird der Rest des Rumpfs des Konstruktors Kunde ausgeführt. // Konstruktor public Kunde (String Firmenname) { // expliziter Aufruf des Oberklassen-Konstruktors super(Firmenname). die ebenfalls angezeigt werden sollen. Für beide Fälle wird nur eine Hilfsoperation benötigt. Da der Firmenname identisch mit attribute dem Parameternamen ist. d. Wurde ein Lieferant erfaßt. dann sollen die Kundendaten ausgegeben werden. die das Attribut Firmenname mit dem Wert "Software & More" belegt. Das Referenz-Attribut auf der Parameterliste ist vom Typ Geschaeftspartner. dann sollen die Lieferantendaten ausgegeben werden.Firmenname = Firmenname. Alternativ ist auch folgende Lösung möglich: public abstract class Geschaeftspartner { protected String Firmenname. und wird anschließend der Druckknopf »Anzeigen« gedrückt. zu welcher Klasse das Objekt gehört. } } public class Kunde extends Geschaeftspartner { protected int Auftragssumme = 0. 10 Es wird die Referenz auf das neu erzeugte Objekt als Ergebnis zurückgegeben. public Firma (String Firmenname) { this. Firmenadresse. } } In der Klasse KundeLieferantGUI gibt es eine Hilfsoperation Polymorphismus anzeigen(Geschaeftspartner einGeschaeftspartner). Da jedes Unterklassen-Objekt gegenüber der Oberklasse zusätzli. muß vor Firmenname das Schlüsselwort super gesetzt werden.7 che Attribute besitzt.2. Es wird die Operation setFirmenname ("Software & More") aufgerufen.

3 Java-Beispiel für das Überschreiben und Verbergen Das in den Abschnitten 2. float ersteZahlung) { this.LE 9 Zugriff über Operationen auf Oberklassenattribute 2.4 beschriebene Beispiel »Konto« sieht in Java folgendermaßen aus: Beispiel /* Programmname: Konto und Sparkonto * Fachkonzept-Klasse: Konto * Aufgabe: Verwalten von Konten */ public class Konto { //Attribute protected int Kontonr.0. buchen (ersteZahlung). protected float Kontostand. float ersteZahlung) { //Anwendung des Konstruktors der Oberklasse super (Kontonr.15.14. } } /* Programmname: Konto und Sparkonto * Fachkonzept-Klasse: Sparkonto * Aufgabe: Verwalten von Sparkonten * Restriktion: Sparkonten dürfen nicht negativ werden */ public class Sparkonto extends Konto { // Konstruktor public Sparkonto(int Kontonr.0f). } //Lesende Operationen public float getKontostand () { return Kontostand. } //Schreibende Operationen public void buchen (float Betrag) { Kontostand = Kontostand + Betrag.14. In diesem Fall könnte Firmenname auch als private deklariert werden.3 und 2.15 Dann die Praxis: Vererbung in Java In der Klasse Kunde wird über die Operation setFirmenname der Oberklasse indirekt auf Firmenname zugegriffen. // Konstruktor public Konto(int Kontonr. 2.Kontonr = Kontonr. } 330 . Kontostand = ersteZahlung.

2. public class KontoGUI extends Applet { //Attribute //Konten deklarieren private Konto einKonto..15.. //}} public void init() { .awt. //Operation buchen der Oberklasse aufrufen } } /* Programmname: Konto und Sparkonto * GUI-Klasse: KontoGUI * Aufgabe: Konten verwalten * Eingabe von Beträgen und Kontoart * Ausgabe des aktuellen Kontostands */ import java. float Zahlung) { einObjekt.awt.2 Java-Beispiel für die Vererbung //Redefinierte Operation public void buchen (float Betrag) { //geerbte Operation getKontostand der Oberklasse if (getKontostand() + Betrag >= 0) super. ob ein Objekt //der Klasse Konto oder ein Objekt der Klasse Sparkonto //eine Botschaft erhält void einausZahlungenInBar(Konto einObjekt. import java.*.*. import java.buchen(Zahlung). private Sparkonto einSparkonto.event. //{{DECLARE_CONTROLS . private float Zahl. private String eineZahlAlsText..applet..buchen(Betrag). } //Anwendung des Polymorphismus //Zur Übersetzungszeit ist nicht bekannt. } LE 9 331 .*.

floatValue().15-6 zeigt die Benutzungsoberfläche von »Konto und Sparkonto verwalten«. getKontostand())). dann stellt man folgende Besonderheiten fest: 332 .0f).LE 9 2 Grundlagen der Programmierung //Innere Klasse class AktionsAbhoerer implements ActionListener { public void actionPerformed(ActionEvent event) { meldungenTextfeld.getText(). } catch(NumberFormatException x) { meldungenTextfeld. repaint().toString (einSparkonto. 2. kontoTextfeld. sparkontoTextfeld.setText("Fehler: Betrag muß eine Zahl sein!").0f). Zahl). return. } void aendereSparkonto(float Zahl) { if(einSparkonto == null) //Objekt wurde noch nicht erzeugt einSparkonto = new Sparkonto (2.setText(""). repaint(). }//Ende actionPerformed }//Ende innere Klasse void aendereKonto(float Zahl) { if(einKonto == null) //Objekt wurde noch nicht erzeugt einKonto = new Konto (1. 0. try { f = Float.getKontostand())). Betrachtet man dieses Beispiel genauer. else if (object == sparkontoDruckknopf) aendereSparkonto(Zahl).toString(einKonto.setText(Float. einausZahlungenInBar(einSparkonto. 0. Float f. //Objekt erzeugen einausZahlungenInBar(einKonto.valueOf(Merke).setText(Float. Zahl).getSource(). } Zahl = f. repaint(). //Auswertung des Ereignisses Object object = event. //lokales Attribut //Inhalt des Textfeldes in eine Zahl umwandeln String Merke = betragTextfeld. } }//Ende KontoGUI Die Abb. if(object == kontoDruckknopf) aendereKonto(Zahl).

s Besitzt ein Parameter einer Operation denselben Namen wie ein Attribut der Klasse... Bezogen auf das Überschreiben und Verbergen gilt: s Konstruktordeklarationen werden niemals vererbt und sind da. ob der Kontostand anschließend positiv ist. Anschließend wird die redefinierte Operation buchen(erste Zahlung) aufgerufen. 2. Der Aufruf super(Kontonr. da bei einer negativen ersten Zahlung ein negativer Betrag auf dem Sparkonto wäre. wenn ein Ausdruck zum Operationen super Aufruf der Operation das Schlüsselwort super enthält. das Schlüsselwort this gesetzt werden. dann verdeckt der Parameter das in der Klasse deklarierte Attribut. public void setFirmenname(String Firmenname) { this.0f) steht. ersteZahlung) im Konstruktor wäre falsch. } . 0. muß vor den Attributnamen.2. float ersteZahlung) . s Auf eine überschriebene bzw. } Beispiel 333 . wird die Operation buchen der Oberklasse mit super.Firmenname = Firmenname.15-6: Die Benutzungsoberfläche der Kontound Sparkontoverwaltung Die Unterklasse Sparkonto besitzt einen Konstruktor Sparkonto (int Kontonr. getrennt durch einen Punkt. Nach der Überprüfung.buchen(Betrag) aufgerufen.2 Java-Beispiel für die Vererbung LE 9 Abb. in dem die Anweisung super (Kontonr. float ersteZahlung) der Oberklasse Konto mit den entsprechenden aktuellen Parametern aufgerufen wird. this class Firma { String Firmenname. daß der Konstruktor Konto(int Kontonr. Um dennoch auf das Attribut zugreifen zu können. redefinierte Operation der direkten Oberklasse kann zugegriffen werden.nicht vererbt her nicht am Verbergen oder Überschreiben beteiligt. Diese Anweisung bewirkt.15.

In der Regel sollten es jedoch mindestens zwei konkrete Unterklassen geben. wenn logisch zusammengehörende.1). s Klassen ohne Attribute n Sinnvoll. n Abstrakte Klassen können Unterklassen abstrakter Klassen sein. Fehler aufgrund von Namensgleichheiten werden reduziert.LE 9 Programmierregel 2. da dann die Notwendigkeit entfällt. gesetzt werden. Im folgenden werden diese Sonderfälle kurz skizziert: s Abstrakte Klassen n Abstrakte Klassen sind nur sinnvoll. n Eine abstrakte Klasse ist nur sinnvoll.15-2). die Daten von Textfeldern und Textbereichen einlesen. n In der UML-Notation gehören zu jedem Attribut automatisch eine get. wenn sie mindestens eine konkrete Unterklasse besitzt.}} n Enthält in Java eine Klasse einen Konstruktor. ein Objekt der Klasse zu erzeugen.2. Component und Container sind in Java abstrakte Klassen (Abb. sind auch keine Attribute als »Gedächtnis« erforderlich. die Spezialisierungen aber aus Operationen bestehen. Zu prüfen ist. 2.15. dann wird kein voreingestellter Konstruktor hinzugefügt. wenn sie in einer Vererbungshierarchie oben stehen.15 Dann die Praxis: Vererbung in Java Bezieht man sich im Rumpf einer Operation auf ein Attribut der Klasse. Die Attribute müssen dann aber als protected spezifiziert sein.17. aber voneinander unabhängige Operationen zu einer Klasse zusammengefaßt werden.4 Sonderfälle Durch die Möglichkeit der Vererbung gibt es eine Reihe von Sonderfällen. 2. s Klassen ohne Konstruktoren n In Java erlaubt. Klassen ohne Operationen Sinnvoll. Beispiel Die Klassen Object. dann sollte vor das Attribut immer this. die manchmal sinnvoll sind. n Java 334 . Dadurch wird deutlich. damit von Unterklassen zugegriffen werden kann. Da sie untereinander keine Daten austauschen müssen.und eine set-Operation. allerdings wird dann ein voreingestellter Konstruktor vom Compiler unsichtbar eingefügt: class A{A(){super(). ob die Operationen in solchen Klassen als Klassenoperationen deklariert werden. s n UML Java Beispiel Operationen. werden in einer Klasse Eingabe zusammengefaßt (siehe Abschnitt 2. n In Java ist dies nicht vorgeschrieben. in andere Typen umwandeln und überprüfen. daß das Attribut der Klasse gemeint ist. wenn die Gemeinsamkeiten aus Attributen.

zusammengefaßt nach logischen Gesichtspunkten. die die gemeinsamen Attribute und Operationen all ihrer →Unterklassen besitzen. Methodisches Mittel zur Bildung von Generalisierungen (→Generalierungs-/Spezialisierungshierarchie). Jedes Empfängerobjekt reagiert mit der Ausführung einer eigenen Operation. wenn allgemeine Attribute und Operationen. die Objekte verschiedener Klassen bezeichnen können. dem →Überschreiben und dem »späten Binden« können Operationen mit Objektreferenzen geschrieben werden. wo sie die Gemeinsamkeiten von einer Gruppe von →Unterklassen definiert. Generalisierungs-/Spezialisierungshierarchie Entsteht durch das Bilden von →Oberklassen. In Verbindung mit der →Vererbung. s n Klassen. Drucken eines Textes und Drucken einer Grafik. da es diesen Konstruktor nicht gibt! s n Klassen nur mit Klassenattributen und/oder Klassenoperationen Sinnvoll. Java daß von einer Klasse Unterklassen abgeleitet werden. wenn verhindert werden soll. Werden gleichnamige Attribute oder Operationen von verschiedenen Oberklassen geerbt. Die Attribute und Operationen der Oberklassen werden an die Unterklassen vererbt (→Vererbung). im Gegensatz zu einer Klasse. z. können von einer abstrakten Klasse keine Objekte erzeugt werden. Daraus ergibt sich eine Baumhierarchie (siehe auch →Mehrfachvererbung).B. daß vererbte Operationen redefiniert werden. dann muß der Namenskonflikt gelöst werden (siehe auch: →Einfachvererbung). die durch eine gemeinsame Oberklasse miteinander in Beziehung stehen. zur Verfügung gestellt werden sollen. Oberklasse Enthält die gemeinsamen Attribute und Operationen ihrer →Unterklassen (→Vererbung). Sinnvoll. Einfachvererbung Jede Klasse besitzt maximal eine direkte →Oberklasse. Beispiel Abstrakte Klasse Spielt eine wichtige Rolle in Vererbungsstrukturen (→Vererbung). Dies kann zu unterschiedlichen Ergebnissen führen. Die Klasse Math in Java stellt wichtige mathematische Funktionen Beispiel sowie einige Konstanten (e. Polymorphismus Dieselbe Botschaft kann an Objekte verschiedener Klassen gesendet werden. π) zur Verfügung.Glossar class Kunde { String Name. Mehrfachvererbung Jede Klasse kann mehr als eine direkte Oberklasse besitzen. Kunde(String Firmenname) { Name = Firmenname. Die Klassen Math und String in Java erlauben keine Unterklassen. Klassenhierarchie →Vererbung. Die Operation wird während der Laufzeit auf das Objekt angewandt. die keine Unterklassen erlauben In Java kann durch das Schlüsselwort final verhindert werden. auf das die Objektreferenz 335 . Kunde() aufzurufen. } } LE 9 Beispiel Es ist in diesem Beispiel nicht möglich.

Operation. Ein Zugriff auf das »verdeckte« Attribut ist nur über eine besondere Notation möglich (in Java →super) (→Überschreiben). überschriebenen Operationen zugegriffen werden. wenn jede Unterklasse nur eine direkte Oberklasse besitzt.LE 9 Glossar/Zusammenhänge zeigt. Unterklasse Erbt alle →Attribute und →Operationen der zugeordneten Oberklasse(n) (→Einfachvererbung. + Die Änderbarkeit wird unterstützt. auf überschriebene Operationen und verborgene Attribute in Oberklassen zuzugreifen. Das Geheimnisprinzip bedeutet. Das Konzept der Vererbung besitzt folgende Vorteile: + Aufbauend auf existierenden Klassen können mit wenig Aufwand neue Klassen erstellt werden. Durch eine spezielle Notation. Ein Aufruf der »verdeckten« Operation ist nur über eine besondere Notation möglich (in Java: →super) (→Verbergen). Dadurch wird das geerbte Attribut »verdeckt«. Methodisches Mittel zur Bildung von Spezialisierungen. Besitzt zusätzlich eigene Attribute und Operationen. Abnous 90/: »Ein 336 . wenn die Oberklasse um weitere Unterklassen ergänzt wird. Beispielsweise wirkt sich die Änderung des Attributs Adresse automatisch auf alle Unterklassen der Klassenhierarchie aus. Dadurch wird die geerbte Operation »verdeckt« und kann neu definiert und implementiert werden.Das Konzept der Vererbung steht jedoch im Widerspruch zum Geheimnisprinzip. Attribut. Es entsteht eine Klassenhierarchie bzw. Eine Einfachvererbung liegt vor. Oberklassen sind oft abstrakte Klassen. Überschreiben →Unterklasse enthält eine Operation mit gleichem Namen wie eine geerbte Operation. Redefinieren →Überschreiben. Man unterscheidet die →Einfachvererbung und die →Mehrfachvererbung. this Erlaubt es in Java. sonst handelt es sich um eine Mehrfachvererbung. einen überladenen Konstruktor der eigenen Klasse aufzurufen bzw. das denselben Namen wie ein Operationsparameter hat. Vererbung Attribute und Operationen einer →Oberklasse werden an die zugehörigen →Unterklassen vererbt. super Erlaubt es in Java. geerbte Operationen durch gleichnamige überschrieben bzw. Vererbung super Vorteile Geheimnisprinzip verletzt Neben den Konzepten Objekt. von denen keine Objekte erzeugt werden können. Eine solche Operation muß nicht geändert werden. Generalisierungs-/Spezialisierungshierarchie. . Klasse und Botschaft basiert die objektorientierte Programmierung noch auf zwei weiteren wichtigen Konzepten: s Durch die Vererbung werden Attribute und Operationen an alle Unterklassen einer Oberklasse weitergegeben. redefiniert. kann auf die verborgenen Attribute bzw. Barbara Liskov hat den Konflikt zwischen der Verkapselung und der Vererbung sehr elegant beschrieben /Khoshafian. daß keine Klasse die Attribute einer anderen Klasse sieht. Verbergen →Unterklasse enthält ein Attribut mit gleichem Namen wie ein geerbtes Attribut. Geerbte Attribute werden durch gleichnamige Attribute der Unterklasse verborgen. auf ein Attribut zuzugreifen. in Java durch das Schlüsselwort super . →Mehrfachvererbung).

Generalisierung/ scheidend.. s Der Polymorphismus erlaubt es. muß – bei Namensgleichheit mit Parametern – auf das Attribut mit this. Für die Wartbarkeit des entstehenden Softwaresystems ist ent. /Gosling. Erst beim Aufruf der Operation liegt fest. Abnous 90/ Khoshafian S. Falls die Oberklasse neu implementiert werden muß. 1990 Zitierte Literatur 337 . Um in einer Operation auf Attribute der Klasse zuzugreifen. Heidelberg: Spektrum Akademischer Verlag 1999 /Horstmann. Languages. Aus der Perspektive der Spezialisierung kann man auch sagen. New York: John Wiley & Sons. Steele 97/ Gosling J. Durch dieses Konzept kann man flexible und leicht änderbare Programme entwickeln. this Attribut zugegriffen werden. Cornell G. daß sie das Prinzip der Verkapselung auf das Äußerste strapazieren . es ist eine »ist ein« (is a) oder »ist eine Art von« (is a kind of) Hierarchie.und Nachteile sind bezogen auf zukünftige Weiterentwicklungen des Programms und die Verständlichkeit kritisch abzuwägen. »Geschäftspartner« bildet den Oberbegriff für Kunden und Lieferanten. die einen Parameter vom Typ der Oberklasse enthält..Zusammenhänge/Literatur LE 9 Problem fast aller Vererbungsmechanismen ist.als auch die Unterklasse betrachten.. auf welches Objekt welcher Klasse die Operation angewandt werden soll. 2. Java – die Sprachspezifikation. Object Orientation Concepts.. Die Vor.. gleiche Botschaften an Objekte Polymorphismus unterschiedlicher Klassen zu senden. Lehrbuch der Objektmodellierung – Analyse und Entwurf. Steele G. Um die Unterklassen zu verstehen. verlieren wir die Vorteile der Lokalität . S. Schreibt man eine Operation. User Interfaces.. Bonn: AddisonWesley-Verlag 1997 /Heide Balzert 99/ Balzert Heide.15-7 zusammengestellt. müssen wir sowohl die Ober.. Das Ziel der Programmierung kann auf keinen Fall ein möglichst hoher Grad an Vererbung sein.. Wenn die Datenkapsel verletzt ist. Joy B.. Abnous R. Das ist immer dann der Fall. Die bei der Aufstellung einer Vererbungshierarchie zu berücksichtigenden Gesichtspunkte sind in Abb.. daß das Konzept der Vererbung sinnvoll eingesetzt Spezialisierung wird. Dasselbe gilt für den Zugriff auf überladene Konstruktoren der eigenen Klasse von innerhalb eines Konstruktors: this(Parameter). Databases. die Unterklasse eine Spezialisierung der Oberklasse darstellt. dann kann während der Laufzeit dort auch ein Objekt einer Unterklasse stehen. Cornell 99/ Horstmann C. Beispielsweise kann man sagen: Kunden und Lieferanten sind spezielle Geschäftspartner. Joy. core Java – Volume I – Fundamentals. Palo Alto: Sun Microsystems Press 1999 /Khoshafian. dann müssen wir eventuell auch ihre Unterklassen neu implementieren«. wenn die Oberklasse eine Generalisierung der Unterklasse bzw.

338 . n Polymorphismus anstelle von Typinformation benutzen. Sie sollen Klassifizierungen aufzeigen. else if(x is of type 2) action2(x). Beispiel: Kunde – Lieferant – Geschäftspartner. wenn eine Unterklasse zu den geerbten Attributen und Operationen nur eigene Attribute und Operationen hinzufügt. Ein Ferientag ist zwar ein Tag. Es reicht also nicht aus.h. Vererbungsstrukturen können durch Generalisierung oder Spezialisierung ermittelt werden. S. angewandt auf ein Unterklassenobjekt. 2. 222f/ n s n n n Diese Beziehung ist transitiv. //Mit Polymorphismus x. Cornell 99.LE 9 Zusammenhänge Abb. aus einem Ferientag einen Nicht-Ferientag machen. Daher ist dies keine geeignete Operation für Ferientag. Beispiel: //Mit Typinformation if(x is of type 1) action1(x). Beispiel: Kunden und Lieferanten sind spezielle Geschäftspartner. jedes Objekt der Unterklasse belegt die geerbten Attribute mit Werten und kann entsprechende Verbindungen besitzen. Bei der Generalisierung wird geprüft. »Gute« Vererbungsstrukturen erfüllen folgende Kriterien: Aus der Perspektive der Spezialisierung kann man sagen. Bei der Spezialisierung wird von den allgemeinen Klassen ausgegangen und nach spezialisierten Klassen gesucht. Beispiel: Ist eine Klasse Ferientag Unterklasse von Tag und besitzt Tag die Operation naechsterTag. Jede Unterklasse soll die geerbten Operationen semantisch sinnvoll anwenden können. Beispiel: Konto – Sparkonto. Quellen: /Heide Balzert 99/.action(). um eine neue Oberklasse zu bilden. Jede Unterklasse soll die geerbten Attribute und Assoziationen der Oberklasse auch benötigen. /Horstmann. es ist eine »ist ein« (is a)– oder »ist eine Art von« (is a kind of)–Hierarchie. aber kein Objekt der Klasse Tag.15-7: Kriterien für eine »gute« Vererbungsstruktur s s n Vererbungsstrukturen sollen Zusammenhänge und Unterschiede von Klassen deutlich machen. ob zwei oder mehrere Klassen genügend Gemeinsamkeiten besitzen. d. dann kann diese Operation.

Unterklasse. Verbergen.. Klassenattribut.. static void ObjektHinzufuegen(GObjekt Objekt) { // . Einfachvererbung. Objektattribut.. abstract void Zeichnen(). Überschreiben. Mehrfachvererbung.. Gegeben seien die nachfolgenden Java-Klassen: abstract class GObjekt { static int ObjektAnzahl = 0. void Zeichnen() { // . Die Konzepte Klassenattribut – Objektattribut und Klassenoperation – Objektoperation unterscheiden können.... } } public class GEllipse extends GObjekt { protected int PosX. Klassenoperation und Objektoperation. protected int PosY. abstrakte Klasse. } } public class GRechteck extends GObjekt { void Zeichnen() { // . } } public class GKreis extends GEllipse { void Zeichnen() { // . Polymorphismus.Aufgaben 1 Lernziele: Die Begriffe Oberklasse. Unterklasse. 339 Muß-Aufgabe 30 Minuten . protected int PosY. } } LE 9 Analytische Aufgaben Muß-Aufgabe 30 Minuten Verdeutlichen Sie (wenn möglich) an diesem Beispiel die Begriffe Oberklasse. abstrakte Klasse. Zeichnen Sie in UML-Notation ein Klassendiagramm des Java-Beispiels aus Aufgabe 1.. Einfachvererbung. protected int PosX. } static void ObjektEntfernen(GObjekt Objekt) { // . Verbergen und Polymorphismus erklären können.. 2 Lernziel: Die UML-Notation beim Zeichnen von Klassen-Diagrammen verwenden können. Mehrfachvererbung. Überschreiben..

awt die Deklarationen der Klassen Object. Polymorphismus. wenn Sie einige Beispiele aufzeigen. In Java-Programmen die Konzepte Vererbung. Klassenattribute und -operationen problemgerecht einsetzen können.15-A1: Oberfläche für die erweiterte Kontoverwaltung Muß-Aufgabe 30 Minuten 5 Lernziele: Die beim Vererben. 4 Lernziel: In Java-Programmen die Konzepte Vererbung. Diese soll hier (der Einfachheit halber) nur die Zinsen für ein Jahr auf das derzeitige Guthaben (Zinsen = Zinssatz * Guthaben / 100) dem Konto gutschreiben. Bei Klassen mit extrem vielen Operationen genügt es.2 um eine Klasse Sparvertrag . Erweitern Sie das Kontobeispiel aus Aufgabe 4 nun um folgende Funktionalität: Bei jedem Sparkonto sind Auszahlungen nur bis zu einer Höhe von 3000 DM gestattet (Ausnahme: Auflösung durch Abhebung des Gesamtguthabens). Die Attribute können hierbei entfallen. Erstellen Sie hieraus ein Klassendiagramm in UML-Notation. Die grafische Oberfläche sollte in etwa wie in Abb. Window und Dialog. Überschreiben und Verbergen zu berücksichtigenden Regeln – insbesondere in Java – angeben und anwenden können. Component. daß bei Eingaben. Überschreiben. Überschreiben. 2. Konstruktive Aufgaben Muß-Aufgabe 30 Minuten Abb. Verbergen. Container.B. die von Sparkonto erbt. Erweitern Sie das Beispiel Konto so. Klassenattribute und -operationen problemgerecht einsetzen können. Polymorphismus.15. Erweitern Sie das Kontobeispiel aus Abschnitt 2.15-A1 aussehen. Muß-Aufgabe 30 Minuten Weitere Aufgaben finden Sie auf der beiliegenden CD-ROM 1. aus der Programmierumgebung VisualCafe) aus den Paketen java. Verbergen. 340 . Verbergen. 2. Polymorphismus. Außerdem ist eine Auszahlung nur in Höhe des gesamten Guthabens gestattet (= Kontoauflösung). Klassenattribute und -operationen problemgerecht einsetzen können. Checkbox. die zu einem Minus beim Sparkonto führen würden. Besorgen Sie sich (z. eine Fehlermeldung ausgegeben wird. Der Sparvertrag besitzt zusätzlich eine Operation. die eine regelmäßige Sparrate auf das Konto bucht. Übergeben Sie die Meldung mit Hilfe von throw an den Aufrufer.lang und java. 6 Lernziel: In Java-Programmen die Konzepte Vererbung. Überschreiben.LE 9 Muß-Aufgabe 45 Minuten Aufgaben 3 Lernziel: Die UML-Notation beim Zeichnen von Klassen-Diagrammen verwenden können. Außerdem besitzen alle Sparkonten einen festen (gleichen) Zinssatz sowie eine Operation gutschreibenZinsen. Button.

Vererbung und Polymorphismus von Java-Schnittstellen anhand von Beispielen darstellen können. Pakete.1 Schnittstellen 342 Zuerst die Theorie: Schnittstellen in der SoftwareEntwicklung 342 2.15 müssen bekannt sein.2.17 Pakete 352 2.18 Die Java-Ereignisverarbeitung im Detail 359 2.18.17.2 Zugriffsrechte und Sichtbarkeit 357 2.7 Anonyme Klassen 375 341 .16.16.5 Vorgehensweise 363 2. 2. Zugriffsrechte und Sichtbarkeit von Klassen.16 2.16. Java-Schnittstellen problemgerecht bei eigenen Programmen verwenden können.2 Dann die Praxis: Das Java-Schnittstellenkonzept 342 2.18.16.16.18.LE 10 2 Grundlagen der Programmierung – Schnittstellen.16.und qualitätsgerecht bei eigenen Programmen auswählen können.2 Dann die Praxis: Pakete in Java 353 2.7 Schnittstellen und Vererbung 351 2.18.2 bis 2.17. Ereignisse in Java programmieren können.5 Konstanten in Schnittstellen 349 2.17.6 Leere Implementierung von Schnittstellen 349 2. Ereignisse s s s s s s s s s Syntax und Semantik von Java-Schnittstellen anhand von Beispielen erläutern können. Das Java-Paket-Konzept anhand von Beispielen erklären können.16.1 Zuerst die Theorie: Pakete in der SoftwareEntwicklung 352 2.2 Ereignisabhörer 360 2.1 Ereignistypen 359 2.4 Schnittstellen und Polymorphismus 346 2.18.2.4 Registrierung 363 2. Die Ereignisbehandlung in Java im Detail erläutern können.18.18.3 Adapterklassen 361 2.3 Dann die Praxis: Die Java-Syntax und -Semantik für Schnittstellen 345 2.6 Beispiel: Ein einfacher UML-Editor 366 2.17. Vorhandene Java-Pakete importieren und eigene erstellen können.1 Import von Paketen 354 2. verstehen anwenden Die Kapitel 2. Attributen und Operationen problem.

Es werden funktionale Abstraktionen in Form von Operationssignaturen bereitgestellt. dann wird zwischen der Klasse und der Schnittstelle ein gestrichelter Vererbungspfeil gezeichnet. ohne etwas über die Implementierung der Dienstleistungen festzulegen. Die Implementierung der abstrakten Operationen erfolgt durch Java-Klassen. In diesem Buch werden Schnittstellen-Symbole grau dargestellt.16-1: Das Schnittstellenkonzept AufrufendeKlasse «interface» Schnittstelle Aufruf UML-Notation «interface» SchnittstelleA OperationA() KlasseB AttributB OperationB() Schnittstelle wird implementiert von Klasse 1 Klasse1 Schnittstelle wird implementiert von Klasse 2 Klasse2 342 . sie besitzt keine Operationsrümpfe. keine Attribute oder Assoziationen.2 Dann die Praxis: Das Java-Schnittstellenkonzept Java-Schnittstellen erlauben die Deklaration abstrakter Operationen und öffentlicher konstanter Klassenattribute.16. aber nicht das »Wie« festlegen. 2.16 Schnittstellen 2. die das »Was«. Da eine UMLSchnittstelle keine Attribute besitzen kann. In der Regel definieren Schnittstellen Dienstleistungen für Anwender. entfällt der Attributteil. für aufrufende Klassen.h.16 Schnittstellen 2.16. Abb. die keine Attribute und ausschließlich abstrakte Operationen besitzt. In der UML-Notation wird eine Schnittstelle ähnlich wie eine Klasse dargestellt. 2. Eine Schnittstelle ist äquivalent zu einer Klasse. d. Schnittstellen können jedoch in Vererbungsstrukturen verwendet werden.1 Zuerst die Theorie: Schnittstellen in der Software-Entwicklung In der objektorientierten Software-Entwicklung gibt es neben Klassen noch Schnittstellen (interfaces). Anstelle des Klassennamens steht der Schnittstellenname (nicht fett) mit vorangestelltem «interface». Eine Schnittstelle besteht also im allgemeinen nur aus Operationssignaturen.LE 10 2. Werden die abstrakten Operationen einer Schnittstelle von einer Klasse implementiert. Der Begriff wird nicht einheitlich verwendet.h. d.

0. switch (schalter) { case 0: praemie = VSumme * 16.0) / 5000.13. In Abb. Für die aufrufende Klasse ergibt sich dadurch keine Änderung. daß verschiedene Java-Klassen dieselbe Schnittstelle auf unterschiedliche Weise implementieren. VersicherungGUI «interface» VersicherungI Aufruf berechnePraemie (double Versicherungssumme) Abb. Die Versicherungsprämie kann auf zwei verschiedene Arten berechnet werden.16-2 ist das Beispiel Versicherungsprämie aus Abschnitt Beispiel 2. } 343 .2 Dann die Praxis: Das Java-Schnittstellenkonzept LE 10 Dabei ist es möglich. case 1: praemie = VSumme * 12.1. break. ergänze ich den Schnittstellennamen am Ende um ein großes I für Interface.case .Konstrukt int schalter = (int)((VSumme .6 / 1000. 2.4 / 1000. } class Versicherung1 implements VersicherungI { //Implementierung der (abstrakten) Operation mit switch public double berechnePraemie(double VSumme) { // Berechnung double praemie = 0.8 / 1000.2.0. Um Schnittstellen anhand des Schnittstellennamens schnell zu Konvention erkennen. break. default: praemie = VSumme * 8.6 dargestellt.16.0/100. // Lösung mit switch . break.16-2: Beispiel für das Schnittstellenkonzept init() ermittlePraemie() Versicherung1 Versicherung2 berechnePraemie (double VSumme) berechneSonderpraemie (double VSumme) berechnePraemie (double VSumme) Das zugehörige Java-Programm sieht folgendermaßen aus: public interface VersicherungI { //abstrakte Operation public double berechnePraemie(double Versicherungssumme). da die Schnittstelle unverändert bleibt (Abb.0. 2.0.0). 2.16-1).

public class VersicherungGUI extends Applet { VersicherungI eineVersicherung. return (double)Math.. } public void ermittlePraemie() { String MerkeText = summeTextfeld. AktionsAbhoerer einAbhoerer = new AktionsAbhoerer(this).applet.0)) / 100.0.getText().0.0. double VSumme = d. praemieTextfeld. else if(VSumme <= 5000. public void init() { //Es wird die Implementierung der //Klasse Versicherung1 verwendet eineVersicherung = new Versicherung1().doubleValue().addActionListener(einAbhoerer). double Praemie = eineVersicherung.0. ..0..toString(Praemie)).*.floor((double) (praemie * 100.0) praemie = VSumme * 8.floor((double) (praemie * 100. berechneDruckknopf. import java.6 / 1000. } } /*Programmname: Versicherung * GUI-Klasse: VersicherungGUI * Aufgabe: Berechnung von Versicherungsprämien unter * Verwendung einer Schnittstelle (Interface) */ import java. else praemie = VSumme * 12.setText(Double.berechnePraemie(VSumme).0.*.valueOf(MerkeText).LE 10 2..16 Schnittstellen return (double)Math. } } class Versicherung2 implements VersicherungI { //Implementierung der (abstrakten) Operation mit if public double berechnePraemie(double VSumme) { double praemie = 0.awt. Double d = Double.8 / 1000.0)) / 100.0) praemie = VSumme * 16.4 / 1000. //Lösung mit if if(VSumme > 10000. . } } 344 .

Es handelt sich um abstrakte Operationen ohne Implementierung. d. Jede Klasse.lang. import java. Die Attribute müssen mit einem konstanten Wert initialisiert werden. } public void actionPerformed(ActionEvent event) { einGUI. Nach der optionalen Angabe einer Oberklasse werden in einer Klassen-Deklaration die implementierten Schnittstellen angegeben (Abb. die in der Schnittstellen-Definition spezifiziert ist.3 Dann die Praxis: Die Java-Syntax und -Semantik für Schnittstellen /*Programmname: Versicherung * Abhörer-Klasse: AktionsAbhoerer */ import java. 345 . Die Operationen. } } LE 10 2.*.h. müssen als public deklariert werden. dann können eine oder mehrere implements Klassen die Schnittstelle implementieren. Während eine Klasse nur eine direkte Oberklasse besitzen kann (Einfachvererbung).*. Außerdem muß die Typ-Signatur der implementierenden Operation exakt mit der Typ-Signatur übereinstimmen. 2.3 Dann die Praxis: Die Java-Syntax und -Semantik für Schnittstellen Eine Schnittstelle ist ähnlich wie eine Klasse aufgebaut (Abb. interface Wie die Syntax zeigt.stellen erbung zu realisieren.16. die eine Schnittstelle implementieren. die implizit public. haben die deklarierten Operationen keinen Rumpf. muß alle Operationen der Schnittstelle implementieren. sie können durch die implementierende Klasse nicht verändert werden. 2.16. die eine Schnittstelle implementiert.event.awt. final und static sind. public class AktionsAbhoerer implements ActionListener //wird von Java zur Verfügung gestellt { VersicherungGUI einGUI.16-4). Innerhalb der Schnittstellen-Deklaration können konstante Klassenattribute deklariert werden.2. eine Art Mehrfachver.ermittlePraemie(). kann eine Klasse mehrere Schnittstellen imple. Dadurch ist es in Java möglich.mehrere Schnittmentieren. //Konstrukteur AktionsAbhoerer(VersicherungGUI einVersicherungsGUI) { einGUI = einVersicherungsGUI.16-3). Ist eine Schnittstelle deklariert.

2. d. Ihr Rumpf wird immer durch ein Semikolon. 2.16. 346 ( Throws . } ConstantDeclaration KonstantenDeklaration AbstractMethodDeclaration Abstrakte Operations-Deklaration Jede abstrakte Operations-Deklaration ist implizit abstract und public. Type void Identifier ( FormalParameterList Abb. . es handelt sich um konstante. eigene zusätzliche Operationen definieren. öffentliche Klassenattribute. //Klasse VersicherungGUI VersicherungI eineVersicherung. Type Identifier VariableDeclaratorId [] = Expression ArrayInitializer . nicht durch einen Block dargestellt. static und final.LE 10 2. können auch Variablen vom Schnittstellentyp deklariert werden. die Schnittstellen implementieren.16 Schnittstellen InterfaceDeclaration Schnittstellen-Deklaration interface Identifier extends InterfaceTyp InterfaceBody public InterfaceBody { ConstantDeclaration AbstractMethodDeclaration Jede deklarierte Konstante ist implizit public. Jede Konstante muß initialisiert werden. .4 Schnittstellen und Polymorphismus Referenzen auf Schnittstellen Beispiel Analog wie Referenzen auf Objekte gesetzt werden können. Im Beispiel Versicherung könnte die Klasse Versicherung1 eine weitere Operation berechneSonderpraemie definieren.16-3: Java-Syntax für Schnittstellen Es ist erlaubt und üblich.h. daß Klassen.

{ eineVersicherung = new Versicherung1(). Dadurch können Klassen später erstellt werden. Beispielsweise kann die Variable eineVersicherung eine Referenz auf Objekte der Klassen Versicherung1 und Versicherung2 enthalten. Die aufrufende Klasse kann den Aufruf über die Schnittstelle senden. . auf deren Objekt zur Laufzeit die Referenz zeigt.16.. Wird eine Operation über die Referenz dieser Variablen aufgerufen. d. .2. } Beispiel 347 .. public void init(). Die Operation. als der Code. die ausgeführt wird. 2.h. sie kann eine Referenz auf jedes Objekt enthalten. Dies ist eine wichtige Eigenschaft von Schnittstellen. Dies ist vergleichbar mit der Benutzung einer Oberklassen-Referenz.. Abb. um auf ein Unterklassen-Objekt zuzugreifen. wird während der Laufzeit dynamisch ausgewählt. deren Klasse die deklarierte Schnittstelle implementiert. der die Operationen dieser Klassen aufruft. dann wird die Operation aufgerufen.16-4: Java-Syntax für Klassen mit Schnittstellen Die Variable eineVersicherung besitzt den Schnittstellentyp VersicherungI.4 Schnittstellen und Polymorphismus LE 10 ClassDeclaration Klassen-Deklaration class Identifier Super Interfaces ClassBody public abstract final Interfaces implements InterfaceType . ohne irgendetwas über die gerufene Klasse zu wissen.. //Klasse VersicherungGUI VersicherungI eineVersicherung.

Beispiele Die Benutzungsoberfläche soll in zwei unterschiedlichen Landessprachen. z. public void init() { //Referenz auf Schnittstelle VersicherungI eineVersicherung = new Versicherung1(). 348 . auf das eineVersicherung zur Laufzeit referenziert. die in der Schnittstelle deklariert sind.. //In Abhängigkeit z. von einer Benutzereingabe eineVersicherung = weitereVersicherung. Dazu reicht es aus. Durch eine Benutzereingabe soll während der Laufzeit die Sprache eingestellt werden können.. vom Typ des Objekts bestimmt wird. Die folgenden Beispiele zeigen Einsatzmöglichkeiten der Polymorphie. //Aufruf der Schnittstelle double Praemie = eineVersicherung.. die Referenz auf ein Objekt einer anderen Implementierungsklasse zu setzen.. Deutsch und Englisch. Ein Schnittstellen-Referenz-Attribut kennt nur die Operationen. Obwohl eineVersicherung auf die Operation berechnePraemie zugreifen kann.. angezeigt werden.. //eineVersicherung zeigt nun auf ein Objekt von //Versicherung2 . Analog könnte vom Benutzer auch auf ein anderes Oberflächenlayout umgeschaltet werden. //Referenz auf Versicherung2 Versicherung2 weitereVersicherung = new Versicherung2()..B. Die polymorphe Mächtigkeit einer solchen Referenz zeigt folgendes Beispiel: //Klasse VersicherungGUI ..16 Schnittstellen public void ermittlePraemie() { . } public void ermittlePraemie() { //Praemie wird mit Algorithmus von Versicherung2 //berechnet double Praemie = eineVersicherung. } Polymorphie Beispiel Das Beispiel zeigt. die aufgerufen wird. ..B.berechnePraemie(Vsumme).LE 10 2. daß die Versicherungsversion.berechnePraemie(VSumme). } Die Variable eineVersicherung ist vom Schnittstellentyp VersicherungI. ist ein Zugriff auf andere Operationen von Versicherung1 nicht möglich. . Ihr wurde ein Objekt von Versicherung1 zugewiesen..

Konstanten in gestellt werden. Dies ist vergleichbar mit »header«-Dateien in C++.. } Beispiel Innerhalb jeder Klasse. final int X_SVGA = 800. Es spielt jedoch keine Rolle.6 Leere Implementierung von Schnittstellen LE 10 Wenn eine Klasse die Operationen einer Schnittstelle nicht vollständig implementiert. um eine Anzahl von Konstanten zu erzeugen.. 2. Folgende Implementierung ist erlaubt: class Versicherung3 implements VersicherungI { public double berechnePraemie (double Vsumme) {return 0. Y_VGA). if(Bildschirmformat = VGA) setSize (X_VGA.16. Bei der Ereignisverarbeitung in Java Beispiel Ereignissind die Ereignisabhörer (event listener) Schnittstellen. Wenn eine Schnittstelle keine Operationen besitzt. Y_VGA = 400. interface Bildschirmformate { final int X_VGA = 640.16. werden die Konstanten so behandelt. Damit ein verarbeitung 349 . als wären sie in jeder Klasse selbst definiert oder von einer Oberklasse geerbt. final int X_XGA = 1024.6 Leere Implementierung von Schnittstellen Wenn eine Klasse eine Schnittstelle implementiert. nichts implementiert. dann muß die Klasse als abstrakte Klasse deklariert werden. dann wird von der Klasse. } class Fenster implements Bildschirmformate { . Y_SVGA = 600.2. ob die Klasse den Operationen der Schnittstelle tatsächlich eine Funktionalität verleiht oder sie einfach leer implementiert.. Es han.16. else . daß diese überall gleich verwendet werden. Solche Konstanten werden in Java mit Großbuchstaben und durch Unterstriche getrennt geschrieben (allgemeine Programmierkonvention). Y_XGA = 768. dann muß sie alle ihre Operationen implementieren.. als ob die Klasse Konstanten in den Gültigkeitsbereich der Klasse importiert. 2. die Bildschirmformate enthält.5 Konstanten in Schnittstellen Durch die Deklaration von Konstanten in Schnittstellen kann sicher.Schnittstellen delt sich um öffentliche. konstante Klassenattribute.0} } Beispiel Dieses Beispiel wirkt künstlich. Es ist. die die Schnittstelle enthält.

. wird in der Klasse TastaturAbhoerer nur diese Operation mit Funktionalität implementiert. bei der sich das Objekt registriert hat. Um sicherzustellen. Wird die Taste Esc (Escape) gedrückt. aufgerufen werden können. public void keyPressed (KeyEvent event) { if (event. die als Oberschnittstelle EventListener enthält. 2.16 Schnittstellen Objekt Botschaften über eingetretene Ereignisse empfangen kann.16-5 zeigt das Klassendiagramm. Java stellt für Tastatur-Ereignisse die Schnittstelle KeyListener zur Verfügung.LE 10 2. Beispiel Ein Programm öffnet nach dem Start auf dem Bildschirm ein Fenster..16-5 Beispiel für die Implementierung von Schnittstellen addKeyListener() «interface» KeyListener public void keyPressed (KeyEvent event) public void keyReleased (KeyEvent event) public void keyTyped (KeyEvent event) TastaturAbhoerer Da nur auf das Ereignis keyPressed eine Aktion erfolgen soll. daß diese Operationen vorhanden sind. die von der Ereignisquelle. muß es eine Reihe von Operationen zur Verfügung stellen. Abb. dann soll das Fenster geschlossen und das Programm beendet werden.getKeyCode() == KeyEvent. 2. müssen die Ereignisempfänger bestimmte Schnittstellen implementieren.VK_ESCAPE) { // Fenster schließen // Anwendung beenden } } 350 . die anderen Operationen erhalten eine »leere« Implementierung: class TastaturAbhoerer implements KeyListener { . AnwendungGUI «interface» EventListener Abb.

2. 2.16.7 Schnittstellen und Vererbung public void { //leere } public void { //leere } } keyReleased(KeyEvent event) Implementierung keyTyped (KeyEvent event) Implementierung LE 10 Um viele leere Operationsrümpfe zu vermeiden.7 Schnittstellen und Vererbung Eine Klasse kann auch dann eine Schnittstelle implementieren. dann muß die Klasse alle Operationen implementieren. die in der Vererbungskette definiert sind (Abb. jede Schnittstelle kann eine oder mehrere Schnittstellen erben (Schlüsselwort extends). Jede Schnittstelle kann eine oder mehrere Oberschnittstellen besitzen.getKeyCode() == KeyEvent.16-6: Beispiel für die Vererbung von Schnittstellen Beispiel 351 . außer daß nicht jede Operation implementiert werden muß. die Operationen der Schnittstelle zu implementieren. entspricht die Verwendung von Adaptern der direkten Verwendung von ListenerSchnittstellen. Wenn eine Klasse eine Schnittstelle B implementiert.2.VK_ESCAPE) { // Fenster schließen // Anwendung beenden } } } Beispiel «interface» A Operation1() Operation2() 2. // Schnittstellen können vererbt werden interface A { void Operation1(). d.18 Ereignisverarbeitung auch Adapter-Klassen zur Verfügung. } «interface» B Operation3() meineKlasse Abb.16-6). class TastaturAbhoerer extends KeyAdapter { public void keyPressed (KeyEvent event) { if (event.16. void Operation2().h. Weil der Rumpf von Adapter-Operationen leer ist. stellt Java für die Kapitel 2. wenn sie selbst Unterklasse ist. die eine Schnittstelle A erbt. Die Unterklasse erbt von ihrer (abstrakten) Oberklasse und hat zusätzlich die Aufgabe. die standardmäßig leere Implementierungen für alle Operationen enthalten.

352 Pakete . meinObjekt. } public void Operation3() { System. subject und category. meinObjekt.println("Implementierung von Operation3()").out.Operation1(). Pakete (packages) sind ein solcher Strukturierungsmechanismus und erlauben es. } } class MeinProgramm { public static void main(String arg[]) { MeineKlasse meinObjekt = new MeineKlasse(). meinObjekt. Der Paketbegriff ist allerdings wie der Schnittstellenbegriff nicht einheitlich definiert. wird ein Strukturierungskonzept benötigt.17.println("Implementierung von Operation2()").Operation2(). } } 2.16 Schnittstellen //B erbt die Operationen Operation1() und Operation2() – //Operation3() kommt neu hinzu interface B extends A { void Operation3().println("Implementierung von Operation1()").LE 10 2.out.Operation3(). das von den Details abstrahiert und die übergeordnete Struktur verdeutlicht. } public void Operation2() { System. } //Diese Klasse muß alle Operationen von A und B implementieren class MeineKlasse implements B { public void Operation1() { System. Komponenten zu einer größeren Einheit zusammenzufassen.out.1 Zuerst die Theorie: Pakete in der SoftwareEntwicklung Bei umfangreichen Software-Entwicklungen entstehen viele Klassen.17 Pakete 2. Um einen Überblick über diese Vielfalt zu bewahren. Schnittstellen und Diagramme. Üblich sind auch die Begriffe Subsystem.

andernfalls in den Reiter. um Paketvarianten darzustellen.17-1: Pakete eines Handelssystems Verkauf Einkauf Lager Abhängigkeit Gestrichelte Linien mit Pfeil symbolisieren Abhängigkeiten zwischen Paketen.2 Dann die Praxis: Pakete in Java Abhängigkeiten Paketvarianten Paketdiagramm Paket und Klasse In Java können Klassen und Schnittstellen zu Paketen zusammengefaßt werden. dann wird als Klassenname PA::A angegeben.Beispiel hen.2.B. 2. Aufgaben s große Gruppen von Klassen und Schnittstellen. s Zugriffe und Sichtbarkeit zu definieren und zu kontrollieren. Klassen) und UML-Pakete Diagramme.17. Bei geschachtelten Paketen werden alle Paketnamen – jeweils durch »::« getrennt – vor den Klassennamen gesetzt. dann wird der Paketname in das Rechteck geschrieben. 2. Ein Paket wird als Rechteck mit einem Reiter dargestellt. Ein Handelssystem könnte aus den Paketen der Abb. Enthält ein Klassendiagramm nur Pakete und deren Beziehungen. zu bündeln und zu verwalten. Bei der Änderung eines Pakets an der Pfeilspitze ändert sich eventuell auch das Paket am anderen Ende der gestrichelten Linie.2 Dann die Praxis: Pakete in Java LE 10 In der UML gruppiert ein Paket Modellelemente (z. Ein Paket kann selbst Pakete enthalten.B. die zu einem gemeinsamen Aufgabenbereich gehören. Das Vererbungssymbol wird verwendet. Handelssystem Abb.17. 2. Paket1::Paket11::Paket111::Klasse. 353 . dann handelt es sich um ein Paketdiagramm. s eine Hierarchie von verfügbaren Komponenten aufzubauen. Wird der Notation Inhalt des Pakets nicht gezeigt. Von anderen Paketen kann jedoch darauf verwiesen werden.17-1 beste. Der Paketname Paketname muß im beschriebenen Software-System eindeutig sein. s potentielle Namenskonflikte zu vermeiden. Wird eine Klasse A eines Pakets PA in einem anderen Paket PB verwendet. Jede Klasse – allgemeiner jedes Modellelement und jedes Diagramm – gehört zu höchstens einem Paket. Pakete dienen in Java dazu. In der UML werden Pakete im Klassendiagramm eingetragen. z.

Das default-Paket ist für kleinere Programme gedacht..Unterpaket1.util.util.Random einZufall = new java. Random einZufall = new Random(). aber nicht die aus untergeordneten Paketen dieses Pakets.*.. d. ein Paket kann Unterpakete besitzen. s Am Anfang des Programms werden die gewünschten Klassen mit Hilfe einer import-Anweisung eingebunden.* werden alle Klassen des angegebenen Pakets auf einmal importiert. Beispiel vordefinierte Pakete Besitzen zwei Pakete Klassen mit denselben Namen. usw. . import java.Unterpaket11. Random einZufall = new Random(). 354 .util.2. import java. die mit dem JDK (Java Development Kit) ausgeliefert werden. eigene Pakete anzulegen.2 Dann die Praxis: Pakete in Java Paket-Hierarchie Punktnotation Jede Klasse und jede Schnittstelle in Java ist Bestandteil genau eines Pakets. Dies kann auf folgende zwei Arten geschehen: s Die Klasse oder Schnittstelle wird über ihren vollen (qualifizierten) Namen angesprochen. die selbst wieder in Unterpakete aufgeteilt sind.Random. Alle anderen Klassen des Pakets bleiben unsichtbar.LE 10 default package 2. java. Beispiel eine Klasse alle Klassen Wird in der import-Anweisung eine Klasse angegeben. 2.util. dann wird genau eine Klasse importiert. für die es sich nicht lohnt. . muß angegeben werden.. Durch import Paket.. Zu Java gehört eine Vielzahl vordefinierter Pakete.Random(). dann gehört es implizit zu einem default-Paket. . Jeder Java-Compiler stellt mindestens ein default-Paket zur Verfügung.1 Import von Paketen Um eine Klasse oder Schnittstelle verwenden zu können. im Beispiel Random. dann müssen die Paketnamen explizit angegeben werden.. Ist eine Klasse oder eine Schnittstelle nicht explizit einem Paket zugeordnet..17. Die Paket-Hierarchie wird durch eine Punktnotation ausgedrückt: Paket. Pakete sind in Java hierarchisch gegliedert. Verwendung von Paketen volle Qualifizierung Beispiel import-Anweisung Im Beispiel wird auf die Java-Standardklasse Random zugegriffen.17.h. Date einDatum = new Date().Klasse. . Klassen des default-Pakets können ohne explizite importAnweisung verwendet werden. in welchem Paket sie sich befindet.

Schnittstellendeklaration und vor die Import-Anweisungen das Schlüsselwort package gefolgt von dem Paketnamen aufgeführt wird.17-2: Java-Syntax einer Übersetzungseinheit CompilationUnit package Übersetzungseinheit PackageName .und Schnittstellendeklarationen als Übersetzungseinheit (compilation unit) bezeichnet (Abb. Schnittstelle zugeordnet werden soll.Unterpaket11. Die im Paket java. daß sie von jeder Klasse automatisch importiert werden. 2.h. Import-Deklarationen: Der Typ-Name muß der vollständig qualifizierte Name eines Klassen. In Java wird eine Paket-Deklaration zusammen mit Import-.Klasse liegen.Unterpaket1.6-1 und Abb.1 Import von Paketen java.17-2). 2.io java.applet java.und Datei-Ein-/Ausgabe Elementare Sprachunterstützung usw. ein expliziter Import ist nicht erforderlich. Klassen.2.lang LE 10 Beispiele Applets Abstract Window Toolkit AWT-Funktionen für die Zwischenablage AWT-Ereignisbehandlung AWT-Bildverarbeitung Java-Komponenten Bildschirm.17. Ein eigenes Paket wird dadurch angelegt. 2.image java. java. Der Compiler löst ebenso wie bei den Import-AnweiÜbersetzungseinheit eigene Pakete Abb.awt. daß vor die Klassenbzw.sun. Um Namenskollisionen bei der Verwendung von Klassenbibliotheken unterschiedlicher Hersteller zu vermeiden.awt. dem die nachfolgende Klasse bzw.16-3 355 .awt java. Die Klassen der Firma Sun Beispiel sollten in Paketen mit dem Namen com.2.awt.oder Schnittstellentyps sein. ClassDeclaration ClassDeclaration Typdeklarationen: siehe Abb. 2. sollten die URLDomain-Namen der Hersteller in umgekehrter Reihenfolge verwendet werden. import TypeName PackageName .event java.datatransfer java.beans java. d. * .lang Die URL der Firma Sun lautet: sun.com.lang enthaltenen Klassen und Schnittstellen sind für Java so elementar. Paket-Deklaration: Der Paket-Name muß der vollständig qualifizierte Name des Pakets sein.

C:\Cafe\JAVA\BIN rem *** End Visual Cafe PDEsettings *** Beispiel Das folgende Beispiel zeigt den Aufbau eines eigenen Pakets EinAusgabe. CLASSPATH enthält eine Liste von durch Kommata getrennten Verzeichnissen.. automatisch mit. C:\Cafe\JAVA\LIB. z.getText().JAR. selbstgeschriebene Paket findet. gelöscht //einMeldefeld: //Textfeld. Neben der Quelldatei wird auch die Klassendatei in diesem Unterverzeichnis abgelegt. //Inhalt des Eingabefeldes in eine Zahl wandeln try { 356 .C:\Cafe\BIN.LE 10 2. B.bat und kann dort mit einem Texteditor geändert werden.C:\Cafe\BIN\COMPONENTS\SYMBEANS. Der Compiler sucht so auch die importierten Pakete. Die Installationsroutinen der Compiler setzen in Windows meist automatisch den CLASSPATH. das es erleichert. Damit der Compiler das neue.ZIP.2 Dann die Praxis: Pakete in Java CLASSPATH sungen den hierarchischen Namen in eine Kette von Unterverzeichnissen auf. Beispiel /* Paketname: EinAusgabe * Klasse: Eingabe * Erleichtert die Eingabebehandelung von eingegebenen * Informationen einschl.%CLASSPATH% SET PATH=%PATH%.\java\Lib\. Daten ein.awt. muß es sich in einem Pfad befinden.und auszugeben. die noch nicht übersetzt sind. import java. public class Eingabe { //einTextfeld: //Textfeld. Der Java-Compiler übersetzt eingebundene Quelldateien. Ausnahmebehandlung */ package EinAusgabe.setText(""). TextField einMeldefeld) { String MerkeText = einTextfeld.. Er steht unter Windows 95 in der Datei autoexec. Unter Windows NT findet man die Datei in der Systemsteuerung.*. dann wird einTextfeld anschl. auf das die Umgebungsvariable CLASSPATH zeigt. an deren Ende die Quelldatei steht. if (nachLesenLoeschen) einTextfeld. die in der Reihenfolge ihres Auftretens durchsucht werden. C:\Cafe\JAVA\LIB\CLASSES. von dem die Eingabe gelesen werden soll //nachLesenLoeschen: //Wenn true. in dem Fehlermeldungen ausgegeben werden public static int getTextfeld(TextField einTextfeld. boolean nachLesenLoeschen.17. int Zahl = 0. rem *** Visual Cafe PDEsettings *** SET CLASSPATH=. als neuer Ordner in dem Verzeichnis .

einTextbereich. die Operation oder + den Konstruktor. 2.2) kann die. unabhängig von der Paketzugehörigkeit. Zur Steuerung der Zugriffsrechte gibt es in Java Sichtbarkeit vier verschiedene Zugriffskategorien.setText("Bitte ganze Zahl eingeben: " + eineAusnahme. die vierte ist voreingestellt und gilt. Die Zugriffskategorien erlauben eine gezielte Vergabe von Zugriffsrechten.17.append(MerkeText+"\n"). Drei von ihnen werden durch Schlüsselwörter gekennzeichnet.Kundenverwaltung MitPaketen chen.valueOf(Wert). public class Ausgabe { //einTextbereich: //in diesen Bereich wird die Information ausgegeben //Wert: Auszugebende ganze Zahl public static void setTextbereich(TextArea einTextbereich.valueOf(MerkeText). } return Zahl.siehe Programm ses Paket dazu benutzt werden. } } LE 10 In dem Programm Kundenverwaltung5 (siehe Abschnitt 2. 357 .9.2 Zugriffsrechte und Sichtbarkeit Durch Pakete werden zusätzliche Zugriffsrechte und Sichtbarkeits. jeden Konstruktor und jedes Attribut.2.intValue(). import java.und Ausgabe zu vereinfa.2.17. und zwar einzeln für jede Operation.getMessage()). Folgende Kategorien sind definiert: s public: Erlaubt »weltweiten« Zugriff sowohl von außen als auch public von allen Nachfahren aus auf das Attribut.awt.2 Zugriffsrechte und Sichtbarkeit Integer i = Integer.Zugriffsrechte und regeln eingeführt.2. Zahl = i.*. int Wert) { //Umwandlung einer ganzen Zahl in eine Zeichenkette String MerkeText = String. } catch (NumberFormatException eineAusnahme) { einMeldefeld. wenn keine explizite Kategorie angegeben ist. } } /*Paketname: EinAusgabe * Klasse: Ausgabe * Erleichtert die Ausgabe von Informationen */ package EinAusgabe. die Ein.

auch aus unterschiedlichen Paketen 358 .17. die Operation oder der Konstruktor nur innerhalb des Pakets sichtbar. dann sind sie nur in Paket 1 sichtbar.LE 10 private 2. dann ist dies eine Neudefinition. Das gilt für Nachfahren und NichtNachfahren. 2. keine Redefinition. Von außerhalb des Pakets ist kein Zugriff möglich. Operationen und Konstruktoren sind nur innerhalb der eigenen Klasse sichtbar. s protected: Von allen Nachfahren darf zugegriffen werden. 2. Sie werden vererbt.2 Dann die Praxis: Pakete in Java – protected # implizit »friendly« Kategorien für Klassen und Schnittstellen So deklarierte Attribute.17-3: Zugriffsrechte und Sichtbarkeit public: beliebiger Zugriff von überall her Paket2 Paket1 Sind Klasse B und D nicht public deklariert. Nicht-Nachfahren aus dem gleichen Paket haben ebenfalls Zugriff. sind aber von den Unterklassen aus nicht zugreifbar. s Ohne Angabe einer Zugriffskategorie sind das Attribut. Wenn eine Unterklasse eine Operation definiert. in dem die Klasse definiert ist. Umgangssprachlich wird diese Kategorie auch »friendly« genannt. Abb.17-3 veranschaulicht die Zusammenhänge. Ohne public-Angabe kann die Klasse s private: Abb. Bei Klassen und Schnittstellen wird entweder public oder keine explizite Kategorie angegeben. deren Kopf formal mit dem einer private-Operation des Vorfahren übereinstimmt. unabhängig davon. ob die Nachfahren sich im gleichen Paket oder einem anderen Paket befinden. KlasseE + KlasseA +AttributA1 #AttributA2 –AttributA3 AttributA4 +OperationA1() #OperationA2() –OperationA3() OperationA4 private: Zugriff nur innerhalb der eigenen Klasse UnterklasseB Paket3 KlasseD UnterklasseC implizit friendly: Zugriff von innerhalb des Pakets protected: Zugriff nur von Nachfahren aus.

Die Hierarchie der AWT-spezifischen Ereignisklassen beginnt eine Ebene tiefer mit der Klasse AWTEvent. 2. die Schnittstelle nur innerhalb des Pakets. 2. Diese Klasse dient damit als allgemeine Oberklasse aller Arten von Ereignissen.1 Ereignistypen In Java werden verschiedene Typen von Ereignissen unterschieden. benutzt werden. Ändern der Zugriffskategorie beim Überschreiben 2. die zwischen verschiedenen Programmteilen aufgerufen werden können.awt. Im folgenden wird die Ereignisverarbeitung detailliert betrachtet.18-1). dürfen eine beliebige Zugriffskategorie besitzen. Durch Aufruf der Operation public Object getSource(). daß es möglich sein muß. Die Klasse EventObject speichert das Objekt. AWTEvent ist Oberklasse aller Ereignisklassen des AWT. In der Regel wird beim Überschreiben einer Operation die geerbte Zugriffskategorie beibehalten. n private -Operationen. 359 . da es sich um neue Operationen handelt. die sich mit der Ereignisbehandlung von Benutzungsoberflächen beschäftigt. Dies Paket muß daher in jede Klasse importiert werden. die auf ein Objekt verweist. aber nicht weiter eingeschränkt werden: n public-Operationen müssen public bleiben. Beim Überschreiben darf der Zugriff daher nicht weiter eingeschränkt werden. die in Unterklassen neu definiert werden.9 behandelt.EventObject sind.1 Ereignistypen LE 10 bzw.18. Der Grund für diese Regeln liegt darin.18 Die Java-Ereignisverarbeitung im Detail Die Grundlagen der Ereignisverarbeitung wurden im Kapitel 2. auch Objekte aller Unterklassen zuzuweisen. n protected darf als public überschrieben werden.util.2. das das Ereignis ausgelöst hat. n Operationen ohne explizite Zugriffskategorie können so bleiben oder als protected oder public überschrieben werden. Sie befinden sich im Paket java. die direkte Unterklasse von EventObject ist und sich im Paket java. Änderungen sind möglich. an eine Variable. was auch ihr Vorfahr zur Verfügung stellt.event. public-Klassen und -Schnittstellen können überall verwendet werden. jedoch ist folgende Regel einzuhalten: s Die Zugriffsrechte dürfen nur erweitert. Daher muß die Unterklasse nach außen hin mindestens alles das zur Verfügung stellen.18. die alle Unterklassen der Klasse java. Diese verschiedenen Ereignistypen werden durch eine Hierarchie von Ereignisklassen repräsentiert. erhält man dieses Objekt. in dem sie deklariert ist.awt befindet (Abb.

sondern repräsentieren Ereignisse wie das Ausführen eines Kommandos oder die Änderung eines Zustands.18-1): s Elementare Ereignisse (low level events) beziehen sich auf Fenster und Interaktionselemente. s Semantische Ereignisse (semantic events) sind nicht an ein bestimmtes Interaktionselement gebunden. Sie werden in der Klasse ComponentEvent und ihren Unterklassen behandelt.18-1: Die Hierarchie der Ereignisklassen Im AWT werden zwei Arten von Ereignissen unterschieden. 2. die von der Ereignis360 .18.18 Die Java-Ereignisverarbeitung im Detail util Event Object awt AWT Event event Elementare Ereignisse (low level events) Component Event Semantische Ereignisse (semantic events) Action Event Adjustment Event Item Event Text Event Focus Event Input Event Container Event Window Event Key Event Mouse Event Abb.LE 10 java 2. 2. 2. die sich in der Klassenhierarchie widerspiegeln (Abb. muß es eine Reihe von Operationen implementieren.2 Ereignisabhörer Damit ein Objekt über Ereignisse informiert werden kann.

Sie kann verwendet werden. 2.2. In diesem Fall bildet man eine neue Unterklasse von der Adapterklasse und redefiniert die benötigten Operationen. 2. die Operation action Performed(ActionEvent e) muß einen Rumpf erhalten.event (Abb. daß zur Ereignisklasse ActionEvent die Beispiele Schnittstelle ActionListener gehört. Dies erspart man sich mit Adapterklassen. aufgerufen werden können. Alle Operationen sind vom Typ void. Diese Schnittstelle muß vom Ereignisabhörer implementiert werden. müssen die Ereignisabhörer bestimmte Schnittstellen (interfaces) implementieren. Innerhalb der Operation actionPerformed kann dann über die Operationen der Klasse ActionEvent auf das übergebene Objekt zugegriffen werden. Je Ereignisklasse (siehe Abb. Zu jedem elementaren Ereignis stellt das Paket java. d. Innerhalb der Operationen kann dann über die Operationen der Klasse MouseEvent auf das übergebene Objekt zugegriffen werden.util sind.3 Adapterklassen Eine Adapterklasse implementiert eine vorgegebene Schnittstelle mit leeren Operationsrümpfen.awt.18-2). daß diese Operationen vorhanden sind. bei der es sich registriert. Beide Ereignisklassen stellen unterschiedliche Operationen zur Verfügung.18-2). Verwendet man in einem solchen Fall anstelle von Adapterklassen Schnittstellen. Um sicherzustellen. Analog ist der Ereignisklasse MouseEvent die Schnittstelle Mouse Listener zugeordnet. 2.18.18. Sie definiert für jede Ereignisart dieser Ereignisklasse eine separate Operation. 2. die fünf Operationen deklariert. Jede der Operationen einer Ereignisabhörer-Schnittstelle besitzt als einzigen Parameter ein Objekt vom zugehörigen Ereignistyp.awt.16.event eine passende Adapterklasse zur Verfügung (Abb.h. Die Abb. Ein Beispiel ist in Abschnitt 2. 2. Alle übrigen Operationen werden von der Adapterklasse zur Verfügung gestellt.18-1) gibt es eine EventListenerSchnittstelle. dann müssen alle Operationen der Schnittstelle implementiert werden. Als Parameter wird ein Objekt der Klasse MouseEvent übergeben. wenn aus einer Schnittstelle nur ein Teil der Operationen benötigt wird. Auf der Parameterliste von actionPerformed wird ein Objekt der Ereignis-Klasse ActionEvent übergeben.h. 361 . die Unterschnittstellen der Schnittstelle EventListener des Pakets java. d.6 dargestellt. sie geben kein Ergebnis zurück.3 Adapterklassen LE 10 quelle.18-3 zeigt. Über ein Maus-Ereignis möchte man als Ereignisabhörer andere Informationen erfahren als über ein Aktionsereignis. Die Unterschnittstellen von EventListener befinden sich im Paket java.

LE 10 java 2. 2.18 Die Java-Ereignisverarbeitung im Detail lang util «interface» Event Listener Object awt event Focus Adapter «interface» Focus Listener «interface» Key Listener «interface» Mouse Listener «interface» MouseMotion Listener «interface» Component Listener «interface» Container Listener «interface» Window Listener «interface» Action Listener «interface» Adjustment Listener «interface» Item Listener «interface» Text Listener Key Adapter Mouse Adapter Mouse Motion Adapter Component Adapter Container Adapter Window Adapter Adapter-Klassen Abb.18-2: Die Hierarchie der EventListener-Schnittstellen 362 .

4 Registrierung Ereignisabhörer müssen sich bei den Ereignisquellen. das die jeweilige EventListener-Schnittstelle implementiert.2. registrieren.5 Vorgehensweise ActionEvent «interface» ActionListener actionPerformed (ActionEvent e) LE 10 Abb. einDruckknopf. Die Registrierung erfolgt mit speziellen Operationen.18. 2 In der linken Spalte der Tabellen Tab. für die sie sich interessieren.addActionListener(einAbhoerer). In den Tabellen Tab. AktionsAbhoerer einAbhoerer = new AktionsAbhoerer(this). Button einDruckknopf.18-2 sind alle Ereignisse in Java und ihre Verarbeitung zusammengestellt.B. b Wenn semantisches Ereignis. 2. 2.18-3: Beispiele für Ereignisklassen und zugehörige EventListenerSchnittstellen String getActionCommand() int getModifiers() String paramString() MouseEvent «interface» MouseListener mouseClicked (MouseEvent e) mouseEntered (MouseEvent e) mouseExited (MouseEvent e) mousePressed (MouseEvent e) mouseReleased (MouseEvent e) int getClickCount() Point getPoint() int getX() int getY() String paramString() 2.} Die Klasse Button stellt im Beispiel die Operation addActionListener(ActionListener einAbhoerer) zur Verfügung. 2. welche Ereignistypen diese Ereignisquelle erzeugt. um eine problemgerechte Ereignisverarbeitung in Java zu programmieren: 1 Überlegen. z. welche Schritte nötig sind. 3 Pro Ereignistyp folgendes tun: a Klasse Ereignistyp-Abhörer schreiben. 363 . von welcher Ereignisquelle Ereignisse abgehört werden sollen.18.. an die ein Objekt der Klasse übergeben wird. class AktionsAbhoerer implements ActionListener.. 2.B. 2.18-1 und Tab.18. class AktionsAbhoerer. 2. Beispiel wobei gilt: public class AktionsAbhoerer implements ActionListener {.18-2 feststellen.18-1 und Tab. dann entsprechende Schnittstelle implementieren.5 Vorgehensweise Folgende Vorgehensweise zeigt. z.

Ereignisquellen Ereignisklasse Schnittstelle und ihre Operationen Adapterklasse Registrierung addFocusListener FocusListener n focusGained n focusLost Ereignistyp FocusEvent FocusAdapter Eine Komponente erhält den Focus Eine Komponente verliert den Focus Component Focus LE 10 Component KeyEvent KeyListener n keyPressed n keyReleased n keyTyped Key 364 MouseEvent n n n n n KeyAdapter addKeyListener Eine Taste wurde gedrückt Eine Taste wurde losgelassen Eine Taste wurde gedrückt und wieder losgelassen MouseAdapter addMouseListener Eine Maustaste wurde gedrückt und wieder losgelassen Der Mauszeiger betritt die Komponente Der Mauszeiger verläßt die Komponente Eine Maustaste wurde gedrückt Eine Maustaste wurde losgelassen Component MouseListener mouseClicked mouseEntered mouseExited mousePressed mouseReleased Mouse Component MouseEvent MouseMotionListener n mouseDragged n mouseMoved MouseMotion MouseMotionAdapter addMouseMotionListener Die Maus wurde bei gedrückter Taste bewegt Die Maus wurde bewegt. ohne daß eine Taste gedrückt wurde Component ComponentEvent n n n n Component ComponentListener componentHidden componentMoved componentResized componentShown ComponentAdapter addComponentListener Eine Komponente wurde unsichtbar Eine Komponente wurde verschoben Die Größe einer Komponente hat sich geändert Die Komponente wurde sichtbar addContainerListener 2.18-1: Elementare Ereignisse und ihre Verarbeitung . 2. Frame WindowEvent Window WindowListener n windowActivated n windowClosed n windowClosing n windowDeactivatated n windowDeiconified n windowIconified n windowOpened Das Das Das Das Das Das Das Fenster Fenster Fenster Fenster Fenster Fenster Fenster WindowAdapter addWindowListener wurde aktiviert wurde geschlossen wird geschlossen wurde deaktiviert wurde wiederhergestellt wurde auf Symbolgröße verkleinert wurde geöffnet Tab.18 Die Java-Ereignisverarbeitung im Detail Container ContainerEvent ContainerListener n componentAdded n componentRemoved Container ContainerAdapter Eine Komponente wurde hinzugefügt Eine Komponente wurde entfernt Dialog.

List. List. 2. CheckboxMenuItem Der Zustand hat sich verändert Text TextEvent TextListener n textValueChanged addItemListener TextField. Choice. TextArea Der Text wurde verändert addTextListener Tab. MenuItem.5 Vorgehensweise 365 LE 10 .18.18-2: Semantische Ereignisse und ihre Verarbeitung 2.TextField Action ActionEvent Eine Aktion wurde ausgeführt Adjustment AdjustmentEvent AdjustmentListener n adjustmentValueChanged Scrollbar Der Wert wurde verändert Item ItemEvent ItemListener n itemStateChanged addAdjustment Listener Checkbox.Ereignisquellen Ereignistyp Ereignisklasse Schnittstelle und ihre Operationen Registrierung addActionListener ActionListener n actionPerformed Button.

einDruckknopf.addActionListener(einAbhoerer).*. class TastaturAbhoerer extends KeyAdapter. d.6 Beispiel: Ein einfacher UML-Editor Die Ereignisverarbeitung wird im folgenden an einem einfachen UMLEditor verdeutlicht. AktionsAbhoerer einAbhoerer = new AktionsAbhoerer(this). Mit Hilfe dieser Operation kann die Beschriftung eines Druckknopfs abgefragt werden: String einDruckknopf = event.. 2. 5 Pro Ereignisquelle entsprechendes Abhörer-Objekt registrieren.18-1 und Tab.B. 2. public class KlassenSymbol { 366 .h. 2.getActionCommand(). 4 Pro Abhörer-Klasse ein Abhörer-Objekt erzeugen. oder bei der Verwendung von Adapter-Klassen nur die benötigten Operationen implementieren. z. Im ersten Beispiel wird auf einer Zeichenfläche ein Rechteck als Klassensymbol erzeugt.B.VK_A). public void actionPerformed (ActionEvent event). Beispiel 2 Die Klasse KeyEvent stellt die Operation int getKeyCode() zur Verfügung. die auf der Parameterliste angegeben ist. entsprechende Adapterklasse erweitern.. z. verwenden. um die benötigten Informationen zu erhalten. z. Beispiel 3 Abb.18 Die Java-Ereignisverarbeitung im Detail c Wenn elementares Ereignis. 6 In den implementierten Operationen die Operationen der entsprechenden Ereignis-Klasse.LE 10 2. welche Taste gedrückt wurde: if (event. 2..B.B. if einDruckknopf. der Klasse.18. Das Programm sieht folgendermaßen aus: /* Programmname: UMLEditor1 * Fachkonzept-Klasse: KlassenSymbol (Anwendung) * Vorbereitung eines UML-Editors * Zeichnet auf eine übergebene Fläche ein Klassensymbol * (leeres Rechteck) */ import java.equals(„Speichern“). d In der Abhörer-Klasse alle Schnittstellen-Operationen implementieren.U. die in den Tabellen Tab.18-2 unter Schnittstellen aufgeführt sind. dann u. Beispiel 1 Die Klasse ActionEvent stellt die Operation String getActionCommand() zur Verfügung. Es kann mit der Maus selektiert und durch Klicken an einen anderen Ort transportiert werden.getKeyCode() == KeyEvent..18-4 zeigt das OOD-Diagramm des UML-Editors.awt. z. Mit ihrer Hilfe kann festgestellt werden.

int Hoehe) { XPos = x. } public void selektieren(boolean ausgewaehlt) { isSelektiert = ausgewaehlt. g. if(isSelektiert) g. Breite: int.getGraphics(). //Höhe des Rechtecks protected boolean isSelektiert. int Breite. } 367 Abb.//Linke obere X-Ecke des Rechtecks protected int YPos = 0. y: int): boolean + setPosition(x: int. //Breite des Rechtecks protected int Hoehe = 20.2. y: int): void + isSelektiert(): boolean //Attribute protected int XPos = 0.drawRect(XPos. y: int): void 1 enthaelt 1 KlassenSymbol # # # # # XPos: int = 0 YPos: int = 0 Breite: int = 40 Hoehe: int = 20 IsSelektiert: boolean = false 1 informiert 1 1 1 LE 10 MausAbhoerer + MausAbhoerer() + mouseClicked(event: MouseEvent): void FensterAbhoerer 1 + FensterAbhoerer() + windowClosing(event: WindowEvent): void AktionsAbhoerer informiert 1 + AktionsAbhoerer() + actionPerformed(event: ActionEvent): void + KlassenSymbol(x: int.18. YPos = y. Breite.//Linke obere Y-Ecke des Rechtecks protected int Breite = 40. this.setColor(Color.Hoehe = Hoehe. ob das Klassensymbol mit der Maus selektiert wurde //Konstruktor public KlassenSymbol(int x. YPos. } //Zeichnet das Klassensymbol auf die übergebene //Zeichenfläche public void zeichnen(Canvas c) { //Mit getGraphics wird ein Grafikkontext für die //Zeichenfläche erzeugt Graphics g = c. Hoehe).Breite = Breite. Hoehe: int) + zeichnen(c: Canvas): void + selektieren(ausgewaehlt: boolean): void + isImRechteck(x: int.6 Beispiel: Ein einfacher UML-Editor UMLEditorGUI informiert + + + + UMLEditorGUI paint(g: Graphics): void zeichneSymbol(): void selektierenVerschieben (x: int.18-4: OOD-Diagramm eines einfachen UML-Editors .blue). 2. this. int y. //Angabe. y: int.

klassenDruckknopf.18 Die Java-Ereignisverarbeitung im Detail //Prüfung. } //Neue Position festlegen public void setPosition(int x.402).awt. java. //}} //Konstruktor public UMLEditorGUI() { //{{INIT_CONTROLS setLayout(null). ob der angegebene Punkt im Rechteck liegt public boolean isImRechteck(int x.24. int y) { if ((x >= XPos) && (x <= (XPos + Breite)) && (y >= YPos) && (y <= (YPos + Hoehe))) return true. } public boolean isSelektiert() { return isSelektiert. private FensterAbhoerer einFensterAbhoerer.awt. //{{DECLARE_CONTROLS java. klassenDruckknopf. setSize(515. klassenDruckknopf. } }//Ende KlassenSymbol /* Programmname: UMLEditor1 * GUI-Klasse: UMLEditorGUI (Anwendung) * Vorbereitung eines UML-Editors * Erzeugen.Button klassenDruckknopf.*. else return false. YPos = y. setVisible(false). Selektieren Verschieben eines Klassensymbols * (Rechteck) */ import java. protected KlassenSymbol einKlassenSymbol.awt.84.24).setBounds(12.awt. private AktionsAbhoerer einAktionsAbhoerer.setBackground(new Color(12632256)).LE 10 2.Button(). private MausAbhoerer einMausAbhoerer.setLabel("neue Klasse"). klassenDruckknopf = new java. 368 . int y) { XPos = x.Canvas eineZeichenflaeche. public class UMLEditorGUI extends Frame { //Attribute static UMLEditorGUI einUMLEditorGUI.

addWindowListener(einFensterAbhoerer).0. } //Klassenoperation main public static void main(String args[]) { //Erzeugen eines Objekts von UMLEditorGUI einUMLEditorGUI = new UMLEditorGUI(). dann. repaint(). //Mausbewegung registrieren einMausAbhoerer = new MausAbhoerer(this).addActionListener(einAktionsAbhoerer). //Druckknopf registrieren einAktionsAbhoerer = new AktionsAbhoerer(this).24. eineZeichenflaeche.setVisible(true). y)) //Wenn die Maus im Klassensymbol geklickt wurde. clearRect(0. einUMLEditorGUI.zeichnen(eineZeichenflaeche). } public void paint(Graphics g) { //Wenn bereits ein Klassensymbol vorhanden.360).18.10. klassenDruckknopf..2.setBounds(108. //dann im Selektionsmodus anzeigen 369 LE 10 . einKlassenSymbol.addMouseListener(einMausAbhoerer).Canvas(). } } public void zeichneSymbol() { einKlassenSymbol = new KlassenSymbol(10. eineZeichenflaeche. eineZeichenflaeche = new java.isImRechteck(x.6 Beispiel: Ein einfacher UML-Editor add(klassenDruckknopf). setTitle("UML-Editor: Vorbereitung"). dann ein //neues zeichnen if(einKlassenSymbol != null) { //getGraphics ergibt ein Objekt der Klasse Graphics //clearRect ist eine Operation von Graphics //Das angegebene Rechteck wird mit der //Hintergrundfarbe gefüllt //Damit wird ein vorhandenes Rechteck auf der //Zeichenfläche gelöscht eineZeichenflaeche.360).384.60).. if(einKlassenSymbol != null) { if(einKlassenSymbol.awt. } public void selektierenVerschieben(int x.setBackground(new Color(12632256)). eineZeichenflaeche. int y) { //Wenn es schon ein Klassensymbol gibt.384.getGraphics().100. add(eineZeichenflaeche). //}} //Fenster schliessen registrieren einFensterAbhoerer = new FensterAbhoerer(this).

getSource(). public MausAbhoerer(UMLEditorGUI einUMLEditorGUI) { einGUI = einUMLEditorGUI. //Fenster-Objekt löschen 370 .setVisible(false). } public void windowClosing(WindowEvent event) { einGUI.selektierenVerschieben(event.setPosition(x. //Fenster unsichtbar machen einGUI.selektieren(false). public class FensterAbhoerer extends WindowAdapter { UMLEditorGUI einGUI. FensterAbhoerer(UMLEditorGUI einUMLEditorGUI) { einGUI = einUMLEditorGUI. //dann auf neue Position verschieben einKlassenSymbol. y).getX(). } }//Ende if repaint().event.*. } public void mouseClicked(MouseEvent event) { Object object = event.awt.isSelektiert() == true) { //Wenn Klassensymbol bereits im Selektionsmodus.awt.LE 10 2.eineZeichenflaeche) einGUI. event.event.getY()).*.18 Die Java-Ereignisverarbeitung im Detail einKlassenSymbol.dispose(). if (object == einGUI.selektieren(true).//Aufruf der Operation paint }//Ende selektierenVerschieben }//Ende UMLEditorGUI /*Programmname: UMLEditor * Abhoerer-Klasse: MausAbhoerer * Abhoerer-Klasse ist eigenständige Klasse! */ import java. public class MausAbhoerer extends MouseAdapter { UMLEditorGUI einGUI. else { if(einKlassenSymbol. } } /*Programmname: UMLEditor * Abhoerer-Klasse: FensterAbhoerer * Abhoerer-Klasse ist eigenständige Klasse! */ import java. } einKlassenSymbol.

Der bisherige UML-Editor wird daher im folgenden so erweitert. } public void actionPerformed(ActionEvent event) { einGUI. wobei das Klassensymbol während der Bewegung ständig an der aktuellen Bewegungsstelle angezeigt wird. Abb. public class AktionsAbhoerer implements ActionListener { UMLEditorGUI einGUI. //Anwendung beenden } }//Ende FensterAbhoerer /*Programmname: UML-Editor * Abhoerer-Klasse: AktionsAbhoerer * Abhoerer-Klasse ist eigenständige Klasse! */ import java.18-5: Benutzungsoberfläche des ersten UML-Editors Einer der wichtigsten Effekte bei der direkten Manipulation auf der Benutzungsoberfläche ist.exit(0). Loslassen) bewirken diesen Effekt.18-5 zeigt die Benutzungsoberfläche.zeichneSymbol().*. } } LE 10 Abb. daß ein selektiertes Objekt der Mausbewegung folgt.18. Die Mausbefehle pick.awt. AktionsAbhoerer(UMLEditorGUI einUMLEditorGUI) { einGUI = einUMLEditorGUI. Nach dem Loslassen der Maustaste wird es dann endgültig dort positioniert und angezeigt.event. drag & drop (Selektieren. 2. daß ein selektiertes Klassensymbol bei gedrückter linker Maustaste der Mausbewegung folgt.6 Beispiel: Ein einfacher UML-Editor System. 371 . 2.2. Bewegen.

Selektieren Verschieben eines Klassensymbols */ import java. repaint(). //Konstruktor public UMLEditorGUI() { //analog UML-Editor1 //Zusätzliche Registrierung im UML-Editor2 einBewegungsabhoerer = new MausbewegungsAbhoerer(this).setVisible(true).18 Die Java-Ereignisverarbeitung im Detail Im folgenden sind nur die Programmteile aufgeführt.. protected int gedruecktesSymbolEckeX.60). yVerschiebung. } public void selektierenVerschieben(int x. protected int xVerschiebung.10. if(einKlassenSymbol != null) { if(einKlassenSymbol. die erweitert wurden.*.LE 10 Beispiel 2 2.isImRechteck(x. /* Programmname: UMLEditor2 * GUI-Klasse: UMLEditorGUI (Anwendung) * Vorbereitung eines UML-Editors * Erzeugen. } //Klassenoperation main public static void main(String args[]) { //Erzeugen eines Objekts von UMLEditorGUI einUMLEditorGUI = new UMLEditorGUI(). dann im Selektionsmodus anzeigen einKlassenSymbol. gedrueckteMausStartY. } public void paint(Graphics g) { //analog UML-Editor1 } public void zeichneSymbol() { einKlassenSymbol = new KlassenSymbol(10. public class UMLEditorGUI extends Frame { //Attribute analog UML-Editor1 //Zusätzliche Attribute im UML-Editor2 protected KlassenSymbol gedruecktesSymbol. y)) //Wenn die Maus im Klassensymbol geklickt //wurde. dann.selektieren(true). protected int gedrueckteMausStartX. einUMLEditorGUI.100.gedruecktesSymbolEckeY. private MausbewegungsAbhoerer einBewegungsabhoerer. Die Erweiterungen sind schwarz hervorgehoben. 372 .awt.addMouseMotionListener (einBewegungsabhoerer). eineZeichenflaeche.. int y) { //Wenn es schon ein Klassensymbol gibt.

xVerschiebung. y). einKlassenSymbol. } } public void erstelleGedruecktesSymbol(int x. xVerschiebung = gedrueckteMausStartX gedruecktesSymbolEckeX.getYPos(). int y) { if (gedruecktesSymbol != null) { gedruecktesSymbol. gedruecktesSymbolEckeX = einKlassenSymbol. } public void loescheGedruecktesSymbol() { gedruecktesSymbol = null.selektieren(false).selektieren(true).//Aufruf der Operation paint } //Neue Operationen im UML-Editor2 public void zeichneGedruecktesSymbol(int x.selektieren(false). gedruecktesSymbolEckeY = einKlassenSymbol. } }//Ende UMLEditorGUI /*Programmname: UMLEditor2 * Fachkonzept-Klasse: KlassenSymbol (Anwendung) * Vorbereitung eines UML-Editors * Zeichnet auf eine übergebene Fläche ein Klassensymbol * das sich mit drag&drop verschieben läßt */ 373 LE 10 . //Selektionsmodus aufheben } } repaint(). y . //dann auf neue Position verschieben einKlassenSymbol. gedrueckteMausStartX = x. } else einKlassenSymbol.isSelektiert() == true) { //Wenn Klassensymbol bereits im Selektionsmodus. gedrueckteMausStartY = y.6 Beispiel: Ein einfacher UML-Editor else { if(einKlassenSymbol.isImRechteck(x. repaint(). yVerschiebung = gedrueckteMausStartY gedruecktesSymbolEckeY.18.yVerschiebung). repaint().setPosition(x.2. int y) { if(einKlassenSymbol.getXPos().setPosition(x . } einKlassenSymbol. y)) { gedruecktesSymbol = einKlassenSymbol.

} public int getYPos() { return YPos. public MausbewegungsAbhoerer(UMLEditorGUI einUMLEditorGUI) { einGUI = einUMLEditorGUI. if (object == einGUI. public class MausbewegungsAbhoerer extends MouseMotionAdapter { UMLEditorGUI einGUI.awt. public class KlassenSymbol { //analog UML-Editor1 //Zusätzliche Operationen für UMLEditor2 public int getXPos() { return XPos.eineZeichenflaeche) 374 .awt. public MausAbhoerer(UMLEditorGUI einUMLEditorGUI) { einGUI = einUMLEditorGUI. } } /*Programmname: UMLEditor * Abhoerer-Klasse: MausbewegungsAbhoerer * Abhoerer-Klasse ist eigenständige Klasse! */ import java. event.eineZeichenflaeche) einGUI.event. } public void mouseClicked(MouseEvent event) { Object object = event. if(object == einGUI.LE 10 2.event.awt.getSource().zeichneGedruecktesSymbol(event. } } /*Programmname: UMLEditor * Abhoerer-Klasse: MausAbhoerer * Abhoerer-Klasse ist eigenständige Klasse! */ import java.getX().getSource().18 Die Java-Ereignisverarbeitung im Detail import java.*.*.getY()). public class MausAbhoerer extends MouseAdapter { UMLEditorGUI einGUI. } //Maus wird mit gedrückter Taste bewegt public void mouseDragged(MouseEvent event) { Object object = event.*.

7 Anonyme Klassen einGUI. erlaubt Java »innere« Klassen.2 schachtelt.18. } //Zusätzliche Operationen für den UML-Editor2 public void mouseReleased(MouseEvent event) { Object object = event.getSource().2. Eine »anonyme« Klasse wird bei der Übergabe eines Objekts an eine Operation oder als Rückgabewert einer Operation innerhalb einer einzigen Anweisung deklariert und gleichzeitig ein Objekt von ihr erzeugt. } //Maustaste wurde gedrückt public void mousePressed(MouseEvent event) { Object object = event. } } LE 10 2. führt das Abfangen vieler unterschiedlicher Ereignistypen zu entsprechend vielen zusätzlichen Klassen. kommen aber ohne Klassennamen aus. event. die die Ereignisquelle(n) enthält.Beispiel dermaßen aus (siehe UML-Editor2): 375 .selektierenVerschieben(event.Abschnitt 2. die eine Variante der »inneren« Klassen darstellen. genauer gesagt einge.eineZeichenflaeche) einGUI.getY()).18.getX(). und haben Zugriff auf alle Attribute und Operationen ihrer umgebenden Klasse. daß sie Unterklasse einer anderen Klasse ist oder eine vorhandene Schnittstelle (interface) implementiert. if(object == einGUI. Sie werden in die Klasse eingebettet. die über Assoziationen mit den Ereignisquellen verbunden werden müssen. Sie sind ebenfalls in eine Klasse eingebettet. if(object == einGUI. Um diesen Aufwand – zumindest für einfache Ereignisabhörer – zu reduzieren. Als eigenständige Klasse sieht das Schließen des Fensters folgen.getSource().erstelleGedruecktesSymbol(event. Nach dem Schlüsselwort new wird der Name der Oberklasse oder der Schnittstelle angegeben.9.loescheGedruecktesSymbol().getX().getY()). event. gefolgt von dem Klassenrumpf.7 Anonyme Klassen Wie das Beispiel »UML-Editor« des letzten Abschnitts zeigt. Voraussetzung für eine »anonyme« Klasse ist. Eine noch kompaktere Programmierung erlauben die »anonymen« Klassen.eineZeichenflaeche) einGUI.

dann wird ein Objekt einer anonymen Klasse erzeugt. //Fenster unsichtbar machen einGUI. //Anwendung beenden } } ) Der Ausdruck hinter addWindowListener(Ausdruck) erzeugt genau ein Objekt der anonymen Klasse und liefert eine Referenz auf dieses Objekt.addWindowListener(this). dispose(). 376 .awt. dann wird ein Objekt der anonymen Klasse erzeugt.exit(0).*.setVisible(false). public class FensterAbhoerer extends WindowAdapter { UMLEditorGUI einGUI.exit(0). //Der Eingabeparameter ist ein Objekt .. die diese Schnittstelle implementiert... //Anwendung beenden } } Als anonyme Klasse ergibt sich folgender Programmausschnitt: //Fenster schliessen registrieren addWindowListener (new WindowAdapter() //Das Klammerpaar steht für einen //Konstruktor ohne Parameter { public void windowClosing(WindowEvent event) { setVisible(false). //Fenster schliessen registrieren einFensterAbhoerer = new FensterAbhoerer(this). //Fenster-Objekt löschen System. //einGUI. dann kann eine beliebige Anzahl von Parametern dem Konstruktor übergeben werden.. //Fenster-Objekt löschen System. } public void windowClosing(WindowEvent event) { einGUI.LE 10 2. Ist der angegebene Typ eine Schnittstelle. Handelt es sich bei dem Typ um eine Klasse.dispose(). wo ein elementarer Java-Ausdruck erlaubt ist. FensterAbhoerer(UMLEditorGUI einUMLEditorGUI) { einGUI = einUMLEditorGUI. wobei die anonyme Klasse eine Unterklasse dieser Klasse ist. Eine solche Konstruktion kann überall dort stehen. import java. addWindowListener(einFensterAbhoerer).event.18 Die Java-Ereignisverarbeitung im Detail . Wenn der nach new spezifizierte Typ ein Klassentyp ist.

Dadurch ist eine Form der Mehrfachvererbung in Java realisierbar. liegt darin. Operations-Beschreibungen zu erben. ist dann ein Subtyp dieser Schnittstelle. das abstrakte Operationen. Paket Java-Strukturierungskonzept.Glossar/Zusammenhänge LE 10 Vorteil dieses Konzepts ist es. package → Paket. Vererbungshierarchien können auf mehrere Pakete verteilt sein. Nachteilig ist. mit dem Klassen und Schnittstellen zu Einheiten zusammengefaßt werden können.h. Eine Klasse.h. Das Paket-Konzept (package) von Java ermöglicht es. die eine Schnittstelle implementiert. Eine Klasse kann mit dem Schlüsselwort implements ein oder auch mehrere Schnittstellen erben. Pakete wiederum können hierarchisch gegliedert werden. daß die Schnittstellenvererbung es nur ermöglicht. In diesem Fall können sie auf Objekte verweisen. daß ein Programm mit wenig benötigten Namen nicht überfrachtet wird. Klassen und Pakete Schnittstellen zu einer übergeordneten Einheit zusammenzufassen. s Variablen können vom Typ einer Schnittstelle sein. die diese Schnittstelle implementieren. Zur Java377 . daß ein Programm unlesbar wird. Schnittstellen besitzen zwei wichtige Eigenschaften. Operationen ohne Implementierung. Schnittstellen können andere Schnittstellen erben und werden von Klassen implementiert. Der wichtigste Unterschied zwischen dem Erben mehrerer Schnittstellen und der echten Mehrfachvererbung. Durch Pakete ergeben sich zusätzliche Sichtbarkeitsregeln und Zugriffsrechte. aber nicht deren Implementierungen. Konstanten und abstrakte Operationen zu einer Schnittstelle (interface) zu bündeln. die diese oder eine daraus abgeleitete Schnittstelle implementieren. und/oder konstante Klassenattribute zu einer Schnittstelle zusammenfaßt und damit dem Anwender funktionale Abstraktionen zur Verfügung stellt. Eine Schnittstelle kann also als Typvereinbarung angesehen werden. Die Operationen müssen dann geeignet implementiert werden. Jede Klasse und jede Schnittstelle ist Bestandteil genau eines Pakets. Eine Klasse kann mehrere Schnittstellen implementieren. die aus Klassen abstammen. Wie bei inneren Klassen erzeugt der Compiler auch für anonyme Klassen eigene class-Dateien. d. Wegen der Mehrfachvererbung von Schnittstellen kann ein Objekt damit mehrere Subtypen haben und zu mehr als einem Typ zuweisungskompatibel sein. d. dem Erben mehrerer Klassen. interface → Schnittstelle. wenn der Implementierungsteil mehr als einige Zeilen umfaßt. Sie selbst können Variablen zugewiesen werden. die zu Klassen gehören. Schnittstelle Java-Konzept. Sie erbt damit alle Konstanten und abstrakten Operationen. die auch Schnittstellen Klassen haben: s Sie lassen sich vererben. Das Schnittstellen-Konzept von Java erlaubt es. Pakete sind hierarchisch gegliedert.

x = x. einObjekt = 2. Schnittstellenname) oder alle Klassen und Schnittstellen importiert werden (import Paketname. Analytische Aufgaben Muß-Aufgabe 60 Minuten 1 Lernziele: Zugriffsrechte und Sichtbarkeit von Klassen. Dabei können einzelne Klassen oder Schnittstellen (import Paketname. wenn sie mit der import-Anweisung importiert werden. } public addiere(int x) { einStatic += x. private A(String s) { einZaehler = s. einZaehler++. static int einObjekt. Attributen und Operationen problem.x = x.*). } this. // Zeitpunkt a } } public class B extends A { int x.und qualitätsgerecht bei eigenen Programmen auswählen können. einZaehler = "Hello World".Klassen. public addiere(int x) { this. // Zeitpunkt b } } } 378 . this.einObjekt = 3. Klassen oder Schnittstellen eines Pakets können in einer Klasse oder Schnittstelle verwendet werden. this. { int einObjekt.einObjekt = 4.x = x+x. { int x.LE 10 Zusammnehänge/Aufgaben Sprache gehören eine Reihe vordefinierter Pakete. int x.bzw. super. Betrachten Sie den folgenden Java-Code: public class A { private String einZaehler. Innerhalb und zwischen Paketen gelten besondere Sichtbarkeitsregeln und Zugriffsrechte. protected int einStatic.

/5/ Der Druckknopf »Assoziation« soll nur dann aktivierbar sein. die eingegebene Zeichenketten in folgende elementare Typen wandelt: String in float und String in double. daß zur Laufzeit die Führungstexte (labels) von Deutsch auf Englisch umgeschaltet werden können. /2/ Beide Klassensymbole sollen unabhängig voneinander auf dem Bildschirm mit drag and drop bewegt werden können.4) so ab. Erweitern Sie das Paket EinAusgabe (siehe Beispiel in Abschnitt 2. Wurde beispielsweise ein Firmenname eingegeben und es wird die Return-Taste gedrückt. 3 Lernziele: Java-Schnittstellen problemgerecht bei eigenen Programmen verwenden können.17. dann steht der Cursor anschließend im Eingabefeld Firmenadresse. welche Attribute und Operationen zum Zeitpunkt a und b (nach erfolgter Korrektur aus a) sichtbar sind. /6/ Für die Auswahl soll der Mauszeiger eine andere Form (Fadenkreuz) erhalten. /3/ Es soll eine neue Klasse »Assoziation« erstellt werden. b Geben Sie an. /4/ In der GUI-Klasse ist nun noch ein weiterer Druckknopf »Assoziation« einzufügen. 4 Lernziele: Vorhandene Java-Pakete importieren und eigene erstellen können. c Geben Sie alle definierten Attributwerte zu den Zeitpunkten a und b an. mit dem das selektierte Klassensymbol assoziiert werden soll. wenn es bereits zwei Klassensymbole gibt und eines der beiden selektiert ist.oder linksbündige Ausgabe gewünscht wird. b Erstellen Sie eine Operation. die die elementaren Typen float und double in Zeichenketten wandelt.7.1) um folgende Operationen: a Schreiben Sie eine Operation. die eine Assoziation zwischen zwei Klassen erstellen und zeichnen kann (Darstellung mit einer einfachen Linie).7-4) so ab. daß durch Drücken der Return-Taste von Eingabefeld zu Eingabefeld gesprungen werden kann. der es ermöglicht. Erweitern Sie den UML-Editor (Version 2) aus dieser Lehreinheit um folgende Funktionalität: /1/ Es soll in der GUI-Klasse über einen weiteren Druckknopf ein zweites Klassensymbol erzeugt und dargestellt werden können. Dabei soll es möglich sein anzugeben. Ändern Sie das Programm Kundenverwaltung mit interaktiver Eingabe (Abb. Die Ereignisverarbeitung in Java korrekt anwenden können. Mit der Maus soll dann das (andere) Klassensymbol ausgewählt werden. Ändern Sie durch Einsatz einer Schnittstelle das Programm Kundenverwaltung mit interaktiver Eingabe (Abb. c Vereinfachen Sie das in Aufgabe 2 erstellte Programm durch Anwendung des erstellten Pakets EinAusgabe. 2. 5 Lernziele: Ein gegebenes Java-applet um Funktionalität aus einem Pflichtenheft erweitern können.Aufgaben a Markieren und verbessern Sie alle syntaktischen Fehler. 2. 2 Lernziele: Java-Schnittstellen problemgerecht bei eigenen Programmen verwenden können. wieviele Stellen nach dem Komma angezeigt werden sollen und ob eine rechts. 379 LE 10 Konstruktive Aufgaben Muß-Aufgabe 30 Minuten Muß-Aufgabe 30 Minuten Muß-Aufgabe 60 Minuten Muß-Aufgabe 60 Minuten . eine Assoziation zu erstellen.

eineZeichenflaeche. selbstzeichnend. mehrfarbig.setCursor(new Cursor(CROSSHAIR_CURSOR)). DrawableI mit der Operation draw(). folgendermaßen definiert: Ein GUI-Objekt kann beliebig viele der folgenden Eigenschaften besitzen: druckbar.a. Eine Klassenbibliothek wurde im Entwurf u. Klausur-Aufgabe 40 Minuten 6 Lernziele: Java-Schnittstellen problemgerecht bei eigenen Programmen verwenden können. sollen die folgenden Anweisungen benutzt werden: eineZeichenflaeche. b Erstellen Sie ein Java-Klasse MiniMenu. die alle obigen Eigenschaften besitzt und die entsprechende(n) Operation(en) syntaktisch korrekt leer implementiert. a Erstellen Sie die Java-Schnittstellen PrintableI mit der Operation print().LE 10 Aufgaben Hinweis: Um die Form des Mauszeigers zu verändern. die nur zeichenbar (DrawableI) ist und die entsprechende(n) Operation(en) syntaktisch korrekt leer implementiert.setCursor(new Cursor(DEFAULT_CURSOR)). 380 . ColorizedI mit den Operation setColor() und getColor(). c Erstellen Sie eine Java-Klasse SuperButton.

1 2. Hashtable sowie die Hüllklassen für einfache Typen (wrapper classes) problemgerecht beim Schreiben von Java-Programmen einsetzen können.19.19.6 2.5.1 2. Die Schnittstelle Enumeration für geeignete Beispiele implementieren können. Stack. Container-Klassen unter Einsatz des Singleton-Musters programmieren können.1.4 2.1.3 2. StringBuffer.2 2. Die Datenstrukturen Warteschlange. String.19. Keller und Streuspeicherung mit Hilfe von Java-Standardklassen realisieren können.19.19.3 2. Keller und Streuspeicherung anhand von Beispielen erläutern können.19.19.2 bis 2.19. Die Datenstrukturen Warteschlange.3 2.19.5 2. Datenstrukturen 382 Felder 382 Erzeugen und Benutzen von Feldern 383 Die Java-Syntax und -Semantik für Felder 384 Felder als Container 389 Das Singleton-Muster 393 Die Klasse Vector 395 Iteratoren 400 Zuerst die Theorie: Das Iterator-Muster 400 Dann die Praxis: Enumeratoren in Java 401 Die Hüllklassen für einfache Typen 405 Die String-Klassen von Java 407 Die Klasse String 407 Die Klasse StringBuffer 410 Die Klasse StringTokenizer 411 Die Klasse Stack 414 Die Klasse Hashtable 418 2.18 müssen bekannt sein. Felder.7 381 .19. Sich in Java-Standardklassen einarbeiten und diese problemgerecht einsetzen können.5.1.19.19.1 2.2 2.3. verstehen anwenden s Die Kapitel 2.19.LE 11 2 Grundlagen der Programmierung – Datenstrukturen s s s s s s s Die Java-Konzepte für Felder. StringTokenizer.1.19.1 2.19. Zeichenketten und Hüllklassen für einfache Typen erklären und darstellen können.19 2.2 2.3.19.4 2.2 2.5. die Klassen Vector.

Ein umfassendes Beispiel zeigt die Anwendung jeder dieser Klassen. Float. die nach dem Kellerprinzip arbeiten. Elemente vom gleichen Typ zu einer Einheit zusammenzufassen. z. Character. Integer.10. Damit können alle Probleme. Im folgenden werden die aufgeführten Klassen detailliert erläutert. 382 . Problemstellungen. Ergänzend zu Containern werden oft noch Iteratoren benötigt. Daher gibt es in den Programmiersprachen weitere Konzepte.1 Felder 2. um auf alle erzeugten Objekte einer Klasse zugreifen zu können. zu realisieren. s Standardklassen von Java unterstützen die Realisierung von bestimmten Problemklassen: n Die Klasse Vector ermöglicht die Speicherung beliebiger Objekte und kann ihr Fassungsvermögen dynamisch ändern.1 Felder In der Praxis tritt oft das Problem auf.B. Objekte zu verwalten. 2. auch Sammlungen genannt. Stapel zur Verfügung.B. z. Solche Objektverwaltungen sind nötig. Mehrdimensionale Felder ermöglichen es. n Die Hüllklassen für einfache Typen (wrapper classes). um diese Problemstellungen geeignet modellieren zu können. bestimmte Attribute und Operationen auch auf einfache Typen anzuwenden.19. realisiert werden. Container ermöglichen es. n Die Klassen String. bei denen aufgrund eines Schlüssels auf Inhalte zugegriffen werden muß.19 Datenstrukturen In Abschnitt 2. daß viele Attribute vom gleichen Typ vereinbart werden müssen. Damit ist es möglich. Diese Typen reichen für viele Problemstellungen nicht aus. Matrizen zu modellieren. einfach programmiert werden. Dadurch ist es möglich. um auf die Elemente des Containers zuzugreifen. z. n Die Klasse Stack stellt einen Kellerspeicher bzw. Behälter. einfache Typen in Objekte zu konvertieren und umgekehrt. erlauben es. StringBuffer und StringTokenizer stellen komfortable Operationen zur Manipulation von Zeichenketten zur Verfügung.LE 11 2. s Felder (arrays) erlauben es.19.B. Auf Container und Iteratoren wird in den folgenden Abschnitten ebenfalls eingegangen. Mit Hilfe von Feldern und Standardklassen können Container bzw. Mit Hilfe dieser Klasse können auf einfache Art und Weise sogenannte Warteschlangen (queues) implementiert werden.und Ausgabe von Informationen über die Benutzungsoberfläche. Diese Operationen erleichtern insbesondere die Ein.4 wurden einfache Typen behandelt. n Die Klasse Hashtable realisiert die sogenannte Streuspeicherung. float Meßwert1.

Im Gegensatz zu anderen Programmiersprachen sind Felder in Java Java: Felder = Objekte Objekte. Aus diesen Gründen enthalten fast alle Programmiersprachen einen Konstruktionsmechanismus. 2 Erzeugen eines neuen Feldobjekts und Zuordnung zu einer Feldvariablen. Auf der anderen Seite kommt der Zusammenhang zwischen den verschiedenen Objekten – außer bei einer geeigneten Namenswahl – durch die getrennte Deklaration nicht geeignet zum Ausdruck.. 2. sind drei Schritte nötig (analog dem Deklarieren und Erzeugen von Objekten): 1 Deklaration einer Variablen.1 Erzeugen und Benutzen von Feldern Um ein Feld in Java zu erzeugen und zu benutzen. Sicherlich ist es noch möglich...1. Alle Elemente des Feldes werden bei der Erzeugung mit new automatisch in Abhängigkeit vom Typ initialisiert. Auf die einzelnen Elemente wird über Indizes zugegriffen.19. . Feld mit 100 Elementen erzeugen: Messreihe = new float[100]. typgleiche Attribute zu speichern. die später eine Referenz auf ein Feldobjekt speichern kann (Feldvariable). Messwert2 Messwert3 Elemente (alle vom gleichen Typ) Beispiel Ein Feld besteht aus Elementen bzw. Bei 1000 oder 10 000 ist dies aber nicht mehr möglich.1 Erzeugen und Benutzen von Feldern LE 11 Meßwert2. 3 Schreibender und lesender Zugriff auf die Feldelemente. die alle den gleichen Typ haben.1. der es erlaubt. Ohne Feld: Messwert1 Mit Feld: Messreihe Index 0 1 2 . 2 Erzeugen eines neuen Feldobjekts und Zuordnung zu der in Schritt 1 deklarierten Feldvariablen. Numerische Felder werden mit Null vorbesetzt. Felder werden daher wie andere Objekte auch behandelt. Felder stellen eine Mög. typidentische Attribute zu einer Einheit zusammenzufassen. Komponenten. // Feld mit Elementen vom Typ float Beispiel Alternative Schreibweise: float Messreihe[]. 10 oder 20 solcher Attribute zu deklarieren.Feld lichkeit dar.. 1 Deklaration einer Feldvariablen float[] Messreihe..2. Einen solchen Typkonstruktor bezeichnet man als Feld (array). 383 .19.

der in eckigen Klammern steht.2f. unterscheiden sie sich doch in einigen Punkten von »normalen« Objekten. 3 Schreibender und lesender Zugriff auf die Feldelemente Der Zugriff auf die Feldelemente geschieht über einen ganzzahligen Index. Obwohl Felder Objekte sind.5 5.0 0.5 5.5 5.0 0. z. gehört der Feldtyp daher auch zu den Referenztypen.5 Felder und Objekte 2.5 99 Schritt 3: for(int i = 0. die Anzahl der Feldelemente angibt.i++) Messreihe[i] = 5.1 Felder Alternativ zur Erzeugung mit dem new-Operator können auch alle Elemente direkt bei der Deklaration initialisiert werden.19. i++) Messreihe[i] = 5. Abb. Eine Meßreihe mit fünf Elementen kann folgendermaßen erzeugt und initialisiert werden: float Messreihe[] = {1..5 0 0.0f..LE 11 2.19-1 veranschaulicht die Vorgänge. 0. 1. 384 .0 5.0 0. s Feldnamen haben wie Objektnamen einen Referenztyp.B.5f.length.19-1: Veranschaulichung eines Feldobjekts Feldvariable Messreihe null Schritt 1: float[] Messreihe. Abb. Gemeinsam mit Objekten sind folgende Eigenschaften: s Felder werden wie Objekte grundsätzlich dynamisch angelegt.89f}. 2. i < Messreihe. der von 0 bis n – 1 läuft.5 . alle Elemente den Wert 5.length.5f. 2. Dies ist allerdings nur bei kleinen Feldern sinnvoll.0 0. Mit dem new-Operator erzeugte Felder werden normalerweise in einer Zählschleife initialisiert. wobei n die Länge des Feldes bzw.5 5. i < Messreihe. Auf einzelne Elemente wird immer über den Index zugegriffen.0 0.1.5 erhalten.B. Initialisierung der Feldvariablen mit der Referenz null Schritt 2: Messreihe = new float[100] Erzeugen des Feldobjektes mit 100 Elementen und setzen der Referenz in der Feldvariablen . Messreihe[5] = Messreihe[3] + 1.7f. 3. die es für jedes Feld gibt.19-2 ist die Java-Syntax für Felder aufgeführt. Durchlaufen jeder Indexposition und Initialisierung mit 5. 2. 5.72f. 7.0 5.. 1 2 3 4 97 98 (anonymes) Feldobjekt Index 0.19.0 5. Die Konstante length. Sollen z..5 5.5f. dann sieht die Schleife folgendermaßen aus: for(int i = 0.2 Die Java-Syntax und –Semantik für Felder In der Abb. enthält die Ober- grenze des Feldes. Da in der Java-Philosophie Felder Objekte sind.

2.19-2: Java-Syntax für Felder 385 .19.1. Type private public protected = final ArrayInitializer static transient Expression Identifier VariableDeclaratorId [ ] . ArrayInitializer { Expression ArrayInitializer . } ArrayCreationExpression new PrimitiveType TypeName [ Expression ] [ ] ArrayAccess ExpressionName PrimaryNoNewArray [ Expression ] Abb. 2. .2 Die Java-Syntax und -Semantik für Felder LE 11 Type PrimitiveType ReferenceType ReferenceType ClassType InterfaceType ArrayType Hinweis: Die blau unterlegten Syntaxteile sind für Felder relevant. ArrayType Type [ ] FieldDeclaration .

Dadurch entstehen geschachtelte Felder. In Java gibt es keine mehrdimensionalen Felder. z. 0}}. oder int Matrix[][]. Bei geschachtelten Feldern können beispielsweise die Unterfelder der zweiten Ebene unterschiedliche Längen aufweisen.B. 'V'. {-1. Statt dessen gibt es für Felder eine spezielle Syntax des new-Operators. Die Komponenten eines Feldes können aber wieder Felder sein. "Di". "Do". Geschachtelte Felder werden durch geschachtelte Aufzählungen initialisiert: int[][] Matrix = {{-1. "Mi".: int[][] Matrix. Felder können somit auch an Referenzen auf Object zugewiesen werden. {-1. Die Anzahl der Elemente wird erst bei der Initialisierung angegeben.1 Felder Geschachtelte Felder Deklaration von Feldern Felder sind wie alle Objekte implizit Unterklassen der Klasse Object. Felder unterscheiden sich von »normalen« Objekten durch folgende Merkmale: s Felder haben keine Konstruktoren. -1}. Bei mehrdimensionalen Feldern besitzen alle Felder einer bestimmten Dimension dieselbe Größe. "So"}. Mehrdimensionale Felder können durch geschachtelte Felder dargestellt werden. ‚'A'.B. 0. Die Elementanzahl eines Feldes wird bei der Deklaration einer Feldreferenz nicht angegeben. 'A'}. "Sa". Kunde[] meineKunden. "Fr". 386 . Initialisierung Aufzählung Geschachtelte Felder werden durch mehrere Klammernpaare deklariert z.LE 11 2. s Von Feldern können keine Unterklassen definiert werden. Der Referenztyp enthält nur die Schachtelungstiefe und den Elementtyp. z. Alle Felder sind in Java eindimensional. Die eckigen Klammern können alternativ aber auch hinter der Feldvariablen angegeben werden: char Puffer[].B. im Sinne von Pascal.B.: s char[] Puffer. Kunde meineKunden[].19. Die Deklaration einer Referenz auf ein Feld erfolgt durch die Angabe eines Elementtyps. 0. char[] Puffer = {'J'. z. gefolgt von einem Paar eckiger Klammern. -1. Bei der direkten Initialisierung werden alle Elemente in geschweiften Klammern aufgezählt. String Wochentage[] = {"Mo". An Stelle mehrerer Dimensionen gibt es mehrere Schachtelungsebenen. Die Initialisierung eines Feldes erfolgt entweder direkt bei der Deklaration oder nach der Deklaration mit dem new-Operator. Alle Operationen von Object sind auch auf Felder anwendbar. -1}. Die Anzahl der Elemente wird automatisch ermittelt.

2. 1}}. Wird eine Längenangabe auf einer tieferen Ebene gemacht. double[][][] dreiDimensionen1. dann wird das Feld 1 1 1 standardmäßig wie folgt initiali1 2 siert: 1 s Für numerische Felder: 0 s Für boolesche Felder: false Unterfelder s Für Zeichenfelder: ’\0’ s Für alle anderen Felder: null. {1. 4].19. Bei geschachtelten Feldern muß mindestens die Elementanzahl der obersten Schachtelungsebene angegeben werden. //erlaubt dreiDimensionen2 = new double[2][][4].1.2. meineKunden = new Kunde[100].length. Außerdem müssen bei new so viele Ebenen wie in der Deklaration angegeben werden. //eine Ebene fehlt //nicht erlaubt Beispiele Jedes Feld besitzt standardmäßig eine Konstante length. Bei den tieferen Ebenen ist die Angabe optional. {1. 17}. die die Zugriff auf Felder Länge des entsprechenden Feldes enthält. int x = Matrix[3][4]. int[][] Matrix = new int[5][5]. //nicht erlaubt Beispiel 387 . 20.B. //Lücke. int[] Zimmertemperaturen = {18. int AnzahlElemente = Zimmertemperaturen. Bei Indizierung geschachtelten Feldern muß der Index für jede Ebene in einem eigenen Klammerpaar stehen. new-Operator Wird ein Feld mit dem new-Operator erzeugt. Lücken dürfen bei der Festlegung nicht entstehen. nicht erlaubt dreiDimensionen3 = new double[5][]. dreiDimensionen2.2 Die Java-Syntax und -Semantik für Felder 0 0 1 2 –1 –1 –1 1 –1 0 –1 2 –1 0 0 Unterfelder Feld LE 11 Im Unterschied zu mehrdimensionalen Feldern müssen Unterfelder nicht gleich groß sein. 24.: Feld Puffer = new char[4]. Darstellung eines Pascalschen Dreiecks: int[][] Pascal = {{1}. 14. z. //ergibt 5 Beispiele Der Feldindex wird in Java grundsätzlich von Null an gezählt. 1}. dann müssen alle darüberliegenden Ebenen ebenfalls festgelegt werden. int y = Matrix[3. dreiDimensionen3. Hinter new wird der Elementtyp und die Anzahl der Elemente in ekkigen Klammern angegeben. dreiDimensionen1 = new double[2][3][]. eine Trennung durch Kommata ist nicht erlaubt.

arraycopy benutzt werden. b = a. da sie genauso wie byte . //bewirkt.1 Felder Für die Indizierung sind die aufzählbaren Typen byte. z. 'd'}. s Ist einmal ein Feldobjekt erzeugt worden. Die Elemente eines solchen Feldes können als Werte eine Nullreferenz aufweisen oder Objekte von jeder Unterklasse der abstrakten Klasse. muß die Operation arraycopy() System. char-Werte sind zulässig. 2. – das Zielfeld. – die Indexposition.B. eine einfache Zuweisung vorzunehmen.arraycopy(a. Beispiel 1b Die Elemente 2 und 3 von Feld a sollen an die Stellen 0 und 1 von Feld b kopiert werden: System. //wirkt sich auf b aus //b[3] enthält jetzt ebenfalls 'x' Beispiel 1a Um Feldelemente auch physisch zu kopieren. int[] berechne(..). s Felder können in selbstdefinierten Operationen wie jeder andere Typ verwendet werden. ab der die Elemente in das Zielfeld hineinkopiert werden. Da eine Feldvariable auf ein Feldobjekt nur eine Referenz setzt. int und char erlaubt. weitere Charakteristika Folgende Charakteristika sind bei Java-Feldern außerdem noch zu beachten: s Felder mit einem abstrakten Klassentyp als Elementtyp sind erlaubt. Sie besitzt folgende Parameter: – das Quellfeld.19.und short-Werte bei Feldzugriffen intern in int-Werte konvertiert werden. – die Indexposition. 'c'. Nicht erlaubt sind long und boolean. s Ein char-Feld ist keine Zeichenkette. char b[] = new char[4]. der größer oder gleich der Elementanzahl ist. char a[] = {'a'. dann kann seine Länge nicht mehr geändert werden.LE 11 2. Kopieren eines Feldes Wird auf ein Feld mit negativem Index oder einem Index. 388 . ab der die Elemente aus dem Quellfeld kopiert werden. zugegriffen. short. dann wird die Ausnahme ArrayIndexOfBoundsException ausgelöst. die kopiert werden sollen. – die Anzahl der Elemente. 2). die selbst wiederum nicht abstrakt ist. Der Inhalt eines String-Objekts kann in Java nicht verändert werden.. Der Ergebnistyp einer Funktion kann auch ein Feldtyp sein. 0. reicht es zum physischen Kopieren nicht. während auf ein charFeld lesend und schreibend zugegriffen werden kann. b. 'b'. daß a und b auf dasselbe Feldobjekt //referenzieren a[3] = 'x'.

die Verweise auf die erzeugten Objekte einer Klasse in einer eigenständigen Klasse. /** Programmname: Kundenverwaltung * Fachkonzept-Klasse: Kunde * Aufgabe: Kundenobjekte erzeugen */ public class Kunde { 389 .19-4 zeigt das Klassendiagramm und eine zusätzliche Veranschaulichung der Objektverwaltung.19. dessen Kundennummer angegeben ist.19. 2. Lautet konvention die Fachkonzept-Klasse Kunde. Mit Hilfe von Feldern kann eine einfache Objektverwaltung verwirklicht werden. /2/ Die Kundendaten jeweils eines Kunden können ausgegeben werden.Beispiel 2a ver Eingabe soll wie in Abb.1. zu verwalten. Abb. wobei die Daten des Kunden ausgegeben werden. um beispielsweise eine Liste aller Objekte anzuzeigen oder auszudrucken. 2.1 behandelte Kundenverwaltung mit interakti. Der Name einer Container-Klasse sollte aus dem Plural des NamensKlassennamens gefolgt von dem Namen Container bestehen. Die in Abschnitt 2.2.1.3 Felder als Container In vielen Aufgabenstellungen ist es erforderlich.19-3 dargestellt modifiziert und erweitert werden: /1/ Kunden können erfaßt werden.3 Felder als Container LE 11 2. auf alle erzeugten Objekte einer Klasse zuzugreifen. wobei jeder Kunde eine ganzzahlige Kundennummer zwischen 1 und 20 erhält. 2.19-3: Benutzungsoberfläche der modifizierten Kundenverwaltung Abb.9. Es hat sich bewährt. dann heißt die zugehörige ContainerKlasse KundenContainer. im folgenden immer Container-Klasse genannt.

Firmenadresse. private String Firmenname.. } public String getFirmenadresse() { return Firmenadresse. //Konstruktor public Kunde(int Kundennr. String Adresse.19.. 390 .1 Felder Verweis Kunde Kundennr Firmenname Firmenadresse Auftragssumme Kunde() getFirmenname() getFirmenadresse() getAuftragssumme() aendernAdresse() Verweis :ersterKunde Kundennr = 1 Aufruf KundeGUI einKunde einKundenContainer KundenNr init() ausgeben Kunde() :zweiterKunde Kundennr = 3 :dritterKunde Kundennr = 20 KundenContainer meineKunden[] .Auftragssumme = Auftragssumme. int Auftragssumme) { this.19-4: Modifiziertes Klassendiagramm und Veranschaulichung der Objektverwaltung für das Programm Kundenverwaltung //Attribute private int Kundennr.. Firmenname = Name.. 20 Aktionsabhoerer Aufruf Aufruf KundenContainer() getKunde() insertKunde() actionPerformed() Container zur Verwaltung von Referenzen auf Kunden-Objekte Abb. String Name. Firmenadresse = Adresse.LE 11 2. 0 1 2 3 . private int Auftragssumme = 0. } //Kombinierte Schreiboperation public void aendernAdresse(String Firmenname. } //Lesende Operationen public String getFirmenname() { return Firmenname. 2.Firmenname = Firmenname. this. String Firmenadresse) { this.Kundennr = Kundennr. } public int getAuftragssumme() { return Auftragssumme.

public class KundenverwaltungGUI extends Applet { //Referenz-Attribut mit Initialisierung private KundenContainer einKundenContainer = new KundenContainer(). import java. } public Kunde getKunde(int Kundennr)throws NoSuchElementException { Kunde einKunde = meineKunden[Kundennr].*. //Operationen public void insertKunde(int Kundennr.event. //}} //Operationen public void init() { 391 LE 11 .awt. private int KundenNr = 1.1.*. //Attribute private Kunde einKunde. public class KundenContainer { //Attribut private Kunde meineKunden[] = new Kunde[21].3 Felder als Container this. //{{DECLARE_CONTROLS . Kunde einKunde) { meineKunden[Kundennr] = einKunde.applet.. else throw new NoSuchElementException().awt. import java.*. } } /** Programmname: Kundenverwaltung * GUI-Klasse: KundenverwaltungGUI * Aufgabe: Klasse zur Erfassung und Ausgabe von Kundendaten * Es ist jeweils die Kundennummer anzugeben (zwischen 1 und 20) */ import java.. if (einKunde != null) return einKunde.19.*.2.Firmenadresse = Firmenadresse. } } /** Programmname: Kundenverwaltung * Container-Klasse: KundenContainer * Aufgabe: Verwaltung von Objekten der Klasse Kunde * Verwaltungsmechanismus: Feld */ import java.util.

setText(""). kundenTextbereich.einKunde). firmennameTextfeld.append(String.addActionListener(einAktionsAbhoerer).append(einKunde. } }//Ende Innere Klasse }//Ende KundenverwaltungGUI 392 .valueOf(kundennr2Textfeld.getText()).getFirmenadresse() + "\n"). kundenTextbereich. getAuftragssumme()) + "\n").valueOf(auftragssummeTextfeld.addActionListener(einAktionsAbhoerer). } } else if (object == AnzeigenDruckknopf) ausgebenKunde(). getText()).valueOf(kundennrTextfeld. intValue(). //}} }//Ende init private void ausgebenKunde() { //Kundendaten holen KundenNr = Integer. //Botschaft an KundenContainer einKunde = einKundenContainer.1 Felder //{{INIT_CONTROLS . speichernDruckknopf.getSource()..insertKunde (EingabeNr. AnzeigenDruckknopf.getText().append(einKunde. //Erzeugtes Objekt im KundenContainer verwalten einKundenContainer.getKunde(KundenNr). firmenadresseTextfeld. } //Innere Klasse class AktionsAbhoerer implements ActionListener { public void actionPerformed(ActionEventevent) { Object object = event.getFirmenname() + "\n").19. if (object == speichernDruckknopf) { int EingabeNr = Integer.. Integer. //}} //{{REGISTER_LISTENERS AktionsAbhoerer einAktionsAbhoerer = new AktionsAbhoerer().getText().intValue()).getText()). kundenTextbereich.valueOf(einKunde.intValue().LE 11 2. if(EingabeNr >= 0) { //Objekt erzeugen einKunde = new Kunde(EingabeNr. //Löschen des Textfeldes kundenTextbereich.

Dies geschieht dadurch. return einSingleton. die Container-Klasse so zu programmieren. daß in einem privaten Klassenattribut die Referenz auf das einzige Objekt gespeichert wird. 2. //Konstruktor. Es ist daher sinnvoll. Für das Beispiel 2a ergeben sich durch die Anwendung des Single. dann genügt häufig genau ein Container-Objekt.*.1. public class KundenContainer { //Attribut private Kunde meineKunden[] = new Kunde[21]. //Klassen-Attribut //Speichert Referenz auf das einzige Objekt private static KundenContainer einKundenContainer = null.19.4 Das Singleton-Muster LE 11 2.Singleton: englische Bezeichben (Abb. Diese Problemstellung wird durch das Singleton-Muster beschrie. Über eine Klassenoperation getObjektreferenz() wird die Referenz auf ein bereits existierendes Objekt übergeben oder genau einmal beim ersten Aufruf dieser Operation das einzige Objekt erzeugt.2. so daß er von außerhalb der Klasse nicht aufgerufen werden kann.1. 2.19-5). /* Programmname: Kundenverwaltung * Container-Klasse: KundenContainer * Aufgabe: Verwaltung von Objekten der Klasse Kunde * Verwaltungsmechanismus: Feld * Muster: Singleton */ import java.19-5: Das Singleton-Muster Die Container-Klasse selbst wird für die Verwaltung ihres einzigen Objekts verantwortlich gemacht.19. Abb. Einzelfall Singleton – einzigesObjekt – singletonDaten – singleton() + getObjektreferenz() + getSingletonDaten() + setSingletonDaten() if(einzigesObjekt == null) einSingleton = new Singleton().Beispiel 2b ton-Musters folgende Modifikationen: Die Klasse Kunde bleibt unverändert. Der Konstruktor ist ebenfalls privat. von außen nicht zugreifbar private KundenContainer() { } 393 .4 Das Singleton-Muster Werden Container-Klassen zur Verwaltung von Objekten verwendet. genau ein Objekt zu erzeugen. daß es nur möglich ist.util. um diese Aufgabe zu erledigen. nung für Einzelkarte.

} } /* Programmname: Kundenverwaltung * GUI-Klasse: KundenverwaltungGUI * Aufgabe: Klasse zur Erfassung von Kundendaten * und zur Ausgabe von Kundendaten * Es ist jeweils die Kundennummer anzugeben (zwischen 1 und 20) */ import java. einKunde = einKundenContainer. getAuftragssumme())+ "\n").19 Datenstrukturen //Klassen-Operation.valueOf(einKunde.*.applet.getKunde(KundenNr).*.getFirmenname()+ "\n"). private Kunde einKunde.getText()). } 394 . public class KundenverwaltungGUI extends Applet { //Attribute private KundenContainer einKundenContainer. private void ausgebenKunde() { //Kundendaten holen KundenNr = Integer. } //Operationen public void insertKunde(int Kundennr. Kunde einKunde) { meineKunden[Kundennr] = einKunde. else throw new NoSuchElementException(). import java. //Botschaft an KundenContainer einKundenContainer = KundenContainer. kann nur einmal aufgerufen werden return einKundenContainer. kundenTextbereich.getFirmenadresse()+ "\n").. kundenTextbereich. dann wird es erzeugt public static KundenContainer getObjektreferenz() { if (einKundenContainer == null) einKundenContainer = new KundenContainer(). kundenTextbereich. private int KundenNr = 1.LE 11 2. } public Kunde getKunde(int Kundennr)throws NoSuchElementException { Kunde einKunde = meineKunden[Kundennr].awt. //Konstruktor.append(einKunde.intValue().valueOf(kundennr2Textfeld.setText("").getObjektreferenz(). .append(String. if (einKunde != null) return einKunde. //Löschen des Textfeldes kundenTextbereich. die die Objektreferenz liefert //Wenn Objekt noch nicht vorhanden..append(einKunde.

2 Die Klasse Vector Eine wesentliche Eigenschaft von Feldern besteht darin.einKunde). firmennameTextfeld. Um diese Nachteile eines Feldes zu vermeiden. 395 . auf die über einen Index zugegriffen werden kann.19.getText(). Ein Objekt der Klasse Vector enthält wie ein Feld Elemente.ActionEvent event) { Object object = event.getText()).getSource().19. wenn kein Platz mehr vorhanden ist.2 Die Klasse Vector //Innere Klasse class AktionsAbhoerer implements java. um auf der sicheren Seite zu sein. firmenadresseTextfeld. daß sie nach der Initialisierung in der Länge nicht mehr veränderbar sind.intValue()).valueOf(auftragssummeTextfeld. } } else if (object == AnzeigenDruckknopf) ausgebenKunde().getText(). steht für solche Problemfälle in Java die Klasse Vector zur Verfügung.event. um wieviel Elemente das Objekt erweitert werden soll. intValue().insertKunde (EingabeNr.2. getText()). if (object == speichernDruckknopf) { int EingabeNr = Integer. s Die Kapazitätserhöhung gibt an.event. Im Regelfall verschwendet man hierdurch aber viel Speicherplatz.awt. einKundenContainer = KundenContainer. In vielen Problemstellungen ist die Länge im voraus aber nicht bekannt. Die Größe eines Vector-Objekts kann nach Bedarf wachsen oder schrumpfen und sich damit der Problemsituation anpassen. if(EingabeNr >= 0) { //Objekt erzeugen einKunde = new Kunde(EingabeNr. Man wählt dann üblicherweise einen Maximalwert. getObjektreferenz(). Jedes Objekt der Klasse Vector besitzt zwei Kenngrößen: Kenngrößen s Die Kapazität gibt die aktuelle Größe des Objekts an. //Erzeugtes Objekt im KundenContainer verwalten einKundenContainer.ActionListener { public void actionPerformed (java. Integer.awt. } }//Ende Innere Klasse }//Ende KundenverwaltungGUI LE 11 2.valueOf(kundennrTextfeld.

Mit Hilfe der Klasse Vector lassen sich sogenannte Warteschlangen einfach realisieren. s insertElementAt(Object obj. meineKunden. //10 Elemente vorgesehen //5 Elemente vorgesehen //Erweiterung um jeweils //20 Elemente Beispiele Operationen Die Klasse Vector stellt folgende wichtige Operationen zur Verfügung: s addElement(Object obj) Fügt das übergebene Objekt am Ende des Vectors an. keine einfachen Typen. verschoben.4). dann wird das Element mit dem niedrigsten Index entfernt. Fehlt die Angabe.19. wird Platz für zehn Elemente vorgesehen. dann kann man beim Erzeugen des Objekts als zweiten Parameter angeben. d. int index) Fügt das übergebene Objekt an der Position ein. Will man diese Verdopplung vermeiden. Diese müssen vorher in Objekte gewandelt werden (siehe Abschnitt 2. wenn der aktuelle Platz erschöpft ist. Befindet sich an der angegebenen Position bereits ein Element. s Object elementAt(int index) Liefert das Element am angegebenen Index zurück. 20). z. Vector meineKunden = new Vector(5. Wird dem Vector ein weiteres Element hinzugefügt.addElement(neuerKunde). die einen Index größer oder gleich index haben. dann wird die aktuelle Kapazität jeweils verdoppelt. die an erster Stelle im Konstruktor angegeben wird. Ist es mehrmals vorhanden. dann werden alle anderen Elemente.h. 396 . Vector meineKunden = new Vector().19 Datenstrukturen Jeder Vector wird mit einer bestimmten Länge initialisiert. die durch Index angegeben wird. Ein vorhandenes Objekt an dieser Indexposition wird entfernt. s size() Felder Vector Liefert die Anzahl der aktuell vorhandenen Elemente. einschließlich numerischer Typen und aller Klassentypen. Zwischen Feldern und Objekten der Klasse Vector gibt es einen wichtigen Unterschied: s In Feldern kann jeder Typ gespeichert werden. Sie erhalten jeweils einen um Eins erhöhten Index. Vector meineKunden = new Vector(5). Alle dahinterliegenden Elemente werden nach vorne geschoben. s Objekte der Klasse Vector können nur Objekte der Klasse Object speichern. int index) Fügt das Objekt an der Indexstelle in den Vektor ein. und ist dessen Kapazität bereits erschöpft.B. um wieviele Elemente jeweils die Kapazität erhöht werden soll. s removeElement(Object obj) Entfernt das übergebene Objekt aus dem Vector. s setElementAt(Object obj.LE 11 Initialisierung 2.

util. welche Daten in der Warteschlange * verwaltet werden sollen */ class Person { private String Name. 2. die bedient werden wollen. wobei neu zu Warteschlange speichernde Elemente hinten an die Warteschlange angehängt werden (Operation Einfügen) und zu löschende Elemente vorne aus der Warteschlange entfernt werden (Abb. /2/ Durch Aufruf einer Operation Anstellen wird an das Ende der Warteschlange eine Person »angehängt«.19-6: Abstrakte Darstellung einer Warteschlange Eine Warteschlange arbeitet also nach dem FIFO-Prinzip (first in FIFO-Prinzip – first out). ob eine Person bedient wird oder sich anstellt.19-6).19.Beispiel betrieb zu simulieren. die * angibt. /3/ Durch Aufruf einer Operation Bedienen wird die erste Person in der Warteschlange »entfernt«.2 Die Klasse Vector LE 11 Eine Warteschlange (queue) speichert Elemente. class PersonenWarteschlange { 397 .2. Ein entsprechendes Java-Programm sieht folgendermaßen aus: /* Programmname: Warteschlange * Fachkonzept-Klasse: Person * Aufgabe: Erweiterbare Klasse. Einfügen Entfernen Abb. Dazu soll ein Programm mit folgenden Anforderungen geschrieben werden: /1/ Vor einem Schalter steht eine Warteschlange aus Personen. } } /* Programmname: Warteschlange * Fachkonzept-Klasse: PersonenWarteschlange * Aufgabe: Eine PersonenWarteschlange * mit einem Vector realisieren */ import java. den Schalter.Vector. 2. /4/ Durch Aufruf einer Operation Zufall wird per Zufall entschieden. //Konstruktor Person() { Name = "Balzert". Die Firma ProfiSoft erhält von einer Bank den Auftrag.

//}} //Ein Warteschlangen-Objekt erzeugen eineWarteschlange = new PersonenWarteschlange(). //{{DECLARE_CONTROLS .event.19 Datenstrukturen //Attribute private Vector einVektor = new Vector(). //}} public void init() { //{{INIT_CONTROLS .. //Operationen boolean bedienen() //Entfernen { if(einVektor. } } /* Programmname: Warteschlange * GUI-Klasse: WarteschlangeGUI * Aufgabe: Ermöglicht die Manipulation und Anzeige der * Warteschlange */ import java.size() > 0) { einVektor.addActionListener(einAktionsAbhoerer).addActionListener(einAktionsAbhoerer).awt.size(). //}} //{{REGISTER_LISTENERS AktionsAbhoerer einAktionsAbhoerer= new AktionsAbhoerer().LE 11 2. anstellenDruckknopf.*. //Operation von Vector return true. bedienenDruckknopf.addElement(einePerson).*.applet.//Operation von Vector } int getAnzahlElemente() { return einVektor.removeElementAt(0). //8 anonyme Objekte der Klasse Person in die Warteschlange //eintragen 398 . } else return false.. import java.awt. zufallDruckknopf. public class WarteschlangeGUI extends Applet { //Attribute private PersonenWarteschlange eineWarteschlange..addActionListener(einAktionsAbhoerer).. } void anstellen(Person einePerson) //Einfügen { einVektor.*. import java.

i < eineWarteschlange.blue). } } //Innere Klasse class AktionsAbhoerer implements ActionListener { public void actionPerformed(ActionEvent event) { Object object = event. 2. else if (object == zufallDruckknopf) if(Math.0f/2. i < 8.fillRect(10.19-7 zeigt die Benutzungsoberfläche des Warteschlangenprogramms.10).getSource(). repaint().0f) eineWarteschlange. for (int i = 0. } public void paint(Graphics g) { //Grafische Ausgabe der aktuellen Warteschlange g.19.getAnzahlElemente().6.19-7: Benutzungsoberfläche des Programms Warteschlange 399 .drawRect(24 + 8 * i.2. Die Abb. i++) { //Verschiedene Farben ausgeben (kleine Spielerei) //% = Modulo-Operation g. if (object == anstellenDruckknopf) eineWarteschlange. } } } LE 11 % 255.100.bedienen().random() < 1.6). repaint().setColor(Color. 103.(i * 50) (i * 100) % 255)).10. else if (object == bedienenDruckknopf) eineWarteschlange.setColor(new Color((i * 5) %255. 2. Abb.bedienen(). g. else eineWarteschlange.2 Die Klasse Vector for (int i = 0.anstellen(new Person()).anstellen(new Person()). i++) eineWarteschlange.anstellen(new Person()). g.

h.19. die in Containern verwaltet werden. d. zu a: Eine korrekte Vererbungsstruktur liegt vor. Im nächsten Abschnitt wird zunächst das Iterator-Muster vorgestellt.19. Da die Operationen von Vector nicht vererbt werden. Zugriffs-Algorithmen durch Iteratoren eine einheitliche Schnittstelle auf Containern zu bieten. Außerdem ist es möglich.1 Zuerst die Theorie: Das Iterator-Muster Das Iterator-Muster ermöglicht es. wenn eine ist ein-Beziehung von der Unterklasse zur Oberklasse hin besteht. Allgemein betrachtet ist ein Iterator die Verallgemeinerung eines Zeigers.1.19. auf alle Elemente eines Containers nach unterschiedlichen Strategien zuzugreifen. ist eine Vererbung nicht sinnvoll. Über die Operationen getKunde() und insertKunde() wird von der Klasse KundeGUI auf den Kunden-Container zugegriffen.3 und 2. Die ursprüngliche Idee bestand darin. bleibt nur eine Benutzung von Vector in PersonenWarteschlange . Die Klasse Vector verwaltet in Java eine Kollektion. zu b: Da eine Vererbung ausscheidet.4 wurde eine einfache Objektverwaltung mit Hilfe von Feldern implementiert. mitvererbt werden. 2.19.19.1. Da in der Praxis oft das Problem auftaucht. von Elementen. PersonenWarteschlange ist eine spezielle Kollektion bei der nur am Anfang entfernt und nur am Ende angefügt werden darf.3 Iteratoren Bei der Realisierung der PersonenWarteschlange gibt es zwei Alternativen: a Realisierung als Unterklasse von Vector oder b Realisierung durch Benutzung von Vector (unidirektionale Assoziation). 2. Anschließend wird die Realisierung durch Enumeratoren in Java gezeigt. Unter diesem Gesichtspunkt wäre eine Vererbungsstruktur korrekt. eine Sammlung.LE 11 2. Da aber die Zugriffsoperationen. hat man das allgemeine Konzept der Iteratoren entwickelt. ohne die interne Struktur der Container zu kennen. auf die wie bei einem Feld zugegriffen werden kann.3. da der alleinige Zugriff über Entfernen am Anfang und Anfügen am Ende nicht sichergestellt ist. sequentiell zuzugreifen. die 400 Literaturhinweis zu Mustern /Gamma et al. Sie dienen also der Entkopplung von Zugriffs-Algorithmen und Containern. Die Realisierung erfolgte in einer eigenen Container-Klasse. 96/ . auf die Elemente. die einen Zugriff auf jedes Element erlauben.3 Iteratoren das Problem Iteratoren In den Unterabschnitten 2. kann der alleinige Zugriff über die Operationen bedienen() und anstellen() sichergestellt werden.

ob bereits das letzte Element betrachtet wurde. 2. ob noch Elemente in der Sequenz vorhanden sind. s public Object nextElement() Liefert das nächste Objekt in der Sequenz.19. Abb. Die Klasse Iterator definiert Operationen zum Zugriff auf die Elemente im Container. 401 .3. Ein Objekt der Klasse Iterator ist dafür zuständig. Anschließend . 2. Die Operation aktuellesElement() gibt das aktuelle Element des Containers zurück.19. 2.2 Dann die Praxis: Enumeratoren in Java LE 11 Elemente auf verschiedene Arten zu durchlaufen. die bestimmte Filterungsbedingungen erfüllen. die Elemente des Containers zur selben Zeit mehrfach zu traversieren.h. Die zentrale Idee des Iterator-Musters besteht darin.. welche Elemente bereits traversiert wurden. Schnittstelle Die Schnittstelle Enumeration definiert folgende Operationen: s public boolean hasMoreElements() Enumeration Prüft. Es weiß also. Die Operationen der Containerklasse sollen dadurch aber nicht »aufgebläht« werden. Die Trennung des Traversierungsmechanismus vom Container ermöglicht es. die Zuständigkeit für den Zugriff und die Funktionalität zur Traversierung aus dem Container herauszunehmen und sie einem Iterator zuzuteilen. sich das aktuelle Element zu merken. Iteratoren für unterschiedliche Traversierungsarten zu definieren.2 Dann die Praxis: Enumeratoren in Java Java erleichtert die Realisierung des Iterator-Musters in zweierlei Hinsicht: s Java stellt die Schnittstelle Enumeration zur Verfügung. s Einige Datenstrukturen wie Vector und Hashtable stellen eine Operation elements() zur Verfügung. ohne sie als Operationen in der Containerklasse aufführen zu müssen. die als Ergebnis eine Enumeration liefert. d. die start()-Operation setzt das aktuelle Element auf das erste Element..2.19-8 zeigt die Beziehung zwischen der Container-Klasse und der Iterator-Klasse. die weiter()-Operation setzt das aktuelle Element auf das nächste Element im Container und die istFertig()-Operation prüft. aktuellesElement() erzeugeIterator() kann über den Iterator auf die Elemente zugegriffen werden. zu traversieren. Zusätzlich soll es möglich sein.3. Eine Klasse FilterIterator kann beispielsweise den Zugriff ausschließlich auf jene Elemente erlauben. Zum Erzeugen eines Abb.19-8: Iterator Container Iterator-Objekts muß Struktur des Index die Container-Operation Iterator-Musters erzeugeIterator() einen anzahlElemente() start() haengeAn(Element) weiter() passenden Iterator beentferne(Element) istFertig() reitstellen.

Dazu ist es notwendig. KundeGUI einKundenContainer init() ausgebenKunde() ausgebenEinenKunden() eingebenKunde() KundenContainer meineKunden: Vector getObjektreferenz() getKunde() insertKunde() elements() elements() addElement() elementAt() size() setElementAt() Vector Abb.LE 11 Beispiel 2c 2. import java. Da die Klasse Vector bereits eine Enumeration mit der Operation elements() zur Verfügung stellt. daß bei Eingabe eines Sterns (*) bei der Kundennummer zur Ausgabe von Kundendaten alle vorhandenen Kundendaten ausgegeben werden. public class KundenverwaltungGUI extends Applet { //Attribute private KundenContainer einKundenContainer. Vielmehr wird die Enumeration der Klasse Vector benutzt..3 Iteratoren Die Kundenverwaltung aus Beispiel 2a (siehe Abb. //}} //Operationen public void init() { 402 . alle Elemente des Containers sequentiell zu durchlaufen. wird zunächst eine Objektverwaltung mit Hilfe der Klasse Vector realisiert. Auf eine eigene Iteratorklasse wird hier verzichtet.*.applet. private Kunde einKunde. private int KundenNr = 1.19-9).awt. Die Klassen KundeGUI und KundenContainer sehen folgendermaßen aus: /* Programmname: Kundenverwaltung * GUI-Klasse: KundeGUI * Aufgabe: Klasse zur Erfassung von Kundendaten * und zur Ausgabe von Kundendaten * Es ist jeweils die Kundennummer anzugeben (>0) * Wird bei der Kundenausgabe bei der Kundennummer ein * angegeben. 2. Zu diesem Zweck wird in die Klasse KundenContainer eine Operation elements() eingefügt (Abb.*. * dann werden alle vorhandenen Kunden ausgegeben */ import java.19.*. 2. 2.util. //{{DECLARE_CONTROLS ..19-9: Implementierung von IteratorOperationen in Java Die Klasse Kunde bleibt unverändert.19-3) soll so erweitert werden. import java.

nextElement().2.3. } private void eingebenKunde() { LE 11 403 .append(String. //Löschen des Textbereichs //Kundendaten holen //Botschaft an KundenContainer einKundenContainer = KundenContainer. alle Kunden auszugeben if(MerkeText. } } private void ausgebenEinenKunden(Kunde einKunde) { kundenTextbereich.hasMoreElements()) { //Da elements() ein Objekt der Klasse Object //zurückliefert. while (e..valueOf(MerkeText).append(einKunde.19. getAuftragssumme()) + "\n"). } } else { //Objekt mit der eingegebenen Kundennr ausgeben KundenNr = Integer.append(einKunde.. //}} //{{REGISTER_LISTENERS .setText(""). //* bei Kundennummer gibt an.append("Kein Kunde mit dieser Kundenummer vorhanden\n"). if (einKunde != null) ausgebenEinenKunden(einKunde). einKunde = einKundenContainer. if (einKunde != null) ausgebenEinenKunden(einKunde).2 Dann die Praxis: Enumeratoren in Java //{{INIT_CONTROLS setLayout(null). String MerkeText = kundennr2Textfeld. kundenTextbereich..getFirmenname() + "\n"). //}} } private void ausgebenKunde() { kundenTextbereich..getObjektreferenz().valueOf(einKunde.compareTo("*") == 0) { //Alle Objekte ausgeben Enumeration e = einKundenContainer.getFirmenadresse() + "\n"). kundenTextbereich.intValue(). .getKunde(KundenNr). else kundenTextbereich. muß dieses Objekt in Klasse //Kunde gewandelt werden (casting) einKunde = (Kunde)e.elements().getText().

ob ein übergebenes * Objekt vom Typ Kunde null ist oder nicht */ import java. } } //Innere Klasse class AktionsAbhoerer implements java. firmennameTextfeld. else if (object == anzeigenDruckknopf) ausgebenKunde(). private int VektorlaengeDelta = 5. einKundenContainer = KundenContainer. private Vector meineKunden = new Vector (Vektorlaenge.awt.valueOf(auftragssummeTextfeld.ActionEvent event) { Object object = event.intValue().*.einKunde). getText()).getText(). firmenadresseTextfeld. von außen nicht zugreifbar 404 .insertKunde(EingabeNr.event.intValue()).awt.getSource().getText().valueOf(kundennrTextfeld. getText()). if(EingabeNr >= 0) { //Objekt erzeugen einKunde = new Kunde(EingabeNr.19 Datenstrukturen int EingabeNr = Integer. public class KundenContainer { //Attribut private int Vektorlaenge = 20. //Klassen-Attribut private static KundenContainer einKundenContainer = null. //Speichert Referenz auf das einzige Objekt //Konstruktor. //Erzeugtes Objekt im KundenContainer verwalten einKundenContainer.util. if (object == speichernDruckknopf) eingebenKunde(). getObjektreferenz().LE 11 2. } } } /* Programmname: Kundenverwaltung * Container-Klasse: KundenContainer * Aufgabe: Verwaltung von Objekten der Klasse Kunde * Verwaltungsmechanismus: Vector * Muster: Singleton * Iterator: von Vector * Annahmen: Der Aufrufer muß selbst prüfen.event.VektorlaengeDelta). ActionListener { public void actionPerformed(java. Integer.

2. Kunde einKunde) { if (Kundennr >= Vektorlaenge) { //dynamisches Vergrößern des Vektors Vektorlaenge = Vektorlaenge + VektorlaengeDelta.19. kann nur einmal aufgerufen werden return einKundenContainer. //Konstruktor. daß die aufrufenden Klassen (hier: KundeGUI) nicht geändert werden müssen. i < Vektorlaenge.addElement(null). beginnen aber. die die Objektreferenz liefert //Wenn Objekt noch nicht vorhanden.elements(). i < Vektorlaenge. wie bei Klassennamen üblich.setElementAt(einKunde. einhüllende Klassen.size(). i++) meineKunden.elementAt(Kundennr). mit einem Großbuchstaben: 405 . wenn sich die Realisierung eines Containers ändert . Kundennr). dann wird es erzeugt public static KundenContainer getObjektreferenz() { if (einKundenContainer == null) einKundenContainer = new KundenContainer(). i++) meineKunden. auch Hüllenklassen. } //Klassen-Operation.4 Die Hüllklassen für einfache Typen In Java gibt es zu jedem einfachen Typ auch eine entsprechende Hüllklasse. Diese Klassen heißen gleich oder ähnlich wie die zugehörigen Typen. beispielsweise wenn eine Implementierung durch die Klasse Vector ersetzt wird durch eine Implementierung mit Feldern. for (int i = meineKunden. } //Operationen public void insertKunde(int Kundennr. Verpackungsklassen oder wrapper classes genannt.4 Die Hüllklassen für einfache Typen private KundenContainer() { //Vektor initialisieren mit Referenz null for (int i = 0.19. } meineKunden.addElement(null). //Enumerator von Vector } } LE 11 Die Schnittstelle Enumeration sorgt dafür. } public Enumeration elements() { return meineKunden. } public Kunde getKunde(int Kundennr) { return (Kunde)meineKunden.2.

Klasse Float für den Typ float. //Konvertiert eine Gleitkommazahl in eine ganze Zahl Beispiel s Eine Klassen-Operation Typ. die ein neues TypObjekt zurückliefert. //Erzeugt ein Integer-Objekt mit dem Wert eines String-Objekts Beispiel Operationen s Eine Klassen-Operation toString. float reelleZahl = 2. Integer i. die den Wert des Typobjekts in eine Zeichenkette wandelt. Objekte erzeugen zu können. //i ist ein Objekt der Klasse Integer meinVector. Beispiel s Eine TypValue-Operation. //Inhalt des Textfelds n in Text speichern Text = nTextfeld.intValue().toString(reelleZahl).longValue(). wie mit Object -Referenzen umzugehen ist. die den Wert eines einfachen Typs liefert.addElement(i).4 Die Hüllklassen für einfache Typen Aufgaben Konstruktoren Klasse Integer für den Typ int. wie Zeichenkettenumwandlungen und Konstanten für Wertebereichsgrenzen. String Text = Float. Jede Typklasse besitzt folgende Konstruktoren und Operationen: s Einen Konstruktor. initialisiert mit dem //konvertierten String i = Integer.getText(). long ganzeZahlLang = d.19. //Konversion des Objektwertes in einem einfachen Typ int N = i.LE 11 2. //Erzeugt ein Integer-Objekt. Integer i = new Integer("1500"). die dem Typ zugeordnet werden. die die Werte eines einfachen Typs speichern sollen.57f. s Einen Konstruktor. die nur wissen. int N.valueOf(Text). Beispiel 406 . s In Klassen. s Klasse Character für den Typ char usw. s s Beispiel int ganzeZahl = 1500. der zu einem einfachen Typ ein Objekt der Typklasse erzeugt. Integer i = new Integer(ganzeZahl). der aus einem einfachen String-Parameter den Initialisierungswert eines Objekts ermittelt. String Text. Diese Klassen erfüllen zwei Aufgaben: s Bereitstellung eines Platzes für Operationen und Attribute. Double d = new Double(63.valueOf(String s).02E7).

String text. Zeichenketten-Objekte können auf zwei Arten erzeugt werden: s Vereinfachte Syntax mit Initialisierung String text = "Java". über einen Konstruktor aus einem Zeichen-Feld eine Zeichenkette zu erzeugen. Abb. Zum physischen Kopieren benötigt man daher geeignete Operationen. Dem Konstruktor wird eine Zeichenkette übergeben. //vereinfachte Syntax Beispiel Dies ist äquivalent mit: String text = new String("Java"). mit denen sich Zeichenketten aus Feldern mit den Elementtypen char oder byte erzeugen lassen.5 Die String-Klassen von Java Zeichenketten (strings) sind in Java Objekte. Es ist aber möglich. s Klasse StringTokenizer Diese Klasse erlaubt es. 2. text = new String(Zeichenfeld). 'a'}. s Konstruktoren. s Klasse StringBuffer Mit dieser Klasse können veränderbare Zeichenketten angelegt und manipuliert werden.1 Die Klasse String LE 11 Neben diesen allgemeinen Konstruktoren und Operationen besitzt jede Klasse eines einfachen Typs weitere spezielle Konstruktoren und Operationen.19. die nachträglich nicht mehr verändert werden kann. Es reicht nicht aus.String wiesen. Es stehen Operationen zum Einfügen und Anhängen zur Verfügung. Man bezeichnet dies als Konkatenation. char[] Zeichenfeld = {'J'. Auf sie wird über Referenztypen ver. 2.2.1 Die Klasse String Zeichenketten sind Objekte. Beispiel Zeichenketten können mit dem Operator + aneinandergehängt wer. eine Zeichenkette in einzelne Teilketten zu zerlegen.19.19. "Java" + "ist toll!" 407 Beispiel . Zeichenketten sind keine Zeichen-Felder. Es können hierzu Trennzeichen spezifiziert werden.5. Für den Umgang mit Zeichenketten stellt Java drei Klassen zur Verfügung: s Klasse String Mit dieser Klasse können Zeichenketten-Konstanten dargestellt werden. 2. 'v'. 'a'. StringBuffer paßt hierbei die Größe des Puffers dynamisch den Erfordernissen an.Konkatenation + den.19-10 zeigt nochmals alle Operationen der Klasse Integer und einige praktische Anwendungen.5. Dem Konstruktor kann optional ein Anfangswert angegeben werden. eine Referenz einer anderen zuzuweisen. die die einzelnen Teilketten voneinander trennen.

ganze Zahl = i.intValue(). Erzeugung eines einfachen Typs int: int ganze Zahl.LE 11 2.getText())).intValue() 2: 12 (Objekt) 3: 12 (einfacher Typ) Umwandlung einer ganzen Zahl in eine Zeichenkette: Zeit int ganze Zahl :ZahlAIsText: String Text = "12" 1 Integer Wert = 12 toString(int) 1: "12" String ZahlAIsText = Integer.toString (ganzeZahl) Erzeugung eines neuen Objekts der Klasse Integer: Integer i.//ergibtZahl 12 | | Operation der Klasse Integer Objekt der Klasse Integer 1 12 Abb.5 Die String-Klassen von Java Die Klasse Integer Integer Konstruktor Konstruktor Objektoperation Klassenoperation Klassenoperation – – – – – Integer(int) Integer(String) int intValue() String toString(int) Integer valueOf(String) – – – – – wandelt ganze Zahl in Integer-Objekt wandelt Zeichenkette in Integer-Objekt liefert eine ganze Zahl vom einfachen Typ int wandelt einen int-Wert in eine Zeichenkette wandelt eine Zeichenkette in ein Integer-Objekt Umwandlung einer Zeichenkette in eine ganze Zahl: Zeit int ganze Zahl :Integer 12 3 Wert = 12 2 :String Text = "12" 1 eingabe: Textfield Text = "12" String getText() 1: "12" int ganze Zahl = (Integer.19. //Alternativ i = new Integer("12"). i = new Integer (12). 2. Integer i = new Integer(12).19-10: Operationen und Anwendungen der Klasse Integer 408 .valueOf(eingabe.

wenn obj ein gültiges Objekt von String ist und dieselbe Zeichenkette wie dieses Objekt enthält.B. Auch die Klasse zur Darstellung numerischer Typen sowie die Klasse Boolean besitzen die Operation valueOf.toString(). Andere Klassen. String besitzt zwei Varianten der Operation: – Die Variante für Objekte ermittelt die Zeichenkettendarstellung des betreffenden Objekts. Zeichenketten mit Objektverweisen oder ZeichenkettenLiterale einfachen Variablen zu verketten. Ist die Referenz null.Operationen gleichen. indem sie deren Operation toString() aufruft. Beispiel Die Klasse String besitzt eine Reihe von Operationen zum Ver. for(int i = 1. s public int length() length Liefert die Länge der Zeichenkette.19.5. sonst false. neuerText = alterText. die eine Zei. neuerText = alterText + "ist toll". mit denen ein Objekt für den jeweiligen Datentyp konvertiert wird.9. String.booleanValue(). Suchen und Extrahieren von Zeichen: s public boolean equals(Object obj) equals Liefert true.valueOf – Die Variante für Zeichen-Felder nimmt die Konvertierung selbst vor. Text = Integer. Mit toString kann also von allen Objekten eine Zeichenkettendarstellung erzeugt werden. i <= 20. alterText = „Java“. z.valueOf(boolText).append(i + ".4) liefert diese Operation die gespeicherte Zahl konvertiert in eine Zeichenkette zurück. Aus diesen Objekten muß dann der Wert geholt werden.1 Die Klasse String LE 11 Die Operation concat bildet eine neue Zeichenkette durch Anhängen einer zweiten Zeichenkette und arbeitet damit genauso wie der Konkatenationsoperator +. //alternativ Beispiel Alle Java-Objekte besitzen die Operation toString(). Zeichenkette "). 409 . mit der es möglich ist.Syntax für ale. dann ergibt sich die Zeichenkette "null". Beispiel Implizit wird auf alle Nichtliterale die Operation String. String boolText = "true".toString() chenkettendarstellung des jeweiligen Objekts zurückgibt. Die Klasse Integer besitzt dazu die Operation intValue(). Bei den Klassen der einfachen Typen (siehe Abschnitt 2. Bei einigen Klassen wird nur der Name der Klasse zurückgegeben. i++) einTextfeld. //Wandelt einen Text in einen booleschen Wert um boolean boolVariable = Boolean.2. wie Button. Java erlaubt daher eine besondere Syntax für Zeichenketten-Liter.concat("ist toll"). liefern zusätzlich noch eine Zustandsbeschreibung.valueOf angewendet.

Es handelt sich um voneinander unabhängige Klassen mit der gemeinsamen Oberklasse Object.5 Die String-Klassen von Java s public boolean equalsIgnoreCase(String anotherString) Vergleicht zwei Zeichenketten unabhängig von der Groß. Ist das Zeichen nicht vorhanden. indexOf s public int indexOf(int ch) Liefert die Position des ersten Vorkommens des Zeichens ch.19.equals(text)) einTextfeld.1. s public StringBuffer(int length) Erzeugt ein neues Objekt.LE 11 equalsIgnoreCase 2. s int length() Liefert die Länge der momentanen Zeichenkette in Anzahl Zeichen.19. else einTextfeld. Die wichtigsten sind: Operationen s StringBuffer append(String str) Hängt eine Zeichenkette str an das Ende der vorhandenen Zeichenkette an. Diese Klasse ist mit der Klasse String vergleichbar und besitzt teilweise gleichnamige Operationen. s void setCharAt(int index. Die Klasse StringBuffer besitzt vor allem Operationen zum Manipulieren einer Zeichenkette. Alle Operationen können auch auf Zeichenketten-Literale angewandt werden. das sich an der Indexstelle befindet.2 Die Klasse StringBuffer Die Klasse StringBuffer stellt eine veränderbare Zeichenkette zur Verfügung. if ("java". das zunächst length-Zeichen speichern kann. StringBuffer ist aber keine Unterklasse von String oder umgekehrt. charAt s public char charAt(int index) Gibt das Zeichen zurück. dann wird –1 zurückgeliefert. String str) Fügt eine Zeichenkette str an der Stelle offset ein. Objekte können mit folgenden Konstruktoren erzeugt werden: s public StringBuffer() Konstruktoren Erzeugt ein neues Objekt ohne Vorbesetzung. char ch) Ersetzt das Zeichen an der Position index durch das Zeichen ch. Der Index geht von 0 bis length() . 410 . das mit dem Wert von str initialisiert wird.append ("Ungleich"). StringBuffer 2. s StringBuffer insert(int offset.append("Gleich"). s public StringBuffer(String str) Erzeugt ein neues Objekt.5. Beispiel String text = "Java".und Kleinschreibung.

werden Trennzeichen als eigene Teil- Zeichenketten von der Operation nextToken() zurückgeliefert. public class Rechner { 411 .*.nextToken(). " . Folgende Konstruktoren stehen zur Verfügung: s public StringTokenizer(String str) Erzeugt ein neues Objekt für str mit den voreingestellten Trenn.3 Die Klasse StringTokenizer Die Klasse StringTokenizer ermöglicht es. Die wichtigsten Operationen sind: s public String nextToken() Liefert die nächste Teil-Zeichenkette."). s public StringTokenizer(String str. String delim.util. String Vorname = Teilkette. Ob Trennzeichen als eigene Operationen Teil-Zeichenkette betrachtet oder überlesen werden.19. eine Zeichenkette in einzelne Teilketten zu zerlegen. Diese werden nicht als Teil-Zeichenketten betrachtet und überlesen.2.19. Nach dem Aufruf eine der Konstruktoren können die Teilketten mit nextElement oder nextToken abgerufen werden. Beispiel Die Arbeitsweise der Klasse StringTokenizer wird hier am Beispiel Beispiel eines Taschenrechners gezeigt. hängt vom Konstruktoraufruf ab.5.nextToken(). String delim) Erzeugt ein neues Objekt für str. String text = "Name. Vorname". /* Programmname: Taschenrechner * Fachkonzept-Klasse: Rechner * Aufgabe: einfacher Taschenrechner ohne Prioritäten */ import java. Tabulator. Diese Trennzeichen werden nicht als Teil-Zeichenketten betrachtet und überlesen. s public String nextToken(String delim) Setzt die Trennzeichenmenge auf die Zeichen in delim und liefert die nächste Teilkette zurück. wenn noch weitere Teilketten vorhanden sind.Konstruktoren zeichen Leerzeichen. Dazu ist es nötig. Zeilenvorschub und Zeilenrücklauf. String Name = Teilkette.3 Die Klasse StringTokenizer LE 11 2. StringTokenizer Teilkette = new StringTokenizer(text. die die einzelnen Teilketten voneinander trennen. Trennzeichen (delimiter) zu spezifizieren. s public StringTokenizer(String str. boolean returnTokens) Wenn returnTokens true ist. Es ist nicht möglich. ohne gleichzeitig die nächste Teilkette zu lesen. Als Trennzeichen dienen die einzelnen in delim enthaltenen Zeichen.5. s public boolean hasMoreElements() Liefert true. eine neue Trennzeichenmenge festzulegen.

break.floatValue()..5 Die String-Klassen von Java //Attribute private StringTokenizer einTokenizer.*. OperatorAlsString. float Ergebnis = Float.hasMoreElements()) { OperatorAlsString = einTokenizer. switch (OperatorAlsZeichen) { case '+': Ergebnis += naechsterWert. case '*': Ergebnis *= naechsterWert.nextToken(). public class RechnerGUI extends Applet { //Attribute private Rechner einRechner = new Rechner(). case '/': Ergebnis /= naechsterWert. } } return String.. break. //{{DECLARE_CONTROLS java.valueOf(Ergebnis).nextToken(). //Operationen public String getErgebnis(String Eingabe) { String ZahlAlsString. "+-*/". //Umwandlung einer Zeichenkette in ein Zeichen char OperatorAlsZeichen = OperatorAlsString. float naechsterWert = Float. } } /* Programmname: Taschenrechner * GUI-Klasse: RechnerGUI * Aufgabe: Die Berechnung wird ausgelöst durch Drücken * des Berechnen-Knopfes oder durch Drücken der Enter-Taste */ import java. //true = Trennzeichen werden uebergeben einTokenizer = new StringTokenizer(Eingabe..valueOf(ZahlAlsString). true). //}} 412 .applet.Label eingabeFuehrungstext. . //erste Zahl als Teil-Zeichenkette geben lassen ZahlAlsString = einTokenizer. while(einTokenizer. break.nextToken().awt..charAt(0).LE 11 2.awt. break.19. ZahlAlsString = einTokenizer. case '-': Ergebnis -= naechsterWert.valueOf(ZahlAlsString). import java.floatValue(). //}} //Operationen public void init() { //{{INIT_CONTROLS .*.

VK_ENTER) { String Eingabe = eingabeTextfeld.getErgebnis(Eingabe)).getErgebnis(Eingabe)). berechnenDruckknopf.event.KeyEvent event) { if(event.event.event. if(Eingabe.getText(). } } } }//Ende RechnerGUI LE 11 413 .setText (einRechner.2.getText().compareTo("") != 0) ergebnisTextfeld.KeyAdapter { public void keyReleased(java.event.setText (einRechner.ActionEvent event) { String Eingabe = eingabeTextfeld. } } class TastaturAbhoerer extends java. //}} }//Ende init //Innere Klassen class AktionsAbhoerer implements java.compareTo("") != 0) ergebnisTextfeld. if(Eingabe. TastaturAbhoerer einTastaturAbhoerer = new TastaturAbhoerer(). eingabeTextfeld.5.3 Die Klasse StringTokenizer //{{REGISTER_LISTENERS AktionsAbhoerer einAktionsAbhoerer = new AktionsAbhoerer().awt.KeyEvent.addActionListener (einAktionsAbhoerer).ActionListener { public void actionPerformed(java.awt.getKeyCode() == java.event.awt.19.awt.addKeyListener(einTastaturAbhoerer).awt.

s public Object pop() throws EmptyStackException pop Das oberste Element wird vom Stapel entfernt und zurückgegeben. den Vektor als Stapel zu behandeln.19. wird eine Ausnahme ausgelöst. Kellerspeicher findet man auch im täglichen Leben. daß die Klasse Stack Unterklasse der Klasse Vector ist. die eine Unterklasse der Klasse Vector ist.6 Die Klasse Stack Keller. Diese Beispiele zeigen deutlich die Eigenschaften von Kellerspeichern. z. Beim Erzeugen eines Kellers wird seine Größe mit Null initialisiert: Stack meinKeller = new Stack().LE 11 2. Dies hat dieselbe Wirkung wie addElement(item) in der Klasse Vector.19-12). muß auch als erstes wieder entnommen werden. ist es auch hier nicht korrekt. Es kann immer nur auf das oberste Objekt zugegriffen werden.19 Datenstrukturen 2. die es erlauben. Stapel Bei einer Reihe von Problemen wird ein sogenannter Kellerspeicher (push down store) oder Stapel (stack) benötigt. Ein Kellerspeicher kann mit den beiden folgenden Operationen – und nur mit diesen – bearbeitet werden: s Neues Objekt im Keller aufbewahren (push) s Oberstes Objekt aus Keller entnehmen (pop) oberste Münze 5 oberster Korb Münzen Einkaufskörbe Feder Abb. Folgende Operationen stehen zur Verfügung s public Object push(Object item) Operationen push item wird oben auf den Stapel gelegt. 2. Ist der Stapel leer.19-12: Münzenaufbewahrung LIFO Klasse Stack Dieses Speicherverfahren bezeichnet man auch als LIFO-Prinzip (last in – first out). 414 .19-11: Aufbewahrung von Einkaufskörben Abb. 2.B. In Java wird der Kellerspeicher durch die Klasse Stack realisiert. das zuletzt in den Kellerspeicher gebracht wurde. das Objekt. Wie bei der Warteschlange bereits erläutert. bei der Aufbewahrung von Einkaufskörben im Supermarkt oder beim Aufbewahren von Münzen für Parkuhren (siehe Abb. 2. Die Klasse Vector wird um fünf Operationen erweitert.19-11 und 2. Dies ist ein schlechter Klassenentwurf in Java.

h. z.B. z. dann gibt diese Operation den Abstand vom oberen Rand des Stapels bis zum am weitesten oben liegenden Auftreten des Objekts zurück. bei denen die Abarbeitungsreihenfolge durch Prioritäten und Klammern beschrieben wird. eingeführt. s public boolean empty() Ist der Stapel leer. in Anweisungen. Die Umwandlung von Anweisungen. Von dem polnischen Logiker Lukasiewicz wurde um 1925 die Postfix-Notation.19. aber nicht entfernt. dann wird true übergeben. Der Vorteil dieser Darstellung liegt darin. Das oberste Element hat den Abstand 1.2.in Postfixnotation Die Wagen gelangen nach folgenden Regeln von A nach C: 1 Wagen mit Operanden gelangen direkt von A nach C. der Operator befindet sich zwischen den Operanden. kann durch ein Gleisdreieck veranschaulicht werden (Abb. Jeder Wagen steht für ein Symbol. a + b. 2.B.19-13). Auf dem Gleis befindet sich ein Zug mit der umzuwandelnden Anweisung. '(' ')' und Zeilenende werden mit dem letzten Wagen in B verglichen und unter Beachtung folgender Regeln rangiert: 415 * [ . d.6 Die Klasse Stack s public Object peek() throws EmptyStackException LE 11 peek Das oberste Element des Stapels wird gelesen und zurückgegeben. Tiefenkeller B Abb. 2. daß keine Klammern mehr notwendig sind. dann vorher letzter Wagen von B nach C. 3 5 / ( 2 + 3 ) ] Neustadt C (Ausgabe: Postfix-Notation) Altenmarkt A (Eingabe: Infix-Notation) Stellwerk Prioritätenvergleich: Wenn letzter Wagen in B größere oder gleiche Priorität wie Wagen von A hat. Ist der Stapel leer. um die Abarbeitungsreihenfolge zu steuern. bei denen sich die Ausführungsreihenfolge automatisch beim Lesen von links nach rechts ergibt.Beispiel nannten Infix-Notation geschrieben. 2 Wagen mit Operatoren einschl. Oft heißt diese Operation auch top(). auch umgekehrte polnische Notation genannt. a b +.19-13: Gleisdreieck: Umwandlung von Infix. Normalerweise werden Anweisungen mit Ausdrücken in der soge. Bei dieser Notation steht der Operator hinter den Operanden. dann wird eine Ausnahme ausgelöst. s public int search(Object o) Ist ein Objekt o im Stapel enthalten.

416 . true). OperatorAlsZeichen = NaechsterToken. break.util.pop(). break.charAt(0). String Ergebnis = "".compareTo("(") != 0) Ergebnis = Ergebnis + StapelToken. case ')': do { StapelToken = (String)BKeller. case '/':verarbeiteMulDiv().*. case '*':verarbeiteMulDiv(). private Stack BKeller = new Stack(). String NaechsterToken.nextToken(). bis '(' angetroffen wird. wenn die Priorität seines Operators größer oder gleich der Priorität des Wagens auf A ist. StapelToken. if(StapelToken.in Postfix-Ausdruck */ import java. case '-':verarbeitePlusMinus().break. break. switch(OperatorAlsZeichen) { case '+':verarbeitePlusMinus().19 Datenstrukturen Ein Wagen mit – '(' kommt nach B – ')' veranlaßt das Zurückschieben aller Wagen von B nach C so lange. Das Ende der Eingabe veranlaßt das Zurückschieben aller Wagen von B nach C. break. StapelTokenZeichen. class Notation { //Attribute private StringTokenizer einTokenizer. – Operator kommt von A nach B. Beide Wagen mit Klammern werden aus dem Verkehr gezogen.LE 11 2. "+-*/()". //Eingabestring in Tokens zerlegen und nach festen Regeln //auf StackB und den Ausgabestring verteilen. //Operationen public String getPostfix(String Eingabe) { einTokenizer = new StringTokenizer(Eingabe. do { NaechsterToken = einTokenizer. case '(':BKeller. Die Java-Fachkonzept-Klasse zur Lösung dieses Problems sieht folgendermaßen aus: /* Programmname: Notationsumwandlung * Fachkonzept-Klasse: Notation * Aufgabe: Umwandlung: Infix. char OperatorAlsZeichen. Der letzte Wagen in B gelangt jedoch vorher nach C.push(NaechsterToken).

} BKeller.2.pop(). } }//Ende Notation LE 11 Die Benutzungsoberfläche zeigt Abb.19. } private void verarbeiteMulDiv() { if(!BKeller. break. if((StapelTokenZeichen == '+') || (StapelTokenZeichen == '-') || (StapelTokenZeichen == '*') || (StapelTokenZeichen == '/')) Ergebnis = Ergebnis + (String)BKeller. } BKeller.pop().empty()) { StapelToken = (String)BKeller. return Ergebnis.empty()) Ergebnis = Ergebnis + (String)BKeller.pop().charAt(0). StapelTokenZeichen = StapelToken.push(NaechsterToken).charAt(0). Abb. StapelTokenZeichen = StapelToken. 2. } private void verarbeitePlusMinus() { if(!BKeller. while(!BKeller. //Diese werden nun in den Ergebnisstring geschoben. if((StapelTokenZeichen == '*') || (StapelTokenZeichen == '/')) Ergebnis = Ergebnis + (String)BKeller. }//Ende switch } while(einTokenizer.19-14.peek(). default: Ergebnis = Ergebnis + (String)NaechsterToken + " ".19-14: Benutzungsoberfläche des Programms Notationsumwandlung 417 .peek().push(NaechsterToken).empty()) { StapelToken = (String)BKeller. 2. //Auf Keller B können noch Operatoren liegen.6 Die Klasse Stack } while(StapelToken.compareTo("(") != 0). break.hasMoreElements()).

Es soll ein Programm zur Verwaltung eines Übersetzungslexikons erstellt werden.. z. Diese Abbildung kann durch Anwendung des Hash-Verfahrens erfolgen. 2. die eine möglichst gleichmäßige Verteilung der Schlüssel auf den Bereich der Tabellenindizes vornimmt.19. 418 . In diesem Beispiel ist das deutsche Wort Stapel der Schlüssel und das englische Wort stack der Datensatz. Wort Schlüssel 0 1 2 Warteschlange 3 Stapel 4 Feld 5 6 7 Keller 8 MaxIndex 9 stack queue stack array Übersetzung Datensatz Abb.LE 11 2.} Menge aller Schlüssel (hier: Menge aller Wörter) Beispiel 4 Für den Buchstaben Z ergibt sich folgender Index: Die Ordnungszahl von Z entsprechend dem ASCII-Code ist 90. Zum Speichern bietet sich eine Tabelle an.B. 1.. Stapel – stack. Man spricht von Streuspeicherung.. einen Mischmasch machen Beispiel 3a Hash-Verfahren sind Speicherungs. Hat die Tabelle 10 Einträge und ist damit N = 11¸dann ist H(Z) = 90 mod 11 = 2. Jeder Lexikoneintrag besteht aus einem Wort und seiner Übersetzung. 2.7 Die Klasse Hashtable Hashing = zerhacken. H soll effizient berechenbar sein. Ein einfacher und guter Ansatz ist folgende Funktion: H (ki) = Ord (ki) mod N mit A = (0.19 Datenstrukturen 2. wird eine Hash-Funktion H (Transformationsfunktion) benötigt. die als Feld realisiert ist (Abb.und Suchverfahren.19-15). Da die Menge der möglichen Schlüssel (hier: alle Wörter) sehr viel größer als die Menge der verfügbaren Tabellenindizes ist. N – 1) Menge aller Adressen (hier: Index der Tabelle) N = möglichst Primzahl K = {k1..19-15: Beispiel einer Streuspeicherung Index Warteschlange Stapel Keller Feld Verkettung Das Problem besteht darin.. wie man die Schlüssel (im Beispiel die deutschen Wörter) auf den Tabellenindex 0 bis 9 abbildet. bei denen die Adressen von Datensätzen aus den zugehörigen Schlüsseln errechnet werden. . k2 .

eine große Wertemenge der Schlüssel auf einen viel kleineren Bereich abzubilden. Die Klasse Hashtable ist Unterklasse der abstrakten Klasse Dictionary. Werden mehrere Schlüssel auf den gleichen Index abgebildet. Im Beispiel 3a ergibt Hash-Funktion für »Warteschlange« und »Feld« dieselbe Tabellenposition. werden untereinander durch Referenzen verkettet. dann ergibt sich der Index nach folgendem Algorithmus: h = 0. den Speichern neuen Datensatz mit seinem Schlüssel an der ersten folgenden freien Stelle zu speichern. Beim Wiederauffinden von Werten wird zuerst der Wert der Hash. if (Zeichen == leer) break. } Ein Problem tritt auf. Stimmen die Schlüssel überein. Um den Wert eindeutig zu finden. Für beide Felder sind beliebige Objekte zulässig.19. Beispielsweise ermittelt die Operation int hashCode() der Klasse String von der gespeicherten Zeichenkette den ganzzahligen Hash-Code. while(true) { NaechstesZeichen(Zeichen). Durch dieses Verfahren ist es möglich. hier Tabellenposition 4. hashCode() liefert das Ergebnis der Hash-Funktion eines Objekts. Die Hashtable wird automatisch vergrößert.Suchen Funktion des Schlüssels ermittelt und der Wert an dem so errechneten Index gesucht. Es wird daher die nächste freie Position gesucht. Alle Einträge. deren Index auf dieselbe Tabellenposition weisen. Alle Objekte.2. die als Schlüssel dienen. müssen die Operationen hashCode() und equals() implementieren. deren Einträge jeweils aus einem Schlüssel. Übersteigt die Zahl der Einträge in der Hashtable das Produkt aus Füllungsfaktor und momentaner 419 . besteht darin. Diese gesamte Verwaltungsarbeit erledigt in Java die Klasse Hashtable Hashtable. Beim Eintrag von »Feld« ist diese Position durch »Warteschlange« bereits besetzt. Ab dem berechneten Index wird jeder Schlüssel in der Reihenfolge der Verkettung mit dem gesuchten Schlüssel verglichen. wenn der so errechnete Index bereits belegt ist. verwendet man die mit den Werten abgespeicherten Schlüssel. Der Füllungsfaktor soll zwischen 0 und 1 liegen. solche Kollisionen zu lösen. Eine Möglichkeit. wenn ein bestimmter Anteil der maximal möglichen Einträge belegt ist. hat man damit den gesuchten Wert noch nicht gefunden.7 Die Klasse Hashtable LE 11 Besteht ein Wort aus mehreren Zeichen.Effizienz pazität (capacity) und der Füllungsfaktor (loadFactor). Zwei Parameter bestimmen die Effizienz einer Hashtable: die Ka. h = (256 * h + Ord(Zeichen)) % n. dann hat man den gesuchten Wert gefunden. und eine entsprechende Referenz von 2 nach 4 eingetragen.und einem Datenobjekt bestehen. Hashtable implementiert eine Suchtabelle.

Neben diesen Operationen stellt die Klasse Hashtable weitere Operationen zur Verfügung. wird diesem Schlüssel der neue Wert zugeordnet.19 Datenstrukturen Kapazität. Beispiel 3b Das Java-Programm für das Beispiel 3a sieht folgendermaßen aus: /* Programmname: Lexikon * Fachkonzept. kann auch ein Exemplar jeder Klasse der Operation put als Parameter übergeben werden. s public Hashtable(int initialCapacity) Erzeugt ein neues Hashtable-Objekt mit maximal initialCapacityEinträgen und einem Füllungsfaktor von 0. Die Implementierung von hashCode() sollte für jeden Schlüssel eine möglichst eindeutige Zahl liefern. Object value) hashCode() equals() Ein neues Objekt wird in die Hashtable eingetragen.75. Ist dies der Fall. s public Hashtable(int initialCapacity. Der alte Wert wird überschrieben und von put als Ergebnis zurückgegeben. Der Operation equals() kann jedes Objekt übergeben werden. Sie muß true liefern. dann kann die Wertüberprüfung stattfinden.und GUI-Klasse: LexikonGUI * Aufgabe: Ein Lexikon mit einer Hashtable verwalten */ 420 . Operationen put s public Object put(Object key.LE 11 2. wenn ein Objekt als Schlüssel verwendet wird. Ist der übergebene Schlüssel noch nicht in der Tabelle. Die Standardklassen in Java besitzen bereits die Operationen hashCode() und equals(). muß sichergestellt sein. Um die Werte von zwei Objekten vergleichen zu können. Konstruktoren s public Hashtable() Erzeugt ein neues Hashtable-Objekt mit maximal 100 Einträgen und einem Füllungsfaktor von 0. damit man sie variabel halten kann. Die Daten werden als Object übergeben. allerdings auf Kosten einer längeren Suchzeit.75. daß das übergebene Objekt vom richtigen Typ ist. das keine Unterklasse einer Standardklasse ist. liefert get als Ergebnis null. Wird ein Schlüssel angegeben. mit denen der aktuelle Inhalt der Hashtable abgefragt werden kann. Wurde kein Wert mit dem Schlüssel key gespeichert. dann wird die Kapazität mit der Operation rehash() erhöht. wenn die Werte des übergebenen Objekts mit den eigenen identisch sind. Diese Operationen müssen nur dann neu geschrieben werden. Große Füllungsfaktoren nutzen den Speicher besser aus. float loadFactor) Erzeugt ein neues Hashtable-Objekt mit maximal initialCapacityEinträgen und dem angegebenen loadFactor. der bereits in der Hashtable vorhanden ist. dann wird null zurückgeliefert. s public Object get(Object key) get Die mit der Operation put vorher gespeicherten Objekte können mit get wieder ausgelesen werden. Da jede Klasse in Java eine Unterklasse von Object ist.

else uebersetzen().awt.util. get(Suchbegriff)). else uebersetzen().2.event. import java.Hashtable... } } class TastaturAbhoerer extends java. if (object == uebersetzungTextfeld) speichern().getSource()..*.setText("Nicht gefunden!"). } //Innere Klassen class AktionsAbhoerer implements java.setText(""+Schluessel. hashcodeTextfeld. einLexikon.event. import java.getText().applet.event.awt.getText().ActionListener { public void actionPerformed(java.*. //Import der Klasse Hashtable public class Lexikon extends Applet { //Attribute private Hashtable einLexikon = new Hashtable(). //Operationen public void init() { .getSource(). . else uebersetzung2Textfeld.KeyEvent event) { Object object = event.19.getText()).put(Schluessel.get(Suchbegriff) != null) uebersetzung2Textfeld.awt.hashCode()). if (object == speichernDruckknopf) speichern().ActionEvent event) { Object object = event.KeyAdapter { public void keyReleased(java.awt.uebersetzungTextfeld. } public void speichern() { //Eingabe eines neuen Wortpaares Begriff . } } } 421 LE 11 .awt. } public void uebersetzen() { String Suchbegriff = stichwortTextfeld.event.setText((String)einLexikon.. if(einLexikon.7 Die Klasse Hashtable import java.Übersetzung String Schluessel = lexikonTextfeld.

Zeichenkette Aneinanderreihung von einzelnen Zeichen. string →Zeichenkette. die über die einfachen Typen einer Programmiersprache hinausgehen. Streuspeicherung →Hash-Verfahren. bei dem das erste gespeicherte Element auch zuerst dem Speicher wieder entnommen wird (→ Warteschlange). Iterator-Muster Faßt in einer IteratorKlasse Traversierungsoperationen zusammen. Warteschlange Datenstruktur mit den Operationen Einfügen und Entfernen.19 Datenstrukturen Die Abb. Keller Datenstruktur mit den Operationen push (Ablegen in den Keller) und pop (Entfernen aus dem Keller). die die erzeugten Objekte einer Klasse oder mehrerer anderer Klassen verwaltet.LE 11 2.und Suchverfahren.19-16: Benutzungsoberfläche des Lexikons array →Feld. In Java durch die Schnittstelle Enumeration unterstützt. FIFO-Prinzip (first in – first out) Speicherungsprinzip. Konkatenation Operation auf StringObjekten. realisiert das →LIFO-Prinzip. 2. der im allgemeinen erst zur Laufzeit berechnet wird. Feld Erlaubt es. Objekte und Attribute vom gleichen Typ zu einer Einheit zusammenzufassen. um alle Elemente einer →Container-Klasse zu durchlaufen. queue →Warteschlange. Abb. Datenstrukturen Zur Lösung bestimmter Problemklassen werden geeignete Datenstrukturen benötigt. Auf jedes Element eines Feldes wird über einen Index zugegriffen. stack →Keller. bei dem das letzte gespeicherte Element zuerst aus dem Speicher wieder entfernt wird (→Keller). faßt zwei String-Objekte zu einem String-Objekt zusammen. Singleton-Muster Sorgt dafür. in Java werden Zeichenketten durch Objekte dargestellt. Folgende Datenstrukturen werden häufig benötigt: 422 . bei denen Schlüssel anhand einer Hash-Funktion möglichst gleichmäßig auf Tabellenindizes umgerechnet werden. LIFO-Prinzip (last in – first out) Speicherungsprinzip. Container-Klasse eigenständige Klasse. realisiert das →FIFO-Prinzip. daß von einer Klasse nur genau ein Objekt erzeugt werden kann.19-16 zeigt die Benutzungsoberfläche. Stapel →Keller. 2. Hash-Verfahren Speicherungs.

initialisiert? double Feld1[][][]. Container-Klassen unter Einsatz des SingletonMusters programmieren können. 423 Klausur-Aufgabe 30 Minuten . x. die Klassen Vector. stack) mit den Operationen push und pop zur Realisierung des LIFO-Prinzips. //1 Feld1 = new double[10][10][]. Das zugrundeliegende Muster wird als Iterator-Muster bezeichnet. Hashtable sowie die Hüllklassen für einfache Typen (wrapper classes) problemgerecht beim Schreiben von Java-Programmen einsetzen können. Stack. int b[]) x. die dann auf die entsprechende Container-Klasse zugreift. Helm R.. Sequentielle Iterationen über Elemente in Containern werden in Java durch die Schnittstelle Enumeration unterstützt. a. s Streuspeicherung zur Abbildung von Schlüsseln auf Tabellenindizes (Hash-Verfahren). int [][][] Feld2. Zur Verwaltung von Objekten werden Container-Klassen verwen.. a Welche der folgenden Felder sind korrekt deklariert bzw. String.20]. String. Traversierungsoperationen werden oft in einer eigenständigen Iterator-Klasse Iterator-Klasse zusammengefaßt. b. Johnson R.. StringBuffer. Die Schnittstelle Enumeration für geeignete Beispiele imple-mentieren können. die Klassen Vector. Alle diese Datenstrukturen werden in Java durch geeignete Klassen unterstützt. StringBuffer.Zusammenhänge/Literatur/Aufgaben s s LE 11 Feld (array) Zeichenkette (string) mit der wichtigen Konkatenations-Operation. 96/ Gamma E. //3 b Betrachten Sie die folgende Java-Operation: public { int x = a = b = } void tauscheFeld(int a[]. //2 Analytische Aufgaben Muß-Aufgabe 20 Minuten boolean Feld3[10. Vlissides J. daß von diesen Container-Klassen nur genau ein Objekt erzeugt werden kann. Feld2 = new [][10]. Hashtable sowie die Hüllklassen für einfache Typen (wrapper classes) problemgerecht beim Schreiben von Java-Programmen einsetzen können.. Funktioniert diese Implementierung? Begründen Sie Ihre Antwort. Bonn: AddisonWesley 1996 Zitierte Literatur 1 Lernziel: Felder. String Tokenizer. /Gamma et al. String Tokenizer. Stack. s Keller (Stapel.Container-Klassen det. um Zeichenketten zu verknüpfen. wobei die Anwendung des Singleton-Musters dafür sorgt. Entwurfsmuster. s Warteschlange (queue) mit den Operationen Einfügen und Entfernen zur Realisierung des FIFO-Prinzips. 2 Lernziele: Felder.

elemente(). } public Object naechstesElement() { return e. private Vector meineElemente = new Vector(VektorlaengeDelta. private Enumeration e = meineElemente.. Vektorlaenge). } .hasMoreElements(). Element einElement.. .hasMoreElements()) { einElement= (Element)einElementeContainer. } } } 424 .. public boolean hatMehrElemente() { return e. nämlich alle Elemente des Objektes einElementeContainer auszugeben? Was müßte für eine korrekte Funktionsweise der Operation hinzugefügt werden? public class ElementverwaltungGUI { private ElementeContainer einElementeContainer.nextElement().nextElement().. public static Container getObjektreferenz() { if (einElementeContainer=null) { einElementeContainer = ElementeContainer(). } return einElementeContainer. } } b Liefert die folgende Operation das gewünschte Ergebnis. private ElementeContainer einElementeContainer.LE 11 Aufgaben a Welche syntaktischen und semantischen Fehler enthält folgendes Programm: public class ElementeContainer implements Enumeration { private int Vektorlaenge = 20. private int VektorlaengeDelta = 0.. private void ausgebenElemente() { while (einElementeContainer. //Ausgeben des Elements ..

Wie sähe die Realisierung im Büro in Wirklichkeit aus? 4 Lernziele: Die Java-Konzepte für Felder. die Klassen Vector. und aus welchem Grund. /3/ Die einzelnen Raster werden dabei unterschiedlich bewertet. die zur Speicherung eines Schachfeldes notwendig sind. so wandert z. Hashtable sowie die Hüllklassen für einfache Typen (wrapper classes) problemgerecht beim Schreiben von Java-Programmen einsetzen können. Realisieren Sie in Java die Datenstrukturen. Felder. Erläutern Sie anschließend. a Realisieren Sie in Java die Sortierung des Aktenstapels nach Anfangsbuchstaben. String. Stack. Die Akten müssen nun nach Anfangsbuchstaben an verschiedene Sachbearbeiter verteilt werden. String. die Klassen Vector. String Tokenizer. Zeichenketten und Klassen von einfachen Typen erklären und darstellen können. Verwenden Sie ein Feld von 26 Zielstapeln (für jeden Buchstaben einen). Keller und Streuspeicherung mit Hilfe von Java-Standardklassen realisieren können. indem Sie die Akten vom unsortierten Stapel entnehmen und auf einem Zielstapel wieder ablegen. Stack. müssen dafür aber die Stapel häufiger durchsuchen. b Realisieren Sie in Java die Sortierung des Aktenstapels nach Anfangsbuchstaben. indem Sie die Akten vom unsortierten Stapel entnehmen und auf einem Zielstapel wieder ablegen. Sinnvoll ist eine Unterteilung in Bauteilzonen. die Akte »Balzert« an den Sachbearbeiter des Buchstaben »B«. Die Akten werden anhand der Nachnamen der betroffenen Fälle unterschieden. /2/ Ziel des Algorithmus ist es. vom Startpunkt zum Endpunkt die kürzeste Verbindung auf rechtwinkeligem Weg zu finden. String. StringBuffer. Verwenden Sie hierbei eine Klasse »Schachfigur«. Keller und Streuspeicherung anhand von Beispielen erläutern können. falls der Anfangsbuchstabe A ist. Sich in Java-Standardklassen einarbeiten und diese problemgerecht einsetzen können.Aufgaben 3 Lernziele: Die Java-Konzepte für Felder. Die Datenstrukturen Warteschlange. 5 Lernziele: Felder. Schreiben Sie eine Java-Anwendung zur automatischen Entflechtung von Leiterplatten. Sperrzonen. ein komplettes Programm zu schreiben. Sie benötigen hierzu also nur drei Stapel. Felder. Es soll folgender von Lee entwickelter Algorithmus verwendet werden: /1/ Die Leiterplatte wird in kleine feste Zellen eingeteilt. Andernfalls legen Sie die Akten auf einem Zwischenstapel ab. Leiterbahnzellen und freie Zellen. die man von ihr aus zum Erreichen des Startpunktes benötigt. Die Datenstrukturen Warteschlange. welche Datenstrukturen Sie verwendet haben. String Tokenizer. Hashtable sowie die Hüllklassen für einfache Typen (wrapper classes) problemgerecht beim Schreiben von Java-Programmen einsetzen können. StringBuffer. Auf dem Schreibtisch eines Amtes hat sich ein Stapel mit Akten angehäuft. Es ist nicht notwendig. Zeichenketten und Klassen von einfachen Typen erklären und darstellen können. StringTokenizer. /4/ Jeder freien Rasterzelle wird bei der Suche die Anzahl der Schritte zugeordnet. StringBuffer. Anschließend durchsuchen Sie den Zwischenstapel auf den Buchstaben B usw. c Vergleichen Sie beide Sortierverfahren anschaulich. die Klassen Vector.B. Hashtable sowie die Hüllklassen für einfache Typen (wrapper classes) problemgerecht beim Schreiben von Java-Programmen einsetzen können. 425 LE 11 Konstruktive Aufgaben Muß-Aufgabe 60 Minuten Klausur-Aufgabe 30 Minuten Muß-Aufgabe 180 Minuten . Stack.

Keller und Streuspeicherung mit Hilfe von Java-Standardklassen realisieren können. 8 Lernziele: Die Datenstrukturen Warteschlange. die es ermöglicht. so bricht der Vorgang ab. Verwenden Sie eine geeignete Datenstruktur. Keller und Streuspeicherung mit Hilfe von Java-Standardklassen realisieren können. deren Name mit Ba beginnt. ein Layout einzugeben und den Algorithmus zu starten. Stack. bei denen der Wortbestandteil mit dem Kundennamen übereinstimmen. Erweitern Sie das in Abschnitt 2. Anschließend soll dieser Stapel ausgewertet werden. String. Den freien Nachbarzellen der durch die Zahl 1 gekennzeichneten Zellen wird im nächsten Schritt eine 2 zugeordnet usw. M??er bedeutet. z. StringBuffer. und geben Sie diese Worte dann in umgekehrter Reihenfolge aus. die Klassen Vector. /3/ Steht im Wortbestandteil ein ?. /6/ Es soll eine geeignete grafische Darstellung der Leiterplatte erfolgen. daß zusätzlich zur Übersetzung eine Liste von Synonymen. in einem String abgelegt werden kann. sondern die Tokens wieder auf einem Stapel abgelegt werden. /2/ Die Ergänzung eines Wortbestandteils um einen Stern (*) gibt an. 6 Lernziele: Die Datenstrukturen Warteschlange. Hashtable sowie die Hüllklassen für einfache Typen (wrapper classes) problemgerecht beim Schreiben von Java-Programmen einsetzen können.19. String. Trennen Sie einen eingegebenen Satz in Worte auf. indem man immer ein Feld mit einer niedrigeren Bewertung sucht. daß Meyer und Maier als Kunden ausgegeben werden.B. daß kein Ergebnisstring erzeugt wird. Die Schnittstelle Enumeration für geeignete Beispiele implementieren können Sich in Java-Standardklassen einarbeiten und diese problemgerecht einsetzen können.B. daß anstelle des Sterns beliebig viele und verschiedene Buchstaben stehen können (wildcard).7 angegebene Beispiel Lexikon so. Verändern Sie das im Abschnitt 2. dann steht dies für genau einen beliebigen Buchstaben.6 angegebene Beispiel der Notationsumwandlung so. Felder. Stack. durch Kommata getrennt. Trifft man auf den Endpunkt. Hinweis: Sie müssen beide Strings in einer neuen Klasse kapseln. StringTokenizer. z. 426 Muß-Aufgabe 40 Minuten Muß-Aufgabe 30 Minuten Muß-Aufgabe 45 Minuten Muß-Aufgabe 45 Minuten . werden bei Ba* alle Kunden ausgegeben. dann sollen nur die Kundendaten ausgegeben werden. so daß das tatsächliche Ergebnis der Rechnung ausgegeben wird. StringBuffer. /8/ Es soll eine Oberfläche entwickelt werden. String Tokenizer.LE 11 Lee-Algorithmus Aufgaben /5/ Diese Zuordnung kann durch folgenden Algorithmus geschehen: Allen freien Nachbarzellen der Startzelle wird die Zahl 1 zugeordnet. die Klassen Vector. /7/ Die einzelnen Zonen und Leiterbahnen sollen durch unterschiedliche Farben gekennzeichnet werden. 7 Lernziele: Die Datenstrukturen Warteschlange. 9 Lernziele: Felder. bis der Startpunkt erreicht wird.19. Hashtable sowie die Hüllklassen für einfache Typen (wrapper classes) problemgerecht beim Schreiben von Java-Programmen einsetzen können. Das Programm Kundenverwaltung soll um folgende Anforderungen erweitert werden: /1/ Wird bei der Ausgabe der Kundendaten bei der Kundennummer ein Wortbestandteil eingegeben. Keller und Streuspeicherung mit Hilfe von Java-Standardklassen realisieren können. Nun wird vom Endpunkt aus der Weg zurückverfolgt.

daß zusätzlich folgende Anforderungen berücksichtigt werden: /4/ Der Kinosaal ist in Parkett und Loge unterteilbar. /2/ Es können Reservierungen vorgenommen werden (1 bis n Plätze). Das Java-Programm soll folgende Anforderungen erfüllen: /1/ Gegeben sei eine ganze Zahl z mit ihren n Ziffern ( z=z1 z2 . String. 1 < n < 10 ).. Das Programm soll folgende Anforderungen erfüllen: /1/ Es kann ein Kinosaal bestehend aus Reihen und Sitzen eingerichtet werden..Aufgaben 10 Lernziele: Felder. LE 11 Kann-Aufgabe 180 Minuten Kann-Aufgabe 120 Minuten Kann-Aufgabe 30 Minuten 427 . /5/ Werden mehrere Plätze reserviert. String Tokenizer. die Klassen Vector. die bei der Reservierung berücksichtigt wird.zn . die eine Zahl mit Prüfziffer auf Korrektheit überprüft. Sich in Java-Standardklassen einarbeiten und diese problemgerecht einsetzen können. 12 Lernziele: Felder.n i . zi (mod 11) eine Prüfziffer gebildet werden..h. die die übergebene Zahl mit Prüfziffer zurückgibt. d. 11 Lernziele: Felder. damit Fehler bei der Eingabe von Kundennummern leichter festgestellt werden können. Stack. die Klassen Vector. /6/ Eine Operation. b Erweitern Sie das Programm so. String. für eine Kundenverwaltung ein Prüfziffernverfahren zu implementieren. String Tokenizer. Sie werden damit beauftragt. /5/ Berechnen der Prüfziffer. die Plätze mit hoher Priorität werden zuerst zugeteilt. Die Reservierungen werden in Abhängigkeit von der gewählten Kategorie vorgenommen. Hashtable sowie die Hüllklassen für einfache Typen (wrapper classes) problemgerecht beim Schreiben von Java-Programmen einsetzen können. /3/ Der Kinosaal und die jeweiligen Reservierungen sind grafisch darzustellen. dann sind zusammenhängende Plätze (nebeneinander) zu vergeben. Stack. so soll die Zahl als Kundennummer abgelehnt werden. a Schreiben Sie ein Java-Programm zur Verwaltung von Kinoplätzen. String. StringBuffer. /8/ Ergibt sich als Prüfziffer die Zahl 10. Die Datenstrukturen Warteschlange. Stack. StringBuffer. die Klassen Vector. /2/ Aus dieser Zahl soll nach der Formel zn+1 = ∑ i=1. /3/ Diese Prüfziffer soll anschließend als (n+1)-te Ziffer an die Zahl z angehängt werden Folgende Operationen sind bereitzustellen: /4/ Setzen der Stellenanzahl der zu betrachtenden Zahlen. /6/ Plätze können mit einer Priorität gekennzeichnet werden. Hashtable sowie die Hüllklassen für einfache Typen (wrapper classes) problemgerecht beim Schreiben von Java-Programmen einsetzen können. /7/ Eine Operation. Hashtable sowie die Hüllklassen für einfache Typen (wrapper classes) problemgerecht beim Schreiben von Java-Programmen einsetzen können. Überlegen Sie einen oder mehrere Reservierungsalgorithmen. String Tokenizer. StringBuffer. Dieses Verfahren wird zum Beispiel bei den internationalen Standardbuchnummern (ISBN) angewendet. Keller und Streuspeicherung mit Hilfe von Java-Standardklassen realisieren können.

15 Lernziele: Die Schnittstelle Enumeration für geeignete Beispiele implementieren können. Ändern Sie das Programm Kundenverwaltung mit einem KundenContainer . y1. Y-Wert ist.LE 11 Aufgaben Erweitern Sie das Programm PersonenWarteschlange so.h. Kann-Aufgabe 90 Minuten 13 Lernziele: Felder. 14 Lernziele: Die Schnittstelle Enumeration für geeignete Beispiele implementieren können. Folgende neue Anforderungen sind zu berücksichtigen: /12/ Es soll eine Liste aller Patienten ausgedruckt werden. /4/ Die Grafik wird in einem geeigneten Maßstab gezeichnet.bzw. Die Firma ProfiSoft erhält erneut einen Auftrag über die Erweiterung des Programms zur Verwaltung einer Zahnarztpraxis (Fortsetzung der Aufgabe 8 aus LE 9). Hashtable sowie die Hüllklassen für einfache Typen (wrapper classes) problemgerecht beim Schreiben von Java-Programmen einsetzen können. Erweitern Sie die Benutzungsoberfläche um einen weiteren Ausgabebereich. String. die kleiner als der maximale auszugebene X. Stack.und Y-Skalen werden immer mit Vielfachen der größten Zehnerpotenz beschriftet.B. yn . die noch nicht ihre Versichertenkarte vorgelegt haben. ein einfaches applet zu schreiben. eine Personennummer oder ein Personenname. Sich in Java-Standardklassen einarbeiten und diese problemgerecht einsetzen können. /2/ Die grafische Darstellung soll einen Bezug zu den Personendaten anzeigen. /13/ Alle Patienten. mit dem Geschäftsgrafiken ausgegeben werden können: /1/ Über ein Textfeld können Koordinaten in folgender Form eingegeben werden: x1. x2. xn. Warum benötigt man dafür eine Klasse KundenIterator? Kann-Aufgabe 60 Minuten Klausur-Aufgabe 60 Minuten 428 . StringBuffer.. sollen in einer Liste angezeigt werden. die Klassen Vector. die Skalen besitzen immer zehn Unterteilungen in der jeweiligen Schrittweite. Container-Klassen unter Einsatz des Singleton-Musters programmieren können. daß folgende Anforderungen erfüllt werden: /1/ Jeder Person in der Warteschlange sind individuelle Daten zuzuordnen. z. /2/ Durch Anwählen eines Druckknopfs kann die Grafik in einer Zeichenfläche des applet ausgegeben werden. . unabhängig vom ersten Ausgabebereich eine andere Kundenauswahl anzuzeigen. String Tokenizer. Container-Klassen unter Einsatz des Singleton-Musters programmieren können. Eine Firma beauftragt Sie damit. so ab. der es ermöglicht. d.. y2.. daß eine separate Klasse KundenIterator die Traversierungsoperationen zur Verfügung stellt. /3/ Die X. realisiert als Vector.

Persistenz und Datenhaltung 430 Persistenz und Datenhaltung in Java 430 Dateiströme 434 Filterströme 438 Eine einfache Indexverwaltung 439 Zuerst die Theorie: Dateiorganisation 439 Dann die Praxis: Direktzugriffsspeicher in Java 441 Drei-Schichten-Architektur 446 Die Serialisierung von Objekten 454 2.20.20.1 2.19 müssen bekannt sein. Das Serialisierungskonzept von Java erläutern können. Das Serialisierungskonzept von Java für die persistente Datenhaltung verwenden können. Bidirektionale Assoziationen mit der Kardinalität * programmieren können.4.4.6 429 .4 2.2 bis 2. verstehen anwenden s Die Kapitel 2.20 2.20.20.20.20.20.und Filterströmen in Java programmieren können.1 2.5 2.20. Die Drei-Schichten-Architektur erklären können.LE 12 2 Grundlagen der Programmierung – Persistenz s s s s s s s Das Stromkonzept einschließlich Datei.3 2.und Filterströmen in Java darstellen können.2 2. Einen Direktzugriffsspeicher für die Datenhaltung einsetzen können. Eine Datenhaltung mit Hilfe von Datei.2 2.

Auf der einen Seite wird die Pipeline mit Daten gefüllt. Ein Strom stellt die Schnittstelle eines Programms nach außen dar. bis sie entnommen werden.20 Persistenz und Datenhaltung 2. gepuffert. Eine Java-Anwendung kann dagegen – wie Programme in anderen Programmiersprachen auch – auf alle Ressourcen des lokalen Computersystems zugreifen.und Ausgabe zuständigen Klassen sind in Java in dem Paket java. Persistenz liegt vor.LE 12 2. Ein Strom ist vergleichbar mit einer Pipeline. Eine Datenhaltung auf dem Server erfordert eine z. Daten langfristig aufzubewahren. Die Daten werden in der Pipeline solange zwischengespeichert bzw. Persistente Objekte erhält man durch geeignete Speicherung in s Dateien.und Ausgabeströme in Java definieren.1 Persistenz und Datenhaltung in Java Java-applets externe Speicher Dateien & Datenbanken JavaAnwendungen Streams Abschnitt 2.io zusammengefaßt. Die Klassen InputStream und OutputStream sind die abstrakten Oberklassen. Im Gegensatz zu Dateien stellen Datenbanken umfangreiche Verwaltungssysteme für große Datenmengen zur Verfügung.und Ausgabe mit Hilfe von Strömen (streams) durchgeführt. die das Verhalten für sequentielle Ein.19. auf die viele Benutzer zugreifen. auf der anderen Seite werden die Daten entnommen. Dieses Paket ist immer zu importieren. Ein applet kann auf externe Speicher des Client in der Regel nicht zugreifen. Alle für die Ein. Ströme sind geordnete Folgen von Daten.2 java. umfangreiche Netzwerkprogrammierung. wenn diese Klassen verwendet werden sollen. Im folgenden wird nur die Speicherung in Dateien behandelt. Ströme sind in der Regel unidirektional. Ein Eingabestrom kann nicht zur Ausgabe benutzt werden und umgekehrt. wenn es möglich ist. die eine Quelle oder eine Senke haben.io InputStream OutputStream Aus Sicherheitsgründen können Java-applets nur Daten auf dem Server aufbewahren. Es gibt heute im wesentlichen drei verschiedene Möglichkeiten. Dazu müssen die Attributwerte der Objekte und ihre Beziehungen zu anderen Objekten in geeigneter Form auf externen Speichern aufbewahrt werden. Das Verhalten ist analog zu einer Warteschlange. Diese abstrakten Klassen besitzen meh430 . In Java wird die Ein.20. aus den langfristig gespeicherten Daten wieder einen analogen Arbeitsspeicherzustand wie vor der Speicherung herzustellen.20 Persistenz und Datenhaltung In den meisten Anwendungen möchte man die Zustände und Verbindungen der Objekte über den aktuellen Programmlauf hinaus aufbewahren. 2. s objektorientierten Datenbanken und s relationalen Datenbanken.T.

out.und Ausgabeströmen implementieren.err.read(). einen Eingabestrom (Input Stream) in Teile zu zerlegen. der Zeichen auf den Bildschirm ausgibt. 2.)..20-1.20-1: Die Java-Klassenhierarchie des Pakets java. sowie Klassen zum Umgang mit Dateinamen (File.println(. Grundsätzlich lassen sich in Java folgende Typen von Strömen unterscheiden (Abb... Stromtypen treten fast immer in Paaren auf. 2. Einen Überblick über die Klassenhierarchie gibt Abb. FileDescriptor) sowie einen Zerleger (StreamTokenizer). Beispiel: System.). Zusätzlich gibt es eine Stromklasse RandomAccessFile.. der Zeichen von der Tastatur einliest Beispiel: System. Zu einem FileInputStream gibt es einen FileOutputStream usw.println(.2. der Fehlermeldungen auf den Bildschirm ausgibt. Beispiel: System.1 Persistenz und Datenhaltung in Java LE 12 rere Unterklassen. Object java. die spezielle Typen von Ein.io File InputStream FileOutputStream PipedOutputStream ByteArrayOutputStream ObjectOutputStream FilterOutputStream FileInputStream PipedInputStream ByteArrayInputStream SequenceInputStream StringBufferInputStream ObjectInputStream BufferedOutputStream PrintStream DataOutputStream ObjectOutput ObjectInput FilterInputStream DataOutput DataInput DataInputStream BufferedInputStream LineNumberInputStream PushbackInputStream 431 .in. 2. n Standardausgabestrom: Strom. die das Lesen und Schreiben einer Datei ermöglicht.20-2): s Standarddatenströme: n Standardeingabestrom: Strom. der es ermöglicht.io OutputStream StreamTokenizer RandomAccessFile FileDescriptor Standarddatenströme Abb.20. n Standardfehlerstrom: Strom.

err. Ein Dateistrom kann durch Angabe eines Dateinamens. s Filterströme: Verbinden einen Strom mit einem anderen Strom. um die aus einem Originalstrom gelesenen oder in einen Originalstrom geschriebenen Daten zu filtern.out.lang und ermöglicht den Zugriff auf die Systemfunktionalität. s Dateiströme: n FileInputStream: Eingabestrom auf einer im zugrunde liegenden Dateisystem vorhandenen Datei. n FileOutputStream : Ausgabestrom auf einer im zugrunde liegenden Dateisystem vorhandenen Datei. n FilterInputStream (abstrakt) mit Unterklassen.oder Ausgabestrom initialisiert werden.println(.) Standardfehlerstrom System.err. 432 . Um einen Filterstrom verwenden zu können.B.in. muß er mit dem entsprechenden Ein.in ist eine Klassenvariable.println(. z.) JavaProgramme Tastatur Standardeingabestrom System.read() Standarddatenströme Dateien FileInputStream Ein FilterInputStream gabedateien FileOutputStream FilterOutputStream Au sgabedateien Dir e k t z u g r i ff s dateien - RandomAccessFile Dateiströme Filterströme Dateiströme Filterströme Die Klasse System gehört zum Paket java.20 Persistenz und Datenhaltung Bildschirm Standardausgabestrom System. Analog gilt dies für System. System.LE 12 Abb.. Dies geschieht bei der Erzeugung des Filterstroms. z. DataOutputStream.out und System.B. die eine Referenz auf ein Objekt enthält.20-2: Veranschaulichung des Stromkonzepts in Java 2. eines FileObjekts oder eines FileDescriptor-Objekts erzeugt werden. DataInputStream. das den Standardeingabestrom implementiert. 2. n FilterOuputStream (abstrakt) mit Unterklassen....

verwendet werden. wie z. Viele Operationen in java.readLine() != null) { Anweisungen } LE 12 Beispiel Damit können die in DataInputStream implementierten.1 Persistenz und Datenhaltung in Java //Zuordnen des Standardeingabestroms zu einem DataInputStream DataInputStream einEingabestrom = new DataInputStream(System. bequemeren read-Operationen.h. String Eingabe. Die Operation liefert die tatsächliche Anzahl der eingelesenen Bytes oder bei Erreichen des Stromendes -1 zurück.2.in).B. Dadurch muß nicht für jeden Lese. verbleiben die assoziierten Ressourcen mindestens so lange im Gebrauch. Diese Operation blockiert. bis eine Eingabe verfügbar ist. Sie können explizit mit der Operation close geschlossen Öffnen werden. 433 . BufferedOutputStream) gepufferte Ströme erweitern die Filterströme um die Pufferung. Die abstrakte Klasse InputStream definiert folgende wichtige Ope. und gibt das gefilterte Ergebnis weiter. bis die Speicherbereinigung die finalizeOperation eines Stromes ausführt.und Schreibaufruf auf das Dateisystem zugegriffen werden.h. Diese Operation blockiert. maximal aber bis zur angegebenen Obergrenze buf. Dann wird buf mit den eingelesenen Bytes gefüllt. Ein. bearbeitet.length. Ein FilterInputStream-Objekt erhält Eingaben von einem anderen InputStream-Objekt. d. Wird diese Operation nicht aufgerufen. s public void close () throws IOException Schließt den Eingabestrom. Folgen gefilterter Ströme werden durch Verkettung mehrerer Filter zu einem großen Filter aufgebaut. while ((Eingabe = einEingabestrom.io verwenden zur Anzeige von Ausnahmen die Ausnahmeklasse IOException. um alle mit dem Strom assoziierten Ressourcen (wie die Dateideskriptoren) freizugeben. Bei Erreichen des Stromendes wird -1 zurückgegeben. Diese Operation sollte aufgerufen werden. die Ausführung des Programms wird nach dem Aufruf der read()-Operation angehalten. readLine(). d. Gepufferte Ströme (BufferedInputStream.20.InputStream rationen: s public abstract int read () throws IOException Stromende: -1 Liest ein einziges Datenbyte und gibt das gelesene Byte im Bereich zwischen 0 und 255 – also nicht zwischen -128 und 127 – zurück. filtert die Bytes. bis eine Eingabe verfügbar ist.und Ausgabeströme werden automatisch bei der Erzeugung automatisches geöffnet. s public int read(byte[] buf) throws IOException Liest in ein Bytefeld ein.

434 . Bei der Erzeugung eines Objekts wird der Dateiname direkt mit der Datei verknüpft.println("Eingabe hat " + Zaehler + " Zeichen. Dies kann geschehen s über ein Objekt der Klasse File oder s direkt über die Klassen FileOutputStream und FileInputStream. da es oft das Ergebnis einer arithmetischen Operation auf einem Byte ist. Das Byte wird als int weitergegeben. System. } } System. class ZeichenZaehlen { public static void main(String[] args) throws IOException { int Zaehler = 0.*.20.io. muß zuerst eine Verknüpfung zwischen der Datei und ihrem Namen hergestellt werden. while (System. Diese Operation blockiert. die restlichen 24 Bits gehen verloren.in bezieht sich auf einen von der Klasse System verwalte- ten Eingabestrom. der den Standardeingabestrom implementiert. import java. das heißt.20 Persistenz und Datenhaltung s public abstract void write(int b) throws IOException Schreibt b als Byte. Diese Operation muß aufgerufen werden.in ist ein InputStream-Objekt. s public void write(byte[] buf) throws IOException Schreibt ein Feld von Bytes.").out. Bytes beinhaltende Ausdrücke sind vom Typ int und machen somit den Parameter zu einem int.2 Dateiströme Um in eine bestimmte Datei schreiben oder aus ihr lesen zu können. daß sie wegen des Typs int des Parameters ohne Typkonvertierung übergeben werden können. 2. System. Diese Operation blockiert. bis die Bytes geschrieben sind. s public void flush() throws IOException Entleert den Puffer des Stroms. so daß alle in einem Puffer gehaltenen Bytes zum Ziel des Stroms gelangen. Beispiel Das folgende Programm liest Zeichen von der Tastatur und gibt die Zeichenanzahl in der Standardausgabe aus.in. s public void close() throws IOException Schließt den Strom.read() != -1) Zaehler++. um alle mit dem Strom assoziierten Ressourcen freizugeben. Nur die 8 niederwertigen Bits des Integer werden übertragen.LE 12 OutputStream 2. bis das Byte geschrieben ist.

mit der dieser Datei-Eingabestrom verbunden ist. 435 .2. wird eine FileNotFoundException ausgelöst. FileNotFoundException Dieser Konstruktor erzeugt und initialisiert einen neuen Konstruktor FileOutputStream durch Öffnen einer Verbindung zu einer durch den Pfadnamen path im Dateisystem bezeichneten Datei. mit der dieser Datei-Ausgabestrom verbunden ist. Wie man sieht. eineAusgabeDatei = new FileOutputStream(Dateiname). Die Operationen der Klasse FileInputStream sind analog: s public FileInputStream(String path) throws SecurityException. Ein neues FileDescriptor-Objekt wird erzeugt. Wenn die Datei nicht geöffnet werden kann. Ein neues FileDescriptor-Objekt wird erzeugt.20. mit der dieser Datei-Ausgabestrom verbunden ist. FileOutputStream eineAusgabeDatei. FileInputStream FileNotFoundundException Dieser Konstruktor erzeugt und initialisiert einen neuen File Konstruktor InputStream durch Öffnen einer Verbindung zu einer durch die Pfadangabe path bezeichneten Datei im Dateisystem.2 Dateiströme //Deklarieren und Erzeugen einer Ausgabedatei String Dateiname = "Kundendaten". s public void write(int b) throws IOException Operationen Das Byte für diese Operation wird in die Datei geschrieben. LE 12 Beispiel Die wichtigsten Operationen der Klasse FileOutputStream sind: s public FileOutputStream(String path) throws FileOutputStream SecurityException. //Deklarieren und Erzeugen einer Eingabedatei FileInputStream eineEingabeDatei = new FileInputStream(Dateiname). um diese Dateiverbindungen zu repräsentieren. s public void write(byte[] b) throws IOException. wird eine FileNotFoundException ausgelöst. mit der dieser Datei-Eingabestrom verbunden ist. NullPointerException Bytes für diese Operationen werden aus der Datei gelesen. Kann die tatsächliche Datei nicht geöffnet werden. s public int read() throws IOException Operationen Das Byte für diese Operation wird aus der Datei gelesen. NullPointerException Bytes für diese Operation werden in die Datei geschrieben. erlaubt diese Klasse nur das Speichern von bytes in eine Datei. s public void close() throws IOException Dieser Datei-Ausgabestrom wird geschlossen und kann nicht weiter zum Schreiben von Bytes verwendet werden. s public int read(byte[] b) throws IOException. um diese Dateiverbindung zu repräsentieren.

//dann wird sie automatisch angelegt byte Byte. //Ende des Eingabestroms durch -1 angezeigt while ((Byte = (byte)eineEingabeDatei.close().txt"). eineAusgabeDatei.*. class InverserText { public static void main (String args[]) { 436 . FileOutputStream eineAusgabeDatei = new FileOutputStream ("Textdatei2.write(Byte). } catch(FileNotFoundException eineAusnahme) { System. */ import java.LE 12 2. import java.util. } } } Beispiel /* Programmname: InverserText (Java-Anwendung) * Aufgabe: Liest einen Text aus einer Textdatei und gibt ihn in * umgekehrter Reihenfolge in eine andere Datei aus. //Ist die Ausgabedatei noch nicht vorhanden.io.io. class KopiereText { public static void main (String args[]) { try { FileInputStream eineEingabeDatei = new FileInputStream ("Textdatei.20 Persistenz und Datenhaltung s public void close() throws IOException Dieser Datei-Eingabestrom wird geschlossen und kann nicht mehr länger zum Lesen von Bytes verwendet werden. * Zum Umkehren wird ein Keller verwendet. Beispiel /* Programmname: KopiereText (Java-Anwendung) * Aufgabe: Liest einen Text aus einer Textdatei und kopiert ihn * in eine andere Datei. eineEingabeDatei.close().err.*.read()) != -1) eineAusgabeDatei.err.println("Fehlermeldung: " + eineAusnahme).txt").println("Fehlermeldung: " + eineAusnahme). } catch(IOException eineAusnahme) { System. */ import java.*.

i++){}. Stack einKeller = new Stack().close(). FileOutputStream eineAusgabeDatei = new FileOutputStream ("InverserText.pop().close().txt").empty())) { //Objekt zu Character casten c = (Character) einKeller.out. } //Aus Keller lesen und ausgeben while (!(einKeller.20.2 Dateiströme try { FileInputStream eineEingabeDatei = new FileInputStream ("NormalerText.2. //Objekt in Byte wandeln eineAusgabeDatei.read()) != -1) { char Zchn = (char)Byte.txt"). } catch(IOException eineAusnahme) { System. } }//Ende main }//Ende InverserText LE 12 437 . //Byte in Zeichen wandeln //Zeichen in Zeichen-Objekte wandeln //(wegen Keller) c = new Character(Zchn). //Testausgabe System. //Warteschleife Byte = c. //Testausgabe System. eineAusgabeDatei. //Ablegen im Keller. int Byte.println("Aus Keller gelesenes Zeichen: " + c). //wrapper-Klasse //Ende einer Datei wird durch -1 angezeigt while ((Byte = eineEingabeDatei.println("Fehlermeldung: " + eineAusnahme).err.charValue().out. } catch(FileNotFoundException eineAusnahme) { System.push(c). //In Datei ausgeben } eineEingabeDatei. nur Objekte ablegbar einKeller. for (long i=1. i<10000000.println ("Eingelesenes Zeichen: " + Zchn). Character c.write(Byte).println("Fehlermeldung: " + eineAusnahme).err.

wird der Lesevorgang unterbrochen.und ausgegeben werden.3 Filterströme Sollen nicht nur Bytes ein. wird eine NullPointerException ausgelöst. NullPointerException Für jedes Zeichen in der Zeichenkette s wird der Reihe nach ein Byte in den Ausgabestrom geschrieben. Ist das Dateiende erreicht. Sonst wird jedes gelesene Byte durch Nullerweiterung in den Typ char konvertiert.20. s public void writeFloat(float v) throws IOException Es werden vier die Parameter repräsentierende Bytes in den Ausgabestrom geschrieben. wird null zurückgegeben. Wird das Zeichen '\r' angetroffen. von denen jedes einzelne in ein Zeichen konvertiert wird. s public void writeBytes(String s) throws IOException. wird dieses ebenfalls verworfen und der Lesevorgang unterbrochen. wird ein String zurückgegeben. zur späteren Verwendung gespeichert. Wenn s gleich null ist. s public void writeInt(int v) throws IOException Es werden vier die Parameter repräsentierende Bytes in den Ausgabestrom geschrieben. s public float readFloat() throws IOException Es werden vier Eingabebytes gelesen und ein float-Wert zurückgegeben. s public String readLine() throws IOException Es werden aufeinanderfolgende Bytes gelesen. der Ausgabestrom out. dann sind die Dateiströme mit Filterströmen zu verbinden. Dabei wird der Parameter in zur späteren Verwendung gespeichert. s public int readint() throws IOException Es werden vier Eingabebytes gelesen und ein int-Wert zurückgegeben. Dabei wird der Parameter. bevor eines der beiden Zeichen '\n' und '\r' angetroffen wurde. DataOutputStream s public DataOutputStream(OutputStream out) Dieser Konstruktor erzeugt und initialisiert einen neuen DataOutputStream. der alle gelesenen und nicht verworfenen Zeichen der Reihe nach enthält. wenn das folgende Zeichen in das Zeichen '\n' konvertiert werden kann. die gelesenen Zeichen werden dann als String zurückgegeben. wird es verworfen und.3 Filterströme 2. Ist der Lesevorgang einmal unterbrochen. bis ein Zeilentrenner oder das Dateiende erreicht ist. bevor auch nur ein Byte gelesen wurde. 438 . Wichtige Filterströme sind DataInputStream und DataOutputStream. Ihre wichtigsten Operationen lauten: DataInputStream s public DataInputStream(InputStream in) Konstruktor Operationen Es wird ein neuer DataInputStream erzeugt und initialisiert. wird es verworfen und der Lesevorgang unterbrochen. Es wird so lange gelesen.LE 12 2.20. Wird das '\n' angetroffen. Wird das Dateiende angetroffen.

random access Datensätze zu speichern und einen beliebigen Datensatz direkt wieder zu lesen und erneut zu speichern. Die höherwertigen acht Bits jedes Zeichens der Zeichenkette werden ignoriert. muß man einen Zeiger auf den Anfang des gewünschten Datensatzes positionieren. Die grundlegenden Speicherungsformen sind: s Sequentielle Speicherung s Indexsequentielle Speicherung s Indizierte Organisation mit n physisch sortiertem Index n logisch sortiertem Index s Hash-Verfahren./ verwendet werden. dann können die üblichen Verfahren der Dateiorganisation /Hansen 96. dann s[1] und so weiter. S.20. muß eine Zuordnung zwischen einem fachkonzeptorientierten Schlüssel und der Position des Datensatzes hergestellt und verwaltet werden. Voraussetzung für diese Speicherungsform ist. Sind umfangreiche Daten zu verwalten. 921 ff.length-1]. an welcher Position ein Datensatz beginnt.4 Eine einfache Indexverwaltung 2.20.1 Zuerst die Theorie: Dateiorganisation Wird kein Datenbanksystem für die Speicherung benötigt.2. daß alle Datensätze dieselbe Länge haben. Sonst wird zuerst das Zeichen s[0] geschrieben. und zwar das unterste Byte. das zuletzt geschriebene Zeichen ist s[s. Eine physische Sortierung liegt vor.4.20. dann können nicht mehr alle Daten gleichzeitig im Arbeitsspeicher aufbewahrt werden.length() Null. meist random access genannt. ohne die Datei von vorne nach hinten durchsuchen zu müssen. werden keine Bytes geschrieben. In der Regel werden im kaufmännischen Bereich Nummern für die Identifikation verwendet. Um zugreifen zu können. Für jedes Zeichen wird ein Byte geschrieben. Fast alle Programmiersprachen unterstützen eine Direktzugriffspeicherungsform.B. Kundennummer. wenn die Reihenfolge der Speicherung der Sortierreihenfolge entspricht.1 Zuerst die Theorie: Dateiorganisation LE 12 Ist s. Bei einer Indexverwaltung wird in einer Tabelle eine Zuordnung zwischen einem solchen Schlüssel und einer zugehörigen Datensatzposition verwaltet. 2. kann sie komplett in den Arbeitsspeicher geladen wer439 . Da die Indextabelle nur wenig Platz beansprucht. Artikelnummer usw. z. Da der Endbenutzer nicht weiß. die es ermöglicht. Trotzdem möchte man einen direkten Zugriff auf die auf einem Langfristspeicher abgelegten Datensätze haben. Im folgenden wird eine indizierte Organisation mit physisch sortiertem Index entwickelt.4.

20-4: Beispiel zur Indexverwaltung Klasse Index Indextabelle 0 1 2 3 4 5 6 7 8 9 -1 5 10 7 8 3 1 -1 -1 -1 Index z. Laenge: int): void – MAX: int – Dateinname: String – Indextabelle[ ]: int + + + + + – Index() erzeugeEintrag(Schluessel: int.B. 2. Dadurch ist es möglich.20-4 zeigt ein Beispiel zur Veranschaulichung des Konzepts. 100 Bytes Datensätze: Nummer des Datensatzes * Satzlänge »ProfiSoft.20. 2. die Indexverwaltung auszutauschen oder zu erweitern. Abb. ohne daß die Klasse Datei geändert werden muß. Soll beispielsweise der Kundenname zusätzlich als Schlüssel verwendet werden.20-3: Klassen zur Realisierung einer Indexverwaltung den.4 Eine einfache Indexverwaltung Index Datei – Aktuell: int – Dateiname: String – SATZLAENGE: int + + + + + + – – + Datei() speichereSatz(Satz: String.20-3 zeigt eine Realisierung dieses Konzepts durch zwei Klassen. wobei die beiden Klassen unabhängig voneinander sind. 2.B. Index: int): void leseSatz(Index: int): String oeffneDatei(Name: String): void schliesseDatei(): void gibAnzahlDatensaetze(): int positioniereAufSatz(Index: int): void readFixedString(Laenge: int): String writeFixedString(einDatensatz: String.LE 12 2.. Abb.« Datensätze Klasse Datei Datensatztabelle Schlüssel z. Kundennr.B.. Index: int): void gibIndexZuSchluessel(Schluessel: int): int ladeIndexDatei(): void speichereIndexDatei(): void aktualisiereIndexDatei(Schluessel: int): void Abb. 2. Nummer des Datensatzes Aktuell 0 100 200 300 400 500 600 700 800 900 Beginn Satzlänge der z. 440 . Abb. dann kann eine weitere Indexklasse mit Hilfe einer HashTabelle eine Zuordnung zwischen Kundenname und Datensatzposition verwalten. Sie wird aber selbst ebenfalls in einer Datei gespeichert und bei Änderungen aktualisiert.

dann kann ohne Zusatzaufwand auf alle Datensätze in der gleichen Zeit zugegriffen werden. s public final void writeChar(int) Schreibt ein Zeichen im Unicode (2 Bytes) in die Datei. s public int skipBytes(int n) Überspringen von n Bytes. ob die Datei nur zum Lesen ("r") oder zum Lesen und Schreiben geöffnet ("rw") angelegt werden soll. String mode) Konstruktor. d.h. s public final char readChar() Liest ein Unicode-Zeichen von der Datei. daß kein Datensatz direkt »aus der Mitte« der Datei gelesen werden kann.4. Besitzen alle zu speichernden Datensätze die gleiche Länge. wenn die Sätze unterschiedlich lang sind.2. s public long length() Gibt die Länge der Datei zurück. Parameter wird der systemabhängige Dateiname angegeben. der auf die zu lesende Satzposition gestellt wird. Auch für die Indexdatei bietet es sich an. Im Prinzip geht dies auch. s public final int readInt() Liest eine 32-Bit-lange ganze Zahl von der Datei. pos gibt dabei die Byte-Position an. die Länge der Datensätze wird in bytes gezählt. eine Direktzugriffsdatei zu verwenden. Der Nachteil der normalen Streams besteht darin. die die Länge der einzelnen Sätze speichert.4.20. Bei seltenen Zugriffen kann dies akzeptabel sein.2 Dann die Praxis: Direktzugriffsspeicher in Java LE 12 2. Die Klasse RandomAccessFile stellt folgende wichtige Operationen zur Verfügung: s RandomAccessFile(String name. nur muß man dann vorher n-1 Stellen gelesen haben. Dann muß aber eine weitere Datei geführt werden. Man kann natürlich auch bei normalen Streams an jeder Stelle n lesen. der 2. Die Java-Klasse dazu sieht folgendermaßen aus: /* Programmname: Verwalten eines Index * Datenhaltungs-Klasse: Direktzugriffsspeicher * Aufgabe: Verwalten und Lesen/Schreiben einer Indextabelle * in einen Direktzugriffsspeicher */ 441 . s public final void writeInt(int) Schreibt ein int in die Datei (jeweils 4 Bytes). Parameter gibt an.und Schreiboperationen gelesen bzw. Analog zu diesen Operationen gibt es weitere Lese-/Schreiboperationen für verschiedene Datentypen. Ab dieser Position wird dann mit den Lese. s public void seek(long pos) Positionszeiger. geschrieben.20.2 Dann die Praxis: Direktzugriffsspeicher in Java Die Klasse RandomAccessFile ermöglicht in Java einen Direktzugriffsspeicher. im 1.

//Konstruktor public Index() { Indextabelle = new int[MAX]. Klasse Index public class Index { //Attribute private final int MAX = 1000. //oder 0. //Aktualisieren der Indexdatei.20. Schluessel++) { Index = eineIndexDatei.io. int Index.*. } eineIndexDatei.MAX-1 private RandomAccessFile eineIndexDatei. } public int gibIndexZuSchluessel(int Schluessel) { //Gibt zu dem Schlüssel den gefundenen Datensatz-Index //zurück if (Schluessel < MAX) return Indextabelle[Schluessel]. //0. "r"). } public void speichereIndexDatei() throws IOException { 442 .4 Eine einfache Indexverwaltung import java. Abspeichern der Datei aktualisiereIndexDatei(Schluessel).readInt(). private int Indextabelle[].txt". i<MAX. i++) Indextabelle[i] = -1.util.h.close().. for (int Schluessel = 0. //Initialisierung der Indextabelle for (int i=0.LE 12 2. Schluessel < MAX. //Kein Datensatz zum Schlüssel vorhanden } public void erzeugeEintrag(int Schluessel.*. } public void ladeIndexDatei() throws IOException { //Liest die Indextabelle vollständig aus einer Datei //Dies geschieht nur beim Start des Programms eineIndexDatei = new RandomAccessFile(Dateiname. //d. Indextabelle[Schluessel] = Index. wenn Schlüssel zu groß ist else return 0. int index) throws IOException { //Speichert zu einem Schlüssel den zugehörigen //Datensatz-Index in der Indextabelle if (Schluessel < MAX) Indextabelle[Schluessel] = index. private String Dateiname = "Indexdatei. import java.

public class Datei { private RandomAccessFile eineStammdatei. Dies geschieht in einer Hilfsoperation.*. } private void aktualisiereIndexDatei(int Schluessel)throws IOException { //Aktualisiert die Indextabelle in der Indexdatei //Dies geschieht beim Hinzufügen eines neuen Indexes //oder Ändern eines alten Indexes eineIndexDatei = new RandomAccessFile(Dateiname.20. //aktuelle Position des Dateizeigers private final int SATZLAENGE = 100. } //Operationen public void speichereSatz(String Satz. Schluessel++) eineIndexDatei. int index) throws IOException { //Speichert einen Datensatz Satz an einer Position index //in der Datei 443 Klasse Datei . eineIndexDatei. Die Java-Klasse sieht folgendermaßen aus: /* Programmname: Verwalten einer Datei * Datenhaltungs-Klasse: Direktzugriffsspeicher * Aufgabe: Lesen und Schreiben von Sätzen fester Länge * in einen Direktzugriffsspeicher */ import java. "rw").close(). private int Aktuell. eineIndexDatei.txt". "rw").close(). //Positionieren auf den entsprechenden Eintrag. dann muß vor dem Speichern der String noch auf eine einheitliche Länge gebracht werden.4.writeInt(Indextabelle[Schluessel]).seek((long)(Schluessel*4)). Schluessel < MAX. Wenn von der Fachkonzeptklasse der Datensatz als String geliefert wird. //eine int-Zahl belegt 4 Bytes eineIndexDatei.writeInt(Indextabelle[Schluessel]). // Dateiname //Konstruktor public Datei() { oeffneDatei(Dateiname). } } LE 12 Die Verwaltung der Stammdaten-Datei ist etwas aufwendiger. eineIndexDatei.io. for (int Schluessel = 0. Beim Lesen des Datensatzes werden die restlichen Nullen wieder entfernt.2. die bis zur Datensatzlänge mit Nullen auffüllt.2 Dann die Praxis: Direktzugriffsspeicher in Java //Speichert die Indextabelle vollständig in einer Datei //Dies geschieht beim Beenden des Programms eineIndexDatei = new RandomAccessFile(Dateiname. private String Dateiname = "Stammdatei.

LE 12 2.out. try { Anzahl=eineStammdatei. } catch (IOException e) { //Testausgabe System. } catch (IOException e) { //Testausgabe 444 .IOException e) { //Testausgabe System. } } public void schliesseDatei() { //Schließen der Datei try { eineStammdatei. } catch (java. //Hilfsoperation } } public String leseSatz(int index)throws IOException { //Liest den Datensatz index aus der Datei und gibt //ihn als String zurück if (eineStammdatei != null) { positioniereAufSatz(index). //interne Hilfsoperation writeFixedString(Satz.println("Datei:oeffneDatei: " + e). } public void oeffneDatei(String name) { //Öffnen der Datei zum Lesen und Schreiben try { eineStammdatei = new RandomAccessFile(name.println("Datei:schliesseDatei: " + e). "rw").close().length(). //Hilfsoperation } else return null.20. } } public int gibAnzahlDatensaetze() { //Rückgabe der Dateilänge in Datensätzen (!) long Anzahl=0. SATZLAENGE).4 Eine einfache Indexverwaltung if(eineStammdatei != null) { positioniereAufSatz(index).io.out. //interne Hilfsoperation return readFixedString(SATZLAENGE).

println ("Datei:positioniereAufSatz:" + e). } }//Ende if } private String readFixedString(int Laenge)throws IOException { //Liest einen String der festen Länge Laenge //(Unicode = 1 Zeichen = 2 Byte) ein StringBuffer einPuffer = new StringBuffer(Laenge). i++) { 445 LE 12 . //Rest mit 0 überlesen //wird benötigt.20. } private void writeFixedString(String einDatensatz.2 Dann die Praxis: Direktzugriffsspeicher in Java System.B.skipBytes(2*(Laenge-i)). i++.println ("Datei:gibAnzahlDatensaetze: " + e). noch //Zahlen kommen return einPuffer. wenn hinter dem String z. while (i < Laenge) { char Zeichen = eineStammdatei. } else einPuffer.4. int Laenge) throws IOException { //Schreibt einen String einDatensatz der festen Länge //Laenge weg for (int i = 0.readChar(). int i = 0. i < Laenge. //Umrechnung auf Anzahl Datensätze } //Hilfsoperationen private void positioniereAufSatz (int index)throws IOException { //Positioniert in der Datei auf den Datensatz mit der //Position index if (eineStammdatei != null) { try { eineStammdatei. //Anhängen an den Puffer } return einPuffer. if(Zeichen == 0) //Ende der Nutzdaten { //eineStammdatei.append(Zeichen).2. } catch(IOException e) { //Testausgabe System. } return (int)(Anzahl / (long)(SATZLAENGE * 2)).out.toString().toString().seek(index * SATZLAENGE * 2).out.

20.20-5). Die Schichten werden entsprechend ihrem Abstraktionsniveau angeordnet. Die Schichten selbst können folgendermaßen angeordnet werden: s Schichten mit linearer Ordnung. s Schichten mit strikter Ordnung. Bei einem Schichtenmodell mit strikter Ordnung kann Schicht 2 z.2 Komponente 2. Zwischen den Schichten selbst gelten dann strengere Zugriffsregeln. die Benutzungsoberflächen auszutauschen.5 Drei-Schichten-Architektur Bisher erfolgte eine strikte Trennung zwischen der Benutzungsoberfläche und dem Fachkonzept. if (i < einDatensatz.1 Komponente 1. 2. //zeichenweises Schreiben in die Stammdatei }//Ende for }//Ende writeFixedString }//Ende Datei 2.writeChar(Zeichen).B.1 Komponente 2.2 Komponente 0.3 c Komponente 1. Durch die Datenhaltung kommt eine neue Schicht hinzu. 2. //liefert das Zeichen an der i-ten Stelle //Der Rest wird mit 0 aufgefüllt eineStammdatei. Auch hier empfiehlt es sich. Dadurch erhält man eine Drei-SchichtenArchitektur (three tier architecture) (Abb.length()) Zeichen = einDatensatz. Allgemein spricht man von einer Schichten-Architektur.B.B.4 Legende: Komponente A benutzt Komponente B Schicht A benutzt Schicht B 446 .20.LE 12 2. ohne daß das Fachkonzept geändert werden muß.4 Eine einfache Indexverwaltung char Zeichen = 0. Benutzungsoberfläche strikte Ordnung Abb. zwischen der Datenhaltung und dem Fachkonzept klar zu trennen.1 Komponente 0.20-5: Beispiel für eine Drei-SchichtenArchitektur a Komponente 2. eigentliche Anwendung b Schicht 0 z.3 Komponente 0. daß Komponenten innerhalb einer Schicht beliebig aufeinander zugreifen können.2 Komponente 1.3 Schicht 1 z. Datenhaltung Komponente 0.charAt(i). Dadurch ist es möglich. Schichten innerhalb einer solchen Architektur sind meist dadurch gekennzeichnet.

5 Drei-Schichten-Architektur LE 12 von Schichten mit höherem Abstraktionsnivau auf alle Schichten mit niedrigerem Abstraktionsniveau zugegriffen werden. Diese Voraussetzungen sind bei der oben beschriebenen DreiSchichten-Architektur mit den Schichten s Benutzungsoberfläche. Beispiele für Schichtenmodelle mit linearer Ordnung sind die TCP/IP-4-Schichtenarchitektur und das ISO/OSI-7-Schichtenmodell.19. Eine solche Architektur ermöglicht es. 2. 2. die einzelnen Schichten je nach Bedarf auf Client und Server aufzuteilen (Abb.3. Ein Schichtenmodell mit linearer Ordnung ist restriktiver.20.2 beschriebene Kundenverwaltung soll um Beispiel eine Datenhaltung ergänzt werden. wenn s die Dienstleistungen einer Schicht sich auf demselben Abstraktionsniveau befinden und s die Schichten entsprechend ihrem Abstraktionsniveau geordnet sind. Von ei.20-5 ist dann nicht erlaubt. so daß eine Schicht nur die Dienstleistungen der tieferen Schichten benötigt. b und c angegeben.20-5 ist dies durch die Benutzt-Pfeile a. aber nicht umgekehrt. 2. Verwendet man keine Daten447 . 2. In Abb.2.lineare Ordnung ner Schicht kann immer nur auf die nächstniedrigere zugegriffen werden. Die in Abschnitt 2. s eigentliche Anwendung (Fachkonzept-Schicht) und s Datenhaltung gegeben. Der Benutzt-Pfeil c in Abb.20-6). Benutzungsoberfläche Benutzungsoberfläche Benutzungsoberfläche Abb.20-6: Verteilungsalternativen beim Client-ServerKonzept Client eigentliche Anwendung Anwendung Teil 1 eigentliche Anwendung Anwendung Teil 2 Server Datenhaltung Entfernte Datenhaltung Datenhaltung Entfernte Benutzungsoberfläche Datenhaltung Kooperative Verarbeitung Bei der Client-Server-Verteilung erfolgt manchmal noch eine Aufteilung des Fachkonzepts in zwei Teile. Eine Schichtenarchitektur ist dann sinnvoll.

io. private final int KUNDENNR_MAX = 1000.20-8 der zeitliche Ablauf beim Speichern eines Kunden dargestellt. besitzt die Klasse KundenContainer die Aufgabe. die Anforderungen der Klasse KundenverwaltungGUI durch Aufrufe der Klassen Index und Datei zu realisieren. //Verwendung der Dateiverwaltung //Klassen-Attribut private static KundenContainer einKundenContainer = null. dann kann eine einfache Index-Verwaltung zur Datenspeicherung – wie im vorigen Abschnitt dargestellt – verwendet werden. //Speichert Referenz auf das einzige Objekt //Konstruktor. //Verwendung der Indexverwaltung private Datei derKundenstamm. sondern ein flaches Dateisystem. 2.*.20-7 zeigt die entstehende Drei-Schichten-Architektur mit den entsprechenden Klassen. Dort ist nur die Klasse KundenContainer betroffen. Durch ein Sequenzdiagramm wird in Abb. Klasse KundenContainer public class KundenContainer implements Enumeration { //Attribut private int AktuelleKundennr = 0. Wie die Abbildung zeigt. Die modifizierte Klasse KundenContainer sieht folgendermaßen aus: /* Programmname: Kundenverwaltung mit Datenhaltung * Container-Klasse: KundenContainer * Aufgabe: Verwaltung von Objekten der Klasse Kunde * Datenhaltung: Indizierte Organisation mit physisch * sortiertem Index * Muster: Singleton * Iterator: integriert * Annahmen: Der Aufrufer muß selbst prüfen.*. Abb. Daraus ergibt sich. import java. Anstelle einer Objektverwaltung mit Hilfe von Feldern oder Vektoren ist nun der Aufruf von Operationen der Datenhaltungs-Schicht erforderlich. Die im vorigen Abschnitt dargestellte Indexverwaltung soll eingesetzt werden. Die öffentlichen Operationen der Klasse KundenContainer dürfen nicht verändert werden. 2.util.LE 12 2. von außen nicht zugreifbar private KundenContainer() 448 . ob ein * übergebenes Objekt vom Typ Kunde null ist oder nicht */ import java. damit in der Benutzungsoberflächen-Schicht keine Änderungen vorzunehmen sind.20 Persistenz und Datenhaltung bank. Entsprechend der oben dargestellten Drei-Schichten-Architektur muß die Benutzungsoberfächen-Schicht nicht geändert werden. //Attribute für die Datenhaltung private Index derKundenindex. daß nur die Fachkonzept-Schicht geändert werden muß.

Auftragssumme: int) + aendernAdresse(Firmenname: String. Adresse: String. Firmenadresse: String): void Datenhaltungs-Schicht Index – MAX: int – Dateiname: String – Indextabelle[ ]: int + Index() + erzeugeEintrag(Schluessel: int. einKunde: Kunde): void + getKunde(Kundennr: int): Kunde + hasMoreElements().5 Drei-Schichten-Architektur GUI-Schicht KundenverwaltungGUI – Kundennr: int = 1 + + – – – – KundenverwaltungGUI() main(args[]: String): void eingebenKunde(): void ausgebenKunde(): void ausgebenEinenKunden(einKunde: Kunde): void windowClosing(event: WindowEvent): void LE 12 Fachkonzept-Schicht KundenContainer – AktuelleKundennr: int = 0 – KUNDENNRMAX: int = 1000 + KundenContainer() + getObjektreferenz(): KundenContainer + InsertKunde(Kundennr: int.2. void + nextElement(): Object + endeAnwendung: void – oeffneDateien(): void – schliesseDateien(): void – schreibeKundensatz(einKunde: Kunde.20. Index: int): void + gibIndexZuSchluessel(Schluessel: int): int + ladeIndexDatei(): void + speichereIndexDatei(): void – aktualisiereIndexDatei(Schluessel: int): void Datei – Aktuell: int – Dateiname: String – SATZLAENGE: int + + + + + + – – – Datei() speichereSatz(Satz: String.20-7: Drei-Schichten-Architektur der Kundenverwaltung 449 . Name: String. Laenge: int): void Datei Datei Abb. Kundennr: int): void – – – – Kunde Kundennr: int Firmenname: String Firmenadresse: String Auftragssumme: int = 0 + Kunde(Kundennr: int. 2. Index: int): void leseSatz(Index: int): String oeffneDatei(name: String): void schliesseDatei(): void gibAnzahlDatensaetze(): int positioniereAufSatz(Index: int): void readFixedString(Laenge: int): String writeFixedString(einDatensatz: String.

2.20-8: Ablauf beim Speichern eines Kunden :Kundenverwaltung GUI Speichern new Kunde() einKunde: Kunde getObjektreferenz() :KundenContainer oeffneDateien() new Index() :Index speichere IndexDatei() newDatei() :Datei insertKunde() schreibe Kundensatz() getFirmenname() usw.LE 12 2. gibAnzahlDatensaetze() erzeuge Eintrag() speichereSatz() 450 .20 Persistenz und Datenhaltung Abb.

Firmenadresse.nextToken(). die die Objektreferenz liefert //Wenn Objekt noch nicht vorhanden.intValue()). } StringTokenizer einTokenizer = new StringTokenizer (einKundensatz. 451 LE 12 .5 Drei-Schichten-Architektur { oeffneDateien(). } //Operationen public void insertKunde(int Kundennr. if (Index != -1)//Ein Datensatz-Index ist vorhanden { try { einKundensatz = derKundenstamm. int Index = derKundenindex.println ("KundenContainer:getKunde: Keine Kunde vorhanden: Index = " + Index). } public boolean hasMoreElements() { //Prüfen.2. Kundennr). dann wird es erzeugt public static KundenContainer getObjektreferenz() { if (einKundenContainer == null) einKundenContainer = new KundenContainer().out. String Nr = einTokenizer. Integer i = new Integer(Auftragssumme). Firmenname. String Firmenadresse = einTokenizer. i. String Auftragssumme = einTokenizer.leseSatz(Index). "\t").nextToken(). } else return null. //identisch mit Kundennr. } //Klassen-Operation. Kunde einKunde) { schreibeKundensatz(einKunde. gekennzeichnet durch Index = -1 AktuelleKundennr ++. //Konstruktor.nextToken(). daher überlesen String Firmenname = einTokenizer. //Neues Objekt mit den gespeicherten Daten erzeugen return new Kunde(Kundennr. ob in der Indexdatei noch Datensatz-Indizes //gespeichert sind //Lücken sind möglich. } public Kunde getKunde(int Kundennr) { String einKundensatz = "". kann nur einmal aufgerufen werden return einKundenContainer. } catch (IOException e) { System.nextToken().20.gibIndexZuSchluessel (Kundennr).

} //Kundenstammdatei öffnen derKundenstamm = new Datei(). } catch (IOException e) { try { derKundenindex. else AktuelleKundennr ++. } public Object nextElement() { //Voraussetzung: es wurde mit hasMoreElements geprüft.gibIndexZuSchluessel (AktuelleKundennr) != -1) return true. } catch (IOException e1) { } System. } //Private Operationen für die Datenhaltung //Nehmen die Operationen der Klassen Datei und Index in //Anspruch private void oeffneDateien() { derKundenindex = new Index().out.20 Persistenz und Datenhaltung while (AktuelleKundennr < KUNDENNR_MAX) { if (derKundenindex. } public void endeAnwendung()throws IOException { schliesseDateien().LE 12 2.println("Indexdatei nicht vorhanden \n"). } private void schliesseDateien() throws IOException { if(derKundenindex != null) { try { //Indexdatei speichern derKundenindex.speichereIndexDatei(). return false.speichereIndexDatei(). try { //Indexdatei öffnen und Indextabelle laden derKundenindex.ladeIndexDatei(). } AktuelleKundennr = 0. //ob noch ein Element da ist return getKunde(AktuelleKundennr). } catch(IOException e) 452 .

println("schreibeKundensatz: AnzahlDatensätze= Index: " + index + "\n").speichereSatz(einKundensatz. index).println("Probleme beim Schließen der Indexdatei " + e + "\n").2. } //Speichert einen Kundensatz in der Kundenstammdatei try { derKundenstamm. //Anzahl Datensätze holen. System. }//Ende if } private void schreibeKundensatz(Kunde einKunde.5 Drei-Schichten-Architektur { System. daraus neuen Index berechnen int index = derKundenstamm. int Kundennr) { //Aufbau eines Kundensatzes als Zeichenkette //Die einzelnen Teile sind durch Tab getrennt String einKundensatz = Integer.20. //Schreibt einen Datensatz in die Indexdatei //Die Kundennummer dient der Indizierung try { derKundenindex. index). } catch (IOException e) { } }//Ende schreibeKundensatz }//Ende KundenContainer LE 12 Wie das Beispiel der Kundenverwaltung deutlich zeigt.toString(einKunde.gibAnzahlDatensaetze().out. Die Ursache besteht darin.out. } //Schließen der Kundendatei if (derKundenstamm != null) derKundenstamm. die Speicherreferenzen des Arbeitsspeichers abzuspeichern.toString(Kundennr) + "\t" + einKunde.erzeugeEintrag(Kundennr. in Abhängigkeit von der jeweiligen aktuellen Arbeitsspeicherbelegung. 453 . daß es keinen Sinn macht. können im Arbeitsspeicher befindliche Objekte nicht direkt auf einen Langfristspeicher abgelegt werden.getFirmenname() + "\t" + einKunde.println("Container: Fehler bei erzeugeEintrag: " + e + "\n").getAuftragssumme()). Die aufbewahrten Speicheradressen würden dann nicht mehr stimmen.out. dann werden die Objekte in anderen Arbeitsspeicherbereichen gespeichert. } catch (IOException e) { System. Werden zu einem späteren Zeitpunkt die Objekte vom Langfristspeicher in den Arbeitsspeicher geholt.getFirmenadresse() + "\t" + Integer.schliesseDatei().

Es können nur Objekte serialisiert werden. in /Horstmann.h.B. die Werte aller nicht-transienten Objekt-Attribute und Felder der Klasse und aller ihre Oberklassen sowie alle referenzierten Objekte. nicht aber die Werte von Referenz-Attributen. Sollen jedoch beliebige Objekte. Außerdem kann die Byte-Repräsentation dazu verwendet werden. daß die Semantik der Serialisierung für diese Klasse erfüllt ist. Die wichtigsten Operationen lauten: 454 . Zum Serialisieren steht die Klasse ObjectOutputStream zur Verfügung. S. die die Schnittstelle Serializable implementieren. und zu deserialisieren. d. 46ff. d. die Signatur der Klasse. gespeichert werden. um beliebige Objekte zu serialisieren.20. Genau genommen werden also nur die Attributwerte der Objekte gespeichert. Um Objekte persistent zu machen. Cornell 98. das ursprüngliche Objekt wieder zu rekonstruieren.6 Die Serialisierung von Objekten Die in den vorherigen Abschnitten dargestellten Möglichkeiten zur persistenten Speicherung von Daten sind gut geeignet. die vom selben Typ sind. In Java gibt es das Konzept der Serialisierung. Zusätzliche Operationen stehen für das Schreiben elementarer Datentypen zur Verfügung. dann erfordert dies einen hohen Aufwand. die außerdem noch zu unterschiedlichen Klassen gehören können. Zum Deserialisieren steht die Klasse ObjectInputStream zur Verfügung. Diese Schnittstelle besitzt keine Operationen oder Attribute. Die Byte-Repräsentation von Objekten kann man in Dateien speichern. Beim Lesen der Objekte vom Langfristspeicher werden die Objekte mit dem new-Operator neu erzeugt und erhalten von der Java-VM einen neuen Arbeitsspeicherbereich zugewiesen. und – die Datensätze eine feste Länge besitzen. Die wichtigsten Operationen lauten: s public ObjectOutputStream(OutputStream out) throws IOException ObjectOutputStream Der Konstruktor erwartet einen konkreten OutputStream. wenn – Daten zu speichern sind. Objekte über das Netz zu versenden. Durch ihre Implementierung wird nur kenntlich gemacht. um eine elementare Objekt-Persistenz zu erreichen.LE 12 2. ihren Zustand in einen Byte-Strom umzuwandeln.h. 2. In diesen Objekt-Strom werden folgende Informationen geschrieben: Die Klasse des Objekts. Schnittstelle Serializable ObjectInputStream Diese Operation schreibt das spezifizierte Objekt in den ObjectOutputStream.20 Persistenz und Datenhaltung Bei der Aufbewahrung von Objekten auf Langfristspeichern werden daher die Arbeitsspeicherreferenzen nicht gespeichert./ beschrieben. verwendet man in der Regel einen FileOutputStream. s public final void writeObject(Object obj) throws IOException Das genaue DateiFormat ist z.

In der Klasse KundenverwaltungGUI ergeben sich keine Änderungen. mit einem einzigen Aufruf der Operation writeObject serialisiert werden. Die Operation writeObject der Klasse ObjectOutputStream serialisiert mit dem als Parameter übergebenen Objekt auch alle Objekte.20. Objekt-Graph. ClassNotFoundException. LE 12 StreamCorruptedException Der Konstruktor erwartet einen konkreten InputStream. die von diesem aus durch Referenzen erreichbar sind. Dieses wiederhergestellte Objekt ist nicht identisch mit dem ursprünglichen Objekt. Die Klasse Kunde bleibt unverändert.h. d.6 Die Serialisierung von Objekten s public ObjectInputStream(InputStream in) throws IOException. Wurzelobjekt Die im vorherigen Abschnitt mit Hilfe einer Indexverwaltung und Beispiel 1 einem Direktzugriffsspeicher realisierte Kundenverwaltung soll nun mit einer Objektserialisierung implementiert werden. Da in Java auch die Klasse Vector serialisierbar ist. IOException Diese Operation liest das nächste Objekt aus dem ObjectInput Stream. der mit der Operation readObject der Klasse ObjectInputStream wieder deserialisiert werden kann. Dazu werden die Klassen Index und Datei durch eine Klasse ObjektDatei ersetzt. Persistente Objekte werden in der Regel aus einen FileInputStream gelesen. daß es ein Wurzelobjekt gibt. können nicht mehr korrekt deserialisiert werden. ist es möglich. Die Referenzen zwischen den Objekten werden bei der Deserialisierung automatisch wiederhergestellt. Es wird also stets ein ganzer Objekt-Graph serialisiert. Beim Entwurf eines System ist daher darauf zu achten. Sollen Objekte auf einem externen Speicher gespeichert werden. bis auf folgende Ergänzung: public class Kunde implements Serializable. Daher ist die Objekt-Serialisierung für große Datenmengen ungeeignet. Es wird ein neues Java-Objekt erzeugt. werden sie alle in dieselbe Datei serialisiert. Im Gegensatz zum Direktzugriffsspeicher müssen bei der Objektserialisierung alle Objekte »in einem Rutsch« geschrieben und gelesen werden. Ein zu ladender Objekt-Graph muß vollständig in den Arbeitsspeicher geladen werden können.2. s public final Object readObject() throws OptionalDataException. Das an writeObject übergebene Objekt wird Wurzelobjekt genannt. von dem aus alle zu serialisierenden Objekte durch Referenzen erreicht werden können. die mit mehreren Aufrufen von writeObject serialisiert wurden. Zusammenhängende Objekte (Objekt-Graphen). den gesamten Vector meineKunden als ein Objekt zu speichern und wieder zu lesen. aber sein Zustand und sein Verhalten sind gleich. Alle zu speichernden Objekte müssen »in einem Rutsch«. 455 .

20 Persistenz und Datenhaltung Die wichtigsten Änderungen in der Klasse KundenContainer sind im folgenden aufgeführt: /* Programmname: Objektspeicherung * Datenhaltungs-Klasse: ObjektDatei * Aufgabe: Einen serialisierten Vector sequentiell lesen und * schreiben */ import java. public class ObjektDatei { private String Dateiname... } catch (IOException e) { .Dateiname = Dateiname. try { ObjectInputStream EingabeDatei = new ObjectInputStream (new FileInputStream(Dateiname)).. AusgabeDatei..close().writeObject(WurzelObjekt). AusgabeDatei. //Konstruktor public ObjektDatei(String Dateiname) { this.io.*. } catch(ClassNotFoundException e2){ .close().LE 12 2. } } Klasse ObjektDatei 456 . } } public Object leseObjektGraph() { Object WurzelObjekt = null.readObject(). } catch(IOException e1){ . WurzelObjekt = EingabeDatei. EingabeDatei... } //Operationen public void speichereObjektGraph(Object WurzelObjekt) { try { ObjectOutputStream AusgabeDatei = new ObjectOutputStream(new FileOutputStream(Dateiname)). } return WurzelObjekt.

*. } public void endeAnwendung() { PersistenterSpeicher. } } 457 LE 12 Klasse KundenContainer . } public static KundenContainer getObjektreferenz() { if(derSingleton == null) derSingleton = new KundenContainer(). return (Kunde) meineKunden.leseObjektGraph().6 Die Serialisierung von Objekten /* Programmname: Objektspeicherung * Container-Klasse: KundenContainer * Aufgabe: Verwaltung von Objekten der Klasse Kunde * Verwaltungsmechanismus: Vector * Muster: Singleton * Iterator: mit elements() */ import java. Position). import java. public class KundenContainer implements Serializable { //Attribute private Vector meineKunden = new Vector().setElementAt(neuerKunde. meineKunden.speichereObjektGraph(meineKunden). Kunde neuerKunde) { int Position = KundenNr. } //Operationen public void insertKunde(int KundenNr.elements().setSize(Position + 1).io.elementAt(Position).*. private KundenContainer() { PersistenterSpeicher = new ObjektDatei("Kundendatei"). private ObjektDatei PersistenterSpeicher. return derSingleton. //Wenn die Daten nicht engelesen werden können.2. } public Kunde getKunde(int KundenNr) { int Position = KundenNr.util. if(Position >= meineKunden. } public Enumeration elements() { return meineKunden.size()) meineKunden.20. //Singleton-Verwaltung private static KundenContainer derSingleton. wird mit //einem leeren Vector begonnen if(meineKunden == null) meineKunden = new Vector(). //Vector-Objekt einlesen meineKunden = (Vector) PersistenterSpeicher.

LE 12 2. das schon umfangreiche Programm übersichtlich zu halten. d.2 Die gewünschte Benutzungsoberfläche zeigt Abb. Analog wird durch »-« eine bestehende Verbindung wieder aufgehoben. Durch Betätigen der Druckknöpfe »<« und »>« soll jeweils der vorherige bzw. 2. serialisierbaren Objekte mit serialisiert und in den Strom geschrieben werden. Bei der Listenanzeige sind bestehende Assoziationen pro Artikel bzw. Dies ist durch Verwendung der Klasse Vector in Java leicht möglich. zwischen Artikeln und Lieferanten beliebig viele Verbindungen herzustellen (Abb.7.und Lieferantenverwaltung realisiert werden. die es ermöglicht.h. Firmenname: String) Kapitel 4. Lieferanten anzuzeigen.2 wurde bereits eine unidirektionale 0. Hier liegt jedoch eine bidirektionale *-Assoziation vor. Nach Eingabe einer Artikel. Artikel – – – – Artikelnnr: int Bezeichnung: String Beschreibung: String Verkaufspreis: float = 0 * – liefert * – – Anbieter – Lieferant Lieferantennr: int Firmenname: String Firmenadresse: String Verbindlichkeiten: float Abb. Dort muß eine Eingabe erfolgen. Lieferanten angezeigt werden.3 Abschnitt 2. nächste Artikel oder Lieferant angezeigt werden. Jedes Artikel-Objekt und jedes Lieferanten-Objekt müssen daher mehrere Verbindungen verwalten können.20 Persistenz und Datenhaltung Da bei der Serialisierung eines Objekts auch alle referenzierten. damit eine Anzeige bzw. Durch Drücken des Druckknopfes »+« wird eine Verbindung zwischen dem angezeigten Artikel und dem angezeigten Lieferanten hergestellt.1-Assoziation realisiert.. sind hier alle Interaktionselemente in einem Fenster angeordnet. In den folgenden zwei Fachkonzept-Klassen 458 . pro Lieferant aufzulisten.20-10. eine Speicherung möglich sein soll.7. einem Artikel können mehrere Lieferanten und einem Lieferanten mehrere Artikel zugeordnet werden. dann ist dies anzugeben. Beispiel 2 Es soll eine Artikel. 2. ist es damit auch möglich. dem Lieferanten keine Daten gespeichert. 2. Die oben behandelte Drei-Schichten-Architektur wird eingehalten und erlaubt es. In Abschnitt 2. Assoziationen einfach zu speichern.oder Lieferantennummer und dem Drükken der Eingabe-Taste (Enter-Taste) sollen die Daten zu dem jeweiligen Artikel bzw.20-9). Da Menüs und mehrere Fenster erst in Kapitel 4.3 behandelt werden. Sind zu dem Artikel bzw. Die blau unterlegten Textfelder sind sogenannte Muß-Felder. Bezeichnung: String) + Lieferant(Lieferantennr:int. Bei Eingabe von »*« sind alle Artikel bzw.20-9: Assoziation zwischen Artikeln und Lieferanten + Artikel(Artikelnr:int.

private String Bezeichnung.6 Die Serialisierung von Objekten LE 12 Abb.20. import java. private float Verkaufspreis = 0f.20-10: Benutzungsoberfläche der Artikel.2. //Konstruktor 459 Klasse Artikel . 2. public class Artikel implements Serializable { private int Artikelnr.*.io. //Verwaltung der Assoziation //Anbieter ist Rollenname des Lieferanten in der Assoziation private Vector Anbieter = new Vector().und Lieferantenverwaltung * Fachkonzept-Klasse: Artikel * Aufgabe: Verwalten von Artikeln und ihre Assoziation zu * Lieferanten */ import java.util.und Lieferantenverwaltung wird davon ausgegangen.*. private String Beschreibung. daß die Assoziation immer von dem Artikelobjekt aus aufgebaut wird: /* Programmname: Artikel.

} //Standard-Schreib.elements()..und Lieferantenverwaltung * Fachkonzept-Klasse: Lieferant * Aufgabe: Verwalten von Lieferanten und ihre Assoziationen zu * Artikeln */ import java. String Bezeichnung) { this.*.removeElement(einLieferant).Lieferantennr = Lieferantennr.Bezeichnung = Bezeichnung. } Klasse Lieferant 460 .20 Persistenz und Datenhaltung public Artikel(int Artikelnr. this. public Lieferant(int Lieferantennr. einLieferant.setLinkArtikel(this). daß dort der Artikel //eingetragen wird einLieferant. public Enumeration alleAnbieter() { return Anbieter.*.Artikelnr = Artikelnr. this. } //Assoziationsoperationen //Verbindung zu Lieferant herstellen public void setLinkLieferant(Lieferant einLieferant) { //Einen Lieferanten hinzufügen Anbieter. } //Verbindung zu Lieferant löschen public void removeLinkLieferant(Lieferant einLieferant) { Anbieter. String Firmenname) { this. } } /* Programmname: Artikel. private String Firmenadresse. //Verwaltung der Assoziation //"liefert" ist der Assoziationsname private Vector liefert = new Vector(). private float Verbindlichkeiten. import java.addElement(einLieferant). public class Lieferant implements Serializable { private int Lieferantennr.util.LE 12 2.und Leseoperationen ..Firmenname = Firmenname. //Beim Lieferanten dafür sorgen. private String Firmenname.removeLinkArtikel(this).io.

Die Operationen für Kunden werden durch entsprechende Operationen für Artikel und Lieferanten ersetzt. Anwendungen werden oft nach einer →Drei-Schichten-Architektur aufgebaut. Pakete) in hierarchischen Schichten. In ihr werden lediglich für Artikel und Lieferanten je ein Vector gespeichert.Glossar //Assoziationsoperationen //Verbindung zu Artikel herstellen public void setLinkArtikel(Artikel einArtikel) { //Wird von Artikel-Objekt aufgerufen liefert. Zwischen den Schichten kann eine lineare oder strikte Ordnung bestehen. } } LE 12 Die Klasse ObjektDatei aus Beispiel 1 bleibt unverändert. Wurzelobjekt Ein Objekt in einem →Objekt-Graphen. } //Verbindung zu Artikel löschen public void removeLinkArtikel(Artikel einArtikel) { //Wird von Artikel-Objekt aufgerufen liefert. Schnittstellen. Die GUI-Klasse muß gegenüber Beispiel 1 natürlich erweitert werden. Objekt-Graph Eine Menge von Objekten.. three tier architecture →Drei-Schichten-Architektur. Datenhaltungs-Schicht. Dafür wird die Klasse Datenbasis eingeführt.h.. die durch Referenzen miteinander verbunden sind.elements(). →Schichten-Architektur. Serialisierung Umwandlung des Zustands eines Objekts und seiner Referenzen in eine Byte-Repräsentation sowie die entsprechende Rücktransformation (Deserialisierung) (→Persistenz). Die Klasse KundenContainer wird in ObjektContainer umbenannt. Ein Objekt der Klasse Datenbasis dient innerhalb von ObjektContainer als Wurzelobjekt für die Serialisierung. Schichten-Architektur Anordnung von Software-Komponenten (Klassen. Klassen ObjektDatei und ObjektContainer Wurzelobjekt Klasse Artikel LieferantenGUI Drei-Schichten-Architektur Übliche Schichtenbildung von Anwendungssystemen: BenutzungsoberflächenSchicht. Fachkonzept-Schicht. Persistenz Langfristige Speicherung von Objekten mit ihren Zuständen und Verbindungen. 461 .addElement(einArtikel). Erlaubt eine flexible Verteilung auf Client-Server-Systeme. von dem aus alle anderen Objekte des Graphen durch die Verfolgung von Referenzen erreicht werden können. so daß ein analoger Zustand im Arbeitsspeicher wiederhergestellt werden kann (→Serialisierung). um jetzt sowohl Artikel als auch Lieferanten zu verwalten. } //Standard-Schreib. d.und Leseoperationen . muß künstlich ein solches hinzugefügt werden.removeElement(einArtikel). die Objekte referenzieren sich untereinander. Da es in diesem Beispiel kein natürliches Wurzelobjekt gibt. Die entsprechende Datei befindet sich auf der CD-ROM. public Enumeration alleArtikel() { return liefert. Sie muß statt Kunden nun Artikel und Lieferanten verwalten.

Bei der wahlfreien Organisation (random access) kann im Gegensatz zur sequentiellen Organisation gezielt ein Objekt gelesen und ein Objekt geschrieben werden. Von den oberen Schichten (hier: Benutzungsoberfläche) kann immer nur auf die unteren Schichten (strikte Ordnung) bzw. Bei der Verwendung von Dateien können prinzipiell zwei Organisationsprinzipien verwendet werden: Bei der sequentiellen Organisation werden alle Objekte nacheinander geschrieben oder nacheinander gelesen. Durch die Verknüpfung von Dateiströmen mit Filterströmen ist es z. nur auf die jeweils direkt untergeordnete Schicht (lineare Ordnung) zugegriffen werden. Ein gezielter Zugriff auf ein Objekt. 462 . Umgekehrt werden alle Objekte von vorne nach hinten aus der Datei gelesen. Zur Realisierung der Persistenz ist eine Datenhaltung erforderlich. wenn alle Objekte auf dieselbe Satzlänge abbildbar sind. wie er z. Innerhalb einer Schicht können untereinander Dienstleistungen beliebig in Anspruch genommen werden.LE 12 Persistenz Zusammenhänge sequentielle Organisation wahlfreie Organisation Java Serialisierung Architektur Zustände und Verbindungen von Objekten können durch die Persistenz langfristig auf externen Speichern aufbewahrt werden. s Datenhaltung. s Fachkonzept. Die Datenhaltung kann mit Hilfe von Dateien selbst programmiert werden oder sie kann unter Einsatz von objektorientierten oder relationalen Datenbanken realisiert werden. Diese Drei-Schichten-Architektur (three tier architecture) sollte immer eingehalten werden.B. Objekte können durch Objekt-Ströme serialisiert und deserialisiert werden. ist bei dieser Organisationsform nicht möglich. wie int. Attribute elementarer Typen . Durch die Datenhaltung entsteht eine Schichten-Architektur mit drei Schichten: s Benutzungsoberfläche.B. die es erlauben. In Java wird die sequentielle Organisation durch Dateiströme realisiert. Bytes sequentiell zu schreiben und zu lesen. da sie eine Verteilung der Anwendung auf Clients und Server ermöglicht. float usw. Jedes neu zu speichernde Objekt wird hinter den bisher gespeicherten Objekten abgelegt. zu speichern.. möglich. Dadurch kann das Konzept der Serialisierung verwirklicht werden. Beim Schreiben kann jedoch kein Objekt zwischen vorhandene »dazwischengeschoben« werden. Bei der Verwendung eines Direktzugriffsspeichers wird der direkte Zugriff besonders einfach. Die wahlfreie Organisation wird durch die Klasse RandomAccessFile ermöglicht. bei Feldern möglich ist. Bei der Serialisierung werden ausgehend von einem Wurzelobjekt alle von dort aus durch Referenzen erreichbaren Objekte (Objekt-Graph) auf »einen Schlag« gespeichert. sondern es kann nur ein vorhandenes überschrieben oder angehängt werden.

private String Dateiname. i < Zeilen.. i++) { for (int j=0... Palo Alto: Sun Microsystems Press. private String Name. public Punkt(int x. S.R. Wirtschaftsinformatik I. DataOutputStream einAusgabeFilter = new DataOutputStream(eineAusgabeDatei)...und set-Operationen . Cornell 98/ Horstmann C. 7.writeInt(Werte[i][j]).1. Das Stromkonzept einschließlich Datei. } public class Punkt { int x.und Filterströmen in Java darstellen können.. Punkt Endpunkt. Stuttgart: Lucius & Lucius-Verlag..Literatur/Aufgaben /Hansen 96/ Hansen H. 1998 LE 12 1 Lernziele: Das Serialisierungskonzept von Java erläutern können. Volume II – Advanced Features. public void speichereMatrix() { FileOutputStream eineAusgabeDatei = new FileOutputStream(Name+". //get. private int Spalten. . Auflage 1996 /Horstmann. Was ist über folgende Implementierung der Klasse Matrix zu sagen? Ist die Implementierung der Operation speichereMatrix sinnvoll und formal korrekt? Gegen welches Prinzip wird hier verstoßen? public class Matrix { private int Zeilen.. } } } Analytische Aufgaben Muß-Aufgabe 15 Minuten 2 Lernziele: Das Serialisierungskonzept von Java erläutern können.mtr"). j<Spalten.y. Die Drei-Schichten-Architektur erklären können. private int[][] Werte. for (int i = 0. int y) { Klausur-Aufgabe 15 Minuten 463 . Das Serialisierungskonzept von Java für die persistente Datenhaltung verwenden können. Was ist über die Klasse Gerade bezüglich ihrer Serialisierbarkeit zu sagen? Kann die Klasse korrekt gespeichert und gelesen werden? public class Gerade implements Serializable { Punkt Startpunkt. Cornell G.. j++) einAusgabeFilter. . Java 1.

Die Klasse ObjektContainer aus Beispiel 2 ist durch die vorhandenen Operationen speziell auf eine Artikel-Lieferanten-Verwaltung zugeschnitten. Hilfreich ist die Einführung einer Vererbungshierarchie für die zu verwaltenden Klassen. 7 Lernziele: Eine Datenhaltung mit Hilfe von Datei. Einen Direktzugriffspeicher für die Datenhaltung einsetzen können. b Ein Sequenzdiagramm soll die Vorgänge darstellen. wenn nur ein Kunde angezeigt werden soll.und Filterströmen in Java programmieren können. Das Serialisierungskonzept von Java für die persistente Datenhaltung verwenden können.und Filterströmen in Java darstellen können. Welche Vorteile und Nachteile bringt diese Lösung? Welche Änderungen sind in der Klasse ArtikelLieferantenGUI durchzuführen? 5 Lernziele: Das Stromkonzept einschließlich Datei. Die Drei-Schichten-Architektur erklären können.20-8 zwei Sequenzdiagramme für die ablaufenden Vorgänge. 2. Das Serialisierungskonzept von Java für die persistente Datenhaltung verwenden können. Das Serialisierungskonzept von Java für die persistente Datenhaltung verwenden können. Zeichnen Sie analog zu Abb. um eine Datenhaltung: /9/ Spezifizierte Leiterplatten sollen geladen und gespeichert werden können.und set-Operationen } Konstruktive Aufgaben Muß-Aufgabe 60 Minuten 3 Lernziele: Das Stromkonzept einschließlich Datei. this.x=x.y=y.LE 12 Aufgaben this. Überlegen Sie. Einen Direktzugriffspeicher für die Datenhaltung einsetzen können. Aufgabe 13: Kann-Aufgabe Zeit 60 Minuten Klausur-Aufgabe 30 Minuten Muß-Aufgabe 120 Minuten Muß-Aufgabe 40 Minuten 464 . wenn der Benutzer den Druckknopf »Anzeigen« drückt. Aufgabe 5.und Filterströmen in Java darstellen können. Verwenden Sie als zusätzliche Indexklasse eine Hash-Tabelle. 6 Lernziele: Eine Datenhaltung mit Hilfe von Datei.und Filterströmen in Java darstellen können. ob die Klasse nicht allgemeiner entworfen werden könnte.und Filterströmen in Java programmieren können. Das Serialisierungskonzept von Java erläutern können. Die Drei-Schichten-Architektur erklären können. daß es möglich ist. Bidirektionale Assoziationen mit der Kardinalität * programmieren können. a Ein Sequenzdiagramm soll die Vorgänge darstellen. Erweitern Sie das Programm zur automatischen Entflechtung von Leiterplatten aus Lehreinheit 11. } //get. wenn bei Kundennummer ein »*« eingegeben wird (Ausgabe aller gespeicherten Kunden). auch über den Kundennamen zu suchen. Welche anderen Klassen sind von dieser Änderung betroffen? 4 Lernziele: Das Stromkonzept einschließlich Datei. so daß beliebige Listen von Objekten und auch mehr als zwei Listen verwaltet werden können. Ändern Sie die Kundenverwaltung so ab. Erweitern Sie das Geschäftsgrafikprogramm aus Lehreinheit 11.

bis Maschine m erreicht ist. Dieser Vorgang wird solange wiederholt. /7/ Benutzen Sie die Java-Klasse SoundPlayer zum Abspielen der Titel. /2/ Zum Abspielen kann ein Titel ausgewählt werden. ob vor dem Start jedes Titels der Titel mit dem Sänger angesagt wird (Sprachausgabe). /7/ Es soll zwischen einer Blockgrafik und einer Darstellung durch eine interpolierte Kurve gewählt werden können. /2/ Eine Charge ist gekennzeichnet durch ihren Namen. a Realisieren Sie das beschriebene PPS-System als Java-Anwendung. /3/ Eine Maschine ist gekennzeichnet durch ihren Namen. b Liefert das LPT-Verfahren optimale Ergebnisse? c Führen Sie einige Versuche mit Ihrem PPS-System durch: 465 LE 12 Kann-Aufgabe 180 Minuten Kann-Aufgabe 120 Minuten . geladen werden können. /4/ Es kann auch eine Zufallsfolge ausgewählt werden.und Filterströmen in Java programmieren können. /7/ Eine Verteilung von Chargen erfolgt nach der Longest Processing Time First (LPT)-Heuristik: Als erstes werden die Chargen der Größe nach geordnet und beginnend bei der größten nach folgender Regel auf die einzelnen Maschinen verteilt: Gestartet wird bei Maschine 1. bis wiederum Maschine 1 erreicht ist. Einen Direktzugriffspeicher für die Datenhaltung einsetzen können. Einen Direktzugriffspeicher für die Datenhaltung einsetzen können. Eine Charge bezeichnet eine Menge eines bestimmten Produkts. 8 Lernziele: Eine Datenhaltung mit Hilfe von Datei. bis alle Chargen verteilt sind. /4/ Über die Oberfläche sollen Maschinen angelegt und entfernt werden können. /5/ Verschiedene Maschinenkonstellationen sollen abgespeichert und geladen werden können. Die Firma ProfiSoft erhält von einem Maschinenbaubetrieb den Auftrag. /3/ Alle Titel können sequentiell abgespielt werden. ein Produktionsplanungssystem (PPS) zu entwickeln: /1/ n Chargen sollen so auf m gleiche Maschinen verteilt werden. /6/ Mit einem Texteditor im vorgeschriebenen Format erstellte Datensätze sollen importiert und angezeigt werden können. Maschine 2 wird dann die nächst kleinere zugewiesen usw. /9/ Jeder Balken repräsentiert eine Maschine und ihre Belegung. Ihr wird die größte Charge zugewiesen. /10/Aus dem Balkendiagramm soll zusätzlich abzulesen sein. Schreiben Sie ein Java-applet zur Verwaltung eines CD-Players. /5/ Die Musikstücke können endlos laufen. /6/ Es sollen Produktionstage und ihre Chargen eingegeben und abgespeichert bzw. wie die Chargen auf Maschinen verteilt wurden. so soll das Ergebnis als Balkendiagramm ausgegeben werden. Bei Maschine m kehrt sich der Zuweisungsprozeß dann um. das folgende Anforderungen erfüllt: /1/ n Musikstücke werden als Dateien gespeichert. /8/ Ist eine Verteilung der Chargen auf die Maschinen berechnet worden.Aufgaben /5/ Datensätze sollen geladen und gespeichert werden können. ihre Nummer und ihren Produktionszeitbedarf. daß eine möglichst geringe Gesamtproduktionszeit entsteht. /6/ Es kann gewählt werden.und Filterströmen in Java programmieren können. 9 Lernziele: Eine Datenhaltung mit Hilfe von Datei.

Wählen Sie ein geeignetes Speicherungskonzept. Erweitern Sie das in Abschnitt 2. 466 . Das Serialisierungskonzept von Java für die persistente Datenhaltung verwenden können. daß die Daten langfristig aufbewahrt werden. Im nächsten Versuch betrachten Sie wenige Chargen mit stark schwankenden Produktionszeiten.LE 12 Aufgaben Wählen Sie zunächst viele Chargen mit wenig schwankenden Produktionszeiten. Gehen Sie davon aus.19. daß alle Daten auf einmal in den Arbeitsspeicher geladen werden können. Was ist jeweils über die Qualität des Ergebnisses zu sagen? Klausur-Aufgabe 40 Minuten 10 Lernziele: Das Serialisierungskonzept von Java erläutern können.und Filterströmen in Java programmieren können. Eine Datenhaltung mit Hilfe von Datei.7 beschriebene Programm Lexikon so.

Verifikationsregeln für die Zuweisung. Einfache Programme mit einer Anfangs.1 3. spezifizierter Programme verifizieren können.6 3. die Sequenz. Zusicherungen als boolesche Ausdrücke schreiben können. der im 4. lebte./ 467 .und Endebedingung spezifizieren können.und Endebedingung 479 Anfangs-/Endebedingungen und Zusicherungen in Java 481 Verifikationsregeln 484 Termination von Schleifen 489 Entwickeln von Schleifen 492 Die ältesten uns bekannten Algorithmen stammen von dem griechischen Mathematiker Euklid. 23 f. Die Implementierung einfacher.3 3. die einund zweiseitige Auswahl sowie die abweisende Wiederholung (einschließlich der Konsequenzregel) kennen und anwenden können. Eine Schleife aus einer gegebenen Invariante und Terminationsfunktion entwickeln können.7 Algorithmik und Software-Technik 468 Algorithmen und ihre Eigenschaften 469 Verifikation 474 Intuitive Einführung 474 Zusicherungen 477 Spezifizieren mit Anfangs.2 3.2. Eigenschaften einer Terminationsfunktion nennen und erläutern können.1 3.2.Chr. Jahrhundert v. Methoden zur Entwicklung einer Schleifeninvariante kennen und auf einfache Programme anwenden können.2.5 3.und die Programmablaufplan-Notation muß bekannt sein (diese werden in Kapitel 2.13 behandelt).4 3. s Die Struktogramm.LE 13 3 Algorithmik und Software-Technik – Algorithmen und ihre Verifikation s s s s s s s s s Den intuitiven Algorithmusbegriff angeben und erklären können. Anfangs.2 3. Sie umfassen Konstruktionsverfahren für Dreiecke aus gegebenen Stücken und den euklidschen Algorithmus zur Berechnung des größten gemeinsamen Teilers zweier ganzer Zahlen /Goos 95.2. s 3 3. verstehen anwenden Für Leser mit Programmiererfahrung ist dieses Kapitel ohne Kenntnis der vorangegangenen Kapitel verständlich.2./3.und Endebedingungen sowie Zusicherungen in JavaProgramme integrieren können.2. S.2.

3) ermöglicht den Nachweis. Die aufgeführten Methoden gehören einerseits zum engeren Bereich der Algorithmik.8) sowie Such. Beim Schreiben von Programmen hatte sicher jeder schon Probleme mit der »Qualität« seines Programms. sind Kenntnisse der Psychologie des Programmierens hilfreich. England (MA).2) trägt dazu bei.10). Studium an der Universität Oxford. seit 1968 Professor für Informatik. wie man konstruktiv und analytisch diese Probleme vermeiden bzw. Im Hauptkapitel 2 wurden bereits wichtige Algorithmen und Datenstrukturen wie Felder.4). Sollen nicht nur Algorithmen und Programme. Es gibt jedoch weitere wichtige Algorithmen und Datenstrukturen. welches Programm das Problem bezogen auf den Aufwand bzw. die Effizienz am besten löst. Nun ist es an der Zeit zu »verschnaufen« und das bisher Behandelte unter anderen Gesichtspunkten zu vertiefen.7) und Bäume (Kapitel 3.5). Hoare *1934. Warteschlangen.9) und Sortieralgorithmen (Kapitel 3. Nach dem Start des Programms konnte das Programm nicht mehr beendet werden. Ein intuitives Wissen über Algorithmen und ihre Eigenschaften ist hierfür notwendig (Kapitel 3. Aus eigenen Fehlern kann man durch »selbstkontrolliertes Programmieren« lernen. Prof. Dazu gehören die Datenstrukturen Listen (Kapitel 3. Alle wichtigen objektorientierten und prozeduralen Konzepte wurden behandelt. Daher hat sich die Informatik auch schon früh darum gekümmert. ersetzt die Verifikation insbesondere bei umfangreichen Programmen. Keller und Streuspeicherung (hashing) angesprochen. wesentliche Beiträge zur nebenläufigen Programmierung. andererseits zur Software-Technik. Charles A. Algorithmen besser zu verstehen und ihre Korrektheit formal zu beweisen. Aufwand Algorithmen und Datenstrukturen 468 . Die Anwendung der Konzepte wurde an einfachen und umfangreichen Programmen verdeutlicht.1). dann stellt sich die Frage. Zur Beantwortung dieser Frage müssen prinzipielle Aufwandsbetrachtungen für Algorithmen angestellt werden (Kapitel 3. Um nicht nur einzelne Produkte. Es wurden nicht die Ergebnisse ausgegeben. Haben mehrere Programmierer oder Teams Programme für das gleiche Problem geschrieben. heute an der Universität Oxford. 1980: ACM Turing Award.LE 13 3 Algorithmik und Software-Technik 3 Algorithmik und Software-Technik Im vorangegangenen Hauptkapitel 2 dieses Buches wurden die Grundlagen der Programmierung vermittelt. sondern auch Dokumente überprüft werden. daß ein Programm für bestimmte Eingabedaten die gewünschten Ergebnisse liefert. Solche und ähnliche Probleme gehören zum Alltag des Informatikers. Es ergänzt bzw.6). Durch ein mehrstufiges Verfahren kann der persönliche Software-Entwicklungsprozeß schrittweise verbessert werden (Kapitel 3. sondern den Entwicklungsprozeß an und für sich zu verbessern. Während der Laufzeit gab es »unerklärliche« Fehlermeldungen. beheben kann. Die Verifikation von Algorithmen (Kapitel 3. die für viele Anwendungsbereiche essentiell sind.(Kapitel 3. R. Wegbereiter des Verstehens von Programmen. dann sind Walkthroughs und Inspektionen geeignete Methoden (Kapitel 3. die man erwartete. Das Testen von Programmen (Kapitel 3. mehrjährige Industrietätigkeit.

d. als Ingenieurdisziplin im Vorfeld von Programmier. unabhängig von einer konkreten Programmiersprache und einem konkreten Computersystem. mit den mathematisch exakten Definitionen eines Algorithmus und deren Gleichwertigkeit. auf Variablen. befaßt sich u. 469 Datenstrukturen Es gibt viele Lehrbücher. Da Algorithmen immer Datenstrukturen verwenden und manipulieren. Für die »Grundlagen der Informatik« genügt ein intuitives Verständnis des Algorithmusbegriffs und die Fähigkeit. sind Datenstrukturen immer inbegriffen. konkret angegebene Algorithmen in problemorientierten Programmiersprachen wie Java zu formulieren. arbeitet auf der Basis einer ingenieurmäßig intuitiven Algorithmusdefinition. Die Algorithmen greifen auf Attribute. endlichen (d) Verfahrens zur schrittweisen Ermittlung gesuchter Größen aus gegebenen Größen. werden unter dem Begriff Algorithmen auch immer Datenstrukturen subsumiert. Algorithmen beschreiben ein Verfahren zur Lösung eines Problems. die Konstruktion und das Erfinden von Algorithmen sind ein zentrales Thema der Informatik. als Disziplin der theoretischen Informatik und der Mathematik.1 Algorithmen und ihre Eigenschaften LE 13 Das Ziel des Hauptkapitels 3 besteht also darin. zu und manipulieren sie.3. Wenn im folgenden also von Algorithmen gesprochen wird. 3. Intuitiv läßt sich der Begriff Algorithmus folgendermaßen definieren: Ein Algorithmus ist eine eindeutige (a). Die Algorithmik. das Wissen über Algorithmen und Datenstrukturen.1 Algorithmen und ihre Eigenschaften Die Funktionalität einer Anwendung wird durch die Operationen der Klassen zur Verfügung gestellt. Eine Datenstruktur kann eine Variable eines einfachen Typs sein. zu verbreitern und zu festigen. Im Literaturverzeichnis ist eine Auswahl aufgeführt. Die Analyse. Sowohl Programmiersprachen als auch Computersysteme sind in diesem Zusammenhang »nur« Mittel zum Zweck – nämlich Algorithmen automatisch auszuführen. Eine Variable kann aber auch ein Feld repräsentieren oder ein Zeiger auf ein Objekt einer Klasse sein. Die Operationen selbst realisieren mehr oder weniger komplexe Algorithmen.a. Was ist nun ein Algorithmus? Die Antwort hängt von der Sichtweise ab /Stoschock 96/: Die Algorithmentheorie. Algorithmusbegriff Algorithmentheorie Algorithmik intuitiver Algorithmusbegriff . ihren Aufwand und ihre Qualität zu vertiefen.und Software-Technik. endliche (b) Beschreibung eines allgemeinen (c). Verallgemeinert handelt es sich bei Attributen um Datenstrukturen. um auf dieser Grundlage bessere Programme erstellen zu können.h. die dem Thema »Algorithmen und Datenstrukturen« gewidmet sind.

Ein Algorithmus muß ausführbar (f) sein. allgemeine Problemlösung Beispiel 470 . eine eindeutige Beschreibung sicherzustellen. Oder doch? Die Mathematik behilft sich mit »drei Punkten«.h.h.LE 13 3 Algorithmik und Software-Technik Eigenschaften von Algorithmen: eindeutige Beschreibung endliche Beschreibung: statische Finitheit Die Beschreibung erfolgt in einem Formalismus (e) mit Hilfe von anderen (e) Algorithmen und. der die eindeutige Interpretation durch einen Prozessor – ob Mensch oder Automat – sicherstellt. 3. insbesondere erfolgt eine Ein. Die Wahl eines einzelnen.1-1 zeigt ein spezielles Verfahren. muß ihn abarbeiten können. Bei der Ausführung eines Algorithmus werden Objekte (g) manipuliert. Ein Algorithmus löst ein allgemeines (c) Problem oder eine allgemeine Problemklasse und nicht nur ein spezielles Problem. Unendlich lange Beschreibungen gibt es nicht. letztlich. ein Prozessor. Eine solche Beschreibung ist für einen Algorithmus nicht zulässig. Aufgaben des gleichen Typs sollen mit einem Algorithmus gelöst werden. Eine Additionsvorschrift sieht beispielsweise folgendermaßen aus: 1 1 1 + – + – +… 2 3 Diese Notation ist die endliche Beschreibung eines (abzählbar) unendlichen Problems. 3. Aus der Formulierung des Algorithmus muß die Abfolge der einzelnen Verarbeitungschritte eindeutig hervorgehen. wie Auswahl und Wiederholung. der den Formalismus kennt und die elementaren Algorithmen beherrscht. wie die Auswahl einer der Möglichkeiten erfolgen soll. Der Unterschied zwischen einem speziellen und einem allgemeinen Verfahren läßt sich durch eine Gegenüberstellung (Abb. Programmiersprachen wurden dazu entwickelt. Dieser Algorithmusbegriff verdeutlicht typische Eigenschaften von Algorithmen: Ein Algorithmus muß eindeutig (a) beschrieben sein. die rechte Seite ein allgemeines Verfahren. Es muß aber genau festliegen. Hierbei sind Wahlmöglichkeiten. Die linke Seite der Abb. daß ein Algorithmus die Lösung einer Klasse von Problemen nach dem gleichen Schema ermöglicht. aktuell zu lösenden Problems aus dieser Klasse erfolgt durch Parameter. die die unendliche Fortsetzung angeben (Ellipse). Allgemeinheit bedeutet. elementaren (e) Algorithmen. d. d.und Ausgabe von Objekten. erscheint zunächst trivial. Ein Algorithmus kann aber auch in jedem beliebigen anderen Formalismus (e) dargestellt werden.1-1) verdeutlichen. Daß eine Algorithmenbeschreibung endlich (b) ist. zugelassen.

B. Hier wird bereits die Grenze der Leistungsfähigkeit des Algorithmus überschritten. ob sie terminieren oder nicht. Alle Dienstleistungen basieren letztendlich auf definierten elementaren Algorithmen (e). Diese Aufgabe ist jedoch prinzipiell nicht zu leisten. sondern nur Addition und Subtraktion. Ausnahmen von der Regel sind z. um Dienstleistungen anderer Klassen in Anspruch zu nehmen. der für alle Algorithmen feststellt. Man kann beweisen. In objektorientierten Programmiersprachen geschieht dies durch das Versenden von Botschaften. 20 cm beträgt: 2 * 30 cm * 10 cm + 2 * 10 cm * 20 cm + 2 * 30 cm * 20 cm = 2200 cm2 Allgemeines Verfahren: Die Oberfläche eines Quaders mit den Kantenlängen a. der terminiert.1-1: Spezielles vs. mit Algorithmen möglichst allgemeine Problemklassen zu lösen. Ein Algorithmus muß in der Regel für jede Eingabe nach endlich vielen Abarbeitungsschritten ein Ergebnis liefern und anhalten. daß im allgemeinen algorithmisch nicht entschieden werden kann. dynamische Finitheit Halteproblem andere Algorithmen. 10 cm. In Programmiersprachen sind die elementaren Algorithmen definiert. elementare Algorithmen . Es gibt nichttriviale Aufgaben. die zwar lösbar (berechenbar) sind. dann müßte durch einen Multiplikationsalgorithmus die Multi471 c Ziel: Wiederverwendbarkeit endliches Verfahren: Termination. b und c berechnet sich nach der Formel: O = 2ab + 2ac + 2bc. d. die der ausführende Prozessor beherrschen muß. erhält man eine Verallgemeinerung der Beschreibung bereits durch die Verwendung allgemeiner Bezeichner. Es liegt nahe. Stellt eine Programmiersprache beispielsweise keine Multiplikation zur Verfügung. terminieren.3.1 Algorithmen und ihre Eigenschaften LE 13 Abb. für deren Lösung jedoch kein Algorithmus angegeben werden kann. 3. durch die Festlegung von mathematischen Operationen. Anstelle von Kantenlänge 30 cm schreibt man Kantenlänge a. Steuerungsalgorithmen wie das Betriebssystem eines Computers oder ein Ampelsteuerungsprogramm. ob ein Algorithmus terminiert oder nicht (Halteproblem).h. einen Algorithmus zu entwikkeln.B. z. Wie das Beispiel zeigt. um sein Lösungsverfahren zu beschreiben. allgemeines Verfahren 20 cm 10 30 cm cm a b Spezielles Verfahren: Die Oberfläche des Quaders mit den Kantenlängen 30 cm. Ein Algorithmus verwendet in der Regel andere Algorithmen (e). Unter dem Gesichtspunkt der »Wiederverwendbarkeit« von Programmen ist es besonders wichtig.

Zu den schwierigen Aufgaben gehört die Suche nach schnelleren Algorithmen (kürzere Laufzeit) oder kompakteren Algorithmen (geringerer Speicherbedarf) oder der Beweis. daß es zu jedem Algorithmus unendlich viele verschiedene. daß es solche nicht geben kann. Die Anweisungen eines Algorithmus müssen ausführbar (f) sein. Neben der Laufzeit und dem Speicherbedarf gibt es noch weitere Kriterien. Er bildet die definierten elementaren Algorithmen einer Programmiersprache auf die noch primitiveren Algorithmen des automatischen Prozessors ab. In Abhängigkeit von zukünftigen Ereignissen.LE 13 3 Algorithmik und Software-Technik Ausführbarkeit Voraussetzungen Termination Korrektheit Aufwand. es müssen Handlungsanweisungen sein. kann man keine gegenwärtigen Entscheidungen treffen. deren Algorithmen eine so lange Laufzeit haben. Die Anzahl der verfügbaren elementaren Algorithmen bzw. Effizienz Kapitel 3. Für die »Praktische Informatik« stellen sich aber noch folgende Fragen: Unter welchen Bedingungen bzw.6 plikation auf Addition und Subtraktion zurückgeführt werden. Der intuitive Algorithmusbegriff zeigt. ebenso ihre Ausführungszeit. und wie sehen die möglichen Ausgaben bei zulässigen Eingaben aus? Endet der Algorithmus für alle zulässigen Eingaben. um die Wartezeit zu verkürzen« ist nicht ausführbar. Eine Vorschrift wie »Wenn man in 14 Tagen Zahnschmerzen bekommt. Im Prinzip übernimmt eine solche Aufgabe der Compiler. damit es sich um einen Algorithmus handelt. dann liegt kein Algorithmus vor.h. d. Eine zentrale Aufgabe der Informatik ist es. Wie aufwendig bzw. Ist ein Lösungsalgorithmus entdeckt und formuliert. die die Güte oder die Qualität eines Algorithmus ausma472 . daß mit heutigen und zukünftigen Computersystemen keine Problemlösung berechnet werden kann. dann ist bereits heute mit dem Zahnarzt ein Termin auszumachen. welche Eigenschaften ein Verfahren besitzen muß. dann ist das Problem aus Sicht der »Theorie« erledigt. und wie beweist man die Termination? Löst der Algorithmus das gewünschte Problem richtig? Anders ausgedrückt: Wie kann man sicher sein. äquivalente Algorithmen gibt. Außerdem gibt es Problemklassen. Für die Lösung dieser Probleme gibt es keine allgemeinen Methoden. Probleme durch Algorithmen zu lösen. über deren Eintreten zum gegenwärtigen Zeitpunkt keine sichere Aussage gemacht werden kann. daß für alle Eingaben die gewünschten Ergebnisse erzielt werden? Diese ersten drei Fragen werden in den folgenden Kapiteln ausführlich behandelt. die der Prozessor abarbeiten kann. Voraussetzungen arbeitet der Algorithmus? Welche Eingaben sind erlaubt. Fehlt eine dieser Eigenschaften. Elementaroperationen ist beschränkt. wie effizient ist der Algorithmus? Es läßt sich beweisen. die die gleiche Aufgabe lösen.

daß der Begriff des Algorithmus verschieden definiert werden kann und daß diese Definitionen unter dem Gesichtspunkt der Berechenbarkeit äquivalent sind. applikativen. Die Problematik dieser Kriterien besteht darin.3. deterministischen Algorithmusbegriff. welche Operationen der Prozessor auszuführen hat. Ein kurzer Überblick. auch über theoretische Aspekte. dann kann er niemals 473 Determinismus Erweiterung des Algorithmenbegriffs nichtprozedurale Algorithmenbegriffe Berechenbarkeit . da sie für die praktische Informatik von untergeordneter Bedeutung sind. Durch Einbringen nichtdeterministischer. Gibt es an mindestens einer Stelle zwei oder mehr Fortsetzungsmöglichkeiten. für die kein Algorithmus existiert. Im folgenden wird auf diese Algorithmenbegriffe nicht eingegangen. Liegt ein Verfahren bzw. Deterministisch bedeutet. Die oben angegebene klassische Algorithmusdefinition ist eine prozedurale Definition. die beim Lösen bestimmter Aufgabenklassen wesentlich leistungsfähiger sind als klassische Algorithmen. in /Balzert 98/ behandelt. Diese werden z. Die Suche nach nichtprozeduralen Algorithmusdefinitionen führte zur funktionalen bzw. Lister 90/ gegeben. wie kann dann entschieden werden. Offenbar gibt es auch Verfahren bzw. Die theoretische Informatik hat gezeigt. wird in /Goldschlager. ob es einen Algorithmus dafür gibt oder nicht? Die Beantwortung dieser Frage ist wichtig. zur prädikativen bzw. evolutionärer und anderer Elemente gelangt man zu Algorithmen. Bei dem oben aufgeführten intuitiven Algorithmusbegriff handelt es sich um den klassischen. – Es wird die Reihenfolge festgelegt. Ein Beispiel ist das Erfinden von Algorithmen selbst. Dabei handelt es sich um einen kreativen Prozeß. Sind den Fortsetzungsmöglichkeiten Wahrscheinlichkeiten zugeordnet.B. wie sie seit über 50 Jahren in der Informatik verwendet wird. logikorientierten und zur deklarativen Programmierung. dann liegen stochastische Algorithmen vor. ein Prozeß vor. Es gibt aber keinen Algorithmus zum Erfinden von Algorithmen. Zu diesen Kriterien gehören die Zuverlässigkeit. von denen eine beliebig ausgewählt werden kann. daß der Grad ihrer Erfüllung schwer meßbar ist. dann heißt ein Algorithmus nichtdeterministisch. Hat man einen Algorithmus zu einem Problem gefunden. für den die Software-Technik methodische Rahmen und Regeln entwickelt hat. Wenn ein Vorgang nicht durch einen Algorithmus beschrieben werden kann. Für eine solche Definition sind zwei Merkmale charakteristisch: – Es wird festgelegt.1 Algorithmen und ihre Eigenschaften LE 13 chen. Prozesse. stochastischer. dann liegt ein algorithmisch lösbares Problem vor. daß zu jedem Zeitpunkt der Ausführung genau eine Möglichkeit der Fortsetzung besteht. in der die Operationen auszuführen sind (Determinierung). die Änderbarkeit und die Übertragbarkeit.

2 bis 3. Die Abschnitte 3.LE 13 3 Algorithmik und Software-Technik durch ein Computersystem ausgeführt werden. /Baber 90/. Eine Einführung in die Berechenbarkeit enthält /Goldschlager. wurden Methoden entwickelt.2. bevor die einzelnen Konzepte genauer betrachtet werden. Das oben erwähnte Halteproblem ist beispielsweise nicht berechenbar. Unter dem Begriff Berechenbarkeit (computability) befaßt sich die theoretische Informatik mit diesen Fragestellungen. ist dann korrekt. liefert das Testen keine Gewißheit über die Korrektheit des Programms für die noch nicht getesteten Eingabedaten.2 Verifikation Beim Testen wird für einige möglichst gut ausgewählte Testdaten das Programm ausgeführt und beobachtet. Um diesen prinzipiellen Nachteil des Testens zu vermeiden. Olderog 94/. um durch theoretische Analysen die Korrektheit eines Programms zu zeigen. in den Büchern /Apt. Da in der Regel aus Aufwandsgründen nicht alle möglichen Kombinationen von Eingabedaten getestet werden können. um später die Korrektheit des fertigen Programms garantieren zu können. Verifikation ist eine formal exakte Methode. Die Ausführungen in diesem Kapitel geben nur eine elementare Einführung in die Verifikati