54
Unterlagen: Praktische Informatik 2, Sommersemester 2005 Prof. Dr. Manfred Schmidt-Schauß Fachbereich Informatik Johann Wolfgang Goethe-Universit¨ at Postfach 11 19 32 D-60054 Frankfurt E-mail:[email protected] URL: http://www.ki.informatik.uni-frankfurt.de/ Tel: 069 / 798 28597 Fax: 069/ 798 28919 5. April 2005

Unterlagen: Praktische Informatik 2, Sommersemester 2005 · Dies funktioniert analog zum Prinzip der Briefpost: Briefe (mit Absen- der und Empf¨anger-Adresse und Daten) werden von

  • Upload
    dinhnhi

  • View
    220

  • Download
    0

Embed Size (px)

Citation preview

Unterlagen: Praktische Informatik 2,

Sommersemester 2005

Prof. Dr. Manfred Schmidt-SchaußFachbereich Informatik

Johann Wolfgang Goethe-UniversitatPostfach 11 19 32D-60054 Frankfurt

E-mail:[email protected]: http://www.ki.informatik.uni-frankfurt.de/

Tel: 069 / 798 28597Fax: 069/ 798 28919

5. April 2005

Inhaltsverzeichnis

1 WWW, OO und Java 31.1 Internet + WWW . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1.1.0.1 IP Version 6; neue Version der IP-Adressen . . . 41.1.0.2 Domain Name System (DNS) . . . . . . . . . . . 4

1.2 Objektorientierte Programmierung am Beispiel von Java . . . . . 81.2.1 Was hat Java mit dem WWW zu tun? . . . . . . . . . . . 81.2.2 Versionen und Kompatibilitat mit Browsern . . . . . . . . 91.2.3 Objektorientierte Programmierung

am Beispiel Java . . . . . . . . . . . . . . . . . . . . . . . 101.2.4 Objekte und Methoden . . . . . . . . . . . . . . . . . . . 11

1.2.4.1 Methoden . . . . . . . . . . . . . . . . . . . . . . 111.2.5 Nachrichten; Methodenaufruf . . . . . . . . . . . . . . . . 12

1.2.5.1 Art der Verarbeitung: Call by reference und value 121.2.6 Klassen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131.2.7 Methoden . . . . . . . . . . . . . . . . . . . . . . . . . . . 151.2.8 Klassen und Vererbung . . . . . . . . . . . . . . . . . . . 151.2.9 Wesentliche Eigenschaften der objektorientierten Pro-

grammierung . . . . . . . . . . . . . . . . . . . . . . . . . 171.2.10 Wiederverwendbarkeit; Reusability . . . . . . . . . . . . . 181.2.11 Programmierhinweise . . . . . . . . . . . . . . . . . . . . 19

1.2.11.1 UML: Unified Modelling Language . . . . . . . . 191.2.12 Eigenschaften von Java . . . . . . . . . . . . . . . . . . . 20

1.2.12.1 Typische Phasen der Java-Entwicklung undAusfuhrung . . . . . . . . . . . . . . . . . . . . . 22

1.3 Programmierung in Java . . . . . . . . . . . . . . . . . . . . . . . 221.3.0.2 Primitive Datentypen . . . . . . . . . . . . . . . 22

1.3.1 Operatoren . . . . . . . . . . . . . . . . . . . . . . . . . . 231.3.2 Ausdrucke . . . . . . . . . . . . . . . . . . . . . . . . . . . 231.3.3 Anweisungen . . . . . . . . . . . . . . . . . . . . . . . . . 23

1.3.3.1 if . . . . . . . . . . . . . . . . . . . . . . . . . . 231.3.3.2 switch . . . . . . . . . . . . . . . . . . . . . . . 241.3.3.3 while . . . . . . . . . . . . . . . . . . . . . . . . 241.3.3.4 do-while . . . . . . . . . . . . . . . . . . . . . . 241.3.3.5 for . . . . . . . . . . . . . . . . . . . . . . . . . 24

1

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 2

1.3.3.6 Markierungen . . . . . . . . . . . . . . . . . . . 251.3.3.7 Konstruktoren . . . . . . . . . . . . . . . . . . . 251.3.3.8 Felder . . . . . . . . . . . . . . . . . . . . . . . . 25

1.3.4 Kommentare . . . . . . . . . . . . . . . . . . . . . . . . . 261.3.5 Klassenkonversion, Typkonversion, cast . . . . . . . . . . 261.3.6 Ausnahmen, Exceptions . . . . . . . . . . . . . . . . . . . 261.3.7 Zugriffsrechte . . . . . . . . . . . . . . . . . . . . . . . . . 271.3.8 Modifikatoren . . . . . . . . . . . . . . . . . . . . . . . . . 271.3.9 Applets und Applikationen . . . . . . . . . . . . . . . . . 31

1.3.9.1 Methoden eines Applets . . . . . . . . . . . . . . 321.3.10 Schnittstellen . . . . . . . . . . . . . . . . . . . . . . . . . 351.3.11 Klassenbibliotheken in Java . . . . . . . . . . . . . . . . . 351.3.12 Mathematische Bibliothek . . . . . . . . . . . . . . . . . . 361.3.13 Collections, Vektoren, Listen . . . . . . . . . . . . . . . . 36

1.3.13.1 Iterator . . . . . . . . . . . . . . . . . . . . . . . 371.3.14 Nebenlaufige Berechnung: Threads . . . . . . . . . . . . . 371.3.15 Beispiel eines Applets: hanoi . . . . . . . . . . . . . . . . 39

1.4 Graphische Programmierung (GUIs: graphical user interfaces) . . 421.4.1 Programmierung, Ereignissteuerung . . . . . . . . . . . . 431.4.2 GUIs in Java (Ereignismodell 1.0 . . . . . . . . . . . . . . 441.4.3 Ereignissteuerung nach dem Java Ereignis-Modell 1.1 . . 50

1.5 Kritikpunkte an der objektorientierten Programmierung . . . . . 51

Kapitel 1

WWW, OO und Java

1.1 Internet + WWW

Das Internet ist ein weltweiter Verbund von elektronischen Geraten (Com-puter, Router, Gateways, Drucker,. . . ) (Knoten), die mit Standleitun-gen,Telefonleitungen, Funkverbindungen, . . . verbunden sind und uber Internet-protokolle kommunizieren.

Der Datenaustausch ist paketvermittelt: Daten werden in Pakete zerlegt, mitAbsender und Empfangeradresse versehen, dann von Sender zum Empfangerubertragen und beim Empfanger wieder zusammengesetzt.

Sogenannte Intranets sind lokale Netzwerke (auch globale firmeninterne),die (logisch) getrennt vom Internet arbeiten, aber evtl die gleichen Methodenverwenden.

Etwas Geschichte:

• ca. 1970: Ursprunge des Netzes sind Projekte des amerikanischen Vertei-digungsministeriums zur Vernetzung von Rechnern und Ausfallsicherheit.

• 1983: ARPANet, danach verschiedene andere Netze (NSFNET).TCP / IP wird als Standard verwendet. Starke Nutzung in Forschungs-einrichtungen und Universitaten (E-Mail)

• 1988 Internet Wurm.

• 1991 / 1993 Mosaic, Gopher, WWW. Die Anfange gehen wesentlich aufKonzepte zuruck, die am CERN (Conseil Europeen pour la RechercheNucleaire) entwickelt wurden.

• 1996: 3 Millionen europaische Knoten

• 2002: ca. 90 Millionen Knoten.

3

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 4

Die Knotenadressen (IP-Adressen, bzgl IPv4) sind von der Form n.n.n.n,wobei n eine Zahl zwischen 1 und 255 sein kann. Z.B. ist 141.2.10.1 dieAdresse des Rechners der KI. Es sind nicht alle kombinatorisch moglichenAdressen zulassig. Manche haben feste Bedeutung: 127.0.0.1. (localhost, bzw.loopback.device), ist immer ein Ruckverweis auf den eigenen Rechner. Die IP-Adresse setzt sich aus Netzwerk-Adresse und Rechneradresse zusammen. Es gibtdrei Arten von Netzwerken, die sich nur durch die Große des Netzwerks und derAdresse unterscheiden. 1) Netzwerkadresse ist ein Byte, aber nur zwischen 1 und126. Die Rechner haben dann drei Byte zur Adressierung. 2) Netzwerkadressesind zwei Byte, das erste Byte ist zwischen 128 und 191. 3. kleine Netzwerke,deren Adresse aus drei Bytes zusammengesetzt ist.

Die Adressen 192.168.n.n werden als lokale IP-Nummern verwendet. ZumTeil werden diese Nummern dynamisch vergeben, um den knappen Raum derIP-Adressen besser zu nutzen.

1.1.0.1 IP Version 6; neue Version der IP-Adressen

Addressen sind 128 Bit (16 Byte) statt 32 Bit (4 Byte), das sind 2128, bzw. ca.3 ∗ 1038 mogliche Adressen.

IPv6 Adressen schreibt man analog zu IP-Adressen, aber mit 8 mal2-Byte, und den Block von 2 Byte als vierstellige Hexadezimalzahl, je-weils getrennt mit ”:“, wobei man einen Block mit Nullen weglassen darf.1234:0:0:0:0:4711:AAFF:09FB ware eine mogliche Adresse. Da man genut Platzhat, verwendet man die erste Halfte als Routing Information, und die zweiteHalfte als Host-Adresse.

Netzblocke (Netblocks) kann man durch ”Netzwerk-Nummer/ AnzahlAdress-Bits des Netzes“angeben.

1.1.0.2 Domain Name System (DNS)

Rechner (Knoten) haben i.a. eine textuelle Adresse ”hera.informatik.uni-frankfurt.de“, die von verschiedenen zentralen Rechnern (Namens-Server) ineine Knotenadresse umgesetzt werden konnen. Als Standard wird das letzteKurzel dem Land bzw. einem anderen Bereich zugeordnet.ISO Landercodes: Z.B.

de = Deutschland,fr = Frankreich,at = Osterreich,au = Australien ,jp = Japan

Andere Kurzel, die ursprunglich nur Knoten in den USA bezeichneten:

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 5

com (commercial) Industrie, Firmen, usw.org nicht kommerzielle Organisationen (DV-bezogen)net (Netz bezogen)edu (Universitaten, Schulen, ... )mil (Militar, USA)gov (Regierung, USA)eu (Europa). . . Weitere

Die wesentlichen Aktivitaten (bzw. Dienste) des Internets sind:

• Email elektronische Post (E-mail, verschiedene Protokolle).Versenden und Empfangen von elektronischen Texten/Nachrichten/ Infor-mation. Einseitig, asynchron.

I.a. wird das Protokoll SMTP (simple mail transport protocol) verwendet.Dies funktioniert analog zum Prinzip der Briefpost: Briefe (mit Absen-der und Empfanger-Adresse und Daten) werden von einer Poststelle zumVerteiler gesendet, evtl. zwischengelagert, und landen im Briefkasten desEmpfangers. Dieses Protokoll kann i.a. nur 7-Bit ASCII-Texte behandeln,d.h. das 8te Bit wird ignoriert, bzw. abgeschnitten. Um damit Binarda-ten zu versenden. mussen diese erst umkodiert werden (Z.B. uuencode,uudecode). Ein anderes Protokoll zum Versenden von Daten ist MIME(Multipurpose Internet Mail Extension), das mehr Dateitypen kennt undderen Kodierung und Dekodierung ubernimmt (Typen sind: text,message,application,image, audio, video; es gibt noch Untertypen).

Ein Problem ist unerwunschte Post (Reklame, sogenannte spam). Diekonnte im Extrem das ganze System zusammenbrechen lassen. Szenario:alle Firmen senden mit einem Klick ihre Reklame an viele (alle) Mail-adressen. Heute gibt es viele Filter und Vermeidungsstrategien, die un-erwunschte und/oder kommerzielle Reklamepost weitgehend ausschalten.

• nntp NewsElektronisches Analog zu schwarzen Brettern. Alle konnen es lesen, wennsie zum schwarzen Brett gehen und davor stehen. Man kann auch selbsteinen Zettel festmachen. Nach einer gewissen Zeit werden alte Nachrich-ten entfernt. Es gibt viele sogenannte Newsgruppen zu den verschieden-sten Themen. Zu unmoderierten Newsgruppen kann jeder unkontrolliertetwas beitragen. Moderierte Newsgruppen zensieren die Zettel (Nachrich-ten) vorher.

• ssh secure shellHier wird die Kommunikation verschlusselt durchgefuhrt. Insbesonderewerden die Passworter nicht unverschlusselt ubertragen. Allerdings ist beider ersten Kontaktaufnahme die Vereinbarung eines Schlussels notwendig,was ein Schwachpunkt sein kann. Dies ist im Gegensatz zu telnet, das allesunverschlusselt ubertragt.

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 6

• File-Transfer (ftp = file transfer protocol)Zum direkten Versenden ”upload“ (put) und Holen ”download“ (get) vonDaten/Dateien/Files vom eigenen Rechner zum entfernten Rechner. DieVerbindung ist synchron. Meist wird dies genutzt unter Verwendung derKennung anonymous, die nur eingeschrankte Berechtigungen hat.

• Einwahlen in andere Rechner (Telnet, remote login)Dabei dient der eigene Rechner als Bildschirm, die Ausfuhrung der Pro-gramme geschieht auf dem entfernten Rechner. Damit kann man z.B. seineelektronische Post auf dem Fachbereichsrechner von den USA her lesen:Zunachst mit telnet in Frankfurt sich anmelden, dann die Post lesen.

• WWW (World Wide Web), (http = hyper text transport protocol)Es gibt eine Organisation als Verbund von Firmen/ Forschungsinstituten,die sich um Normierungen von Werkzeugen und Sprachen im Internetkummert (siehe www. w3c.org).

WWW ist ein virtuelles Netzwerk innerhalb des physikalischen Internets.Dies ist mittlerweile sehr popular geworden. Die Arbeitsweise kann mansich folgendermaßen vorstellen: Jeder Teilnehmer stellt auf seinem Rech-ner (bzw. seinem ihm zugeordneten Knoten) gewisse Daten (i.a. HTML(hyper text markup language)-Dokumente) zur Verfugung, die andere sichvon außerhalb anschauen durfen. Diese Daten sind i.a. als Einheiten struk-turiert, die uber Adressen ( Links) verbunden sind und eine eigene weltweiteindeutige Adresse haben (URL). Der Benutzer (die Surferin) holt sich dieDaten, wobei i.a. ein sogenannter Browser (z.B. Netscape Communicator,Internet Explorer, Mozilla, Safari, . . . ) verwendet wird, der die Daten inForm von Seiten (graphisch gestaltet) anzeigt. Diese Seiten sind i.a. inHTML geschrieben mit evtl. eingebetteten weiteren Aufrufen, bzw. wer-den als HTML von einem Programm erzeugt. Eine Erweiterung, die aktuelldiskutiert wird, ist XML. Um die graphische Gestaltung sehr flexibel zugestalten, wurde Java (von Sun) entwickelt. Java ist eine Programmier-sprache, bei deren Design die Prioritaten entsprechend gesetzt wurden:Portabilitat, Sicherheit, Objektorientiert, in HTML leicht verwendbar. (Wir werden Java noch behandeln. )

Jede Seite (Datenpaket) hat eine eindeutige Adresse und wird unter An-gabe dieser Adresse geladen. Man kann das WWW als großes und offenesHypertextsystem ansehen: Als System von vernetzten Dokumenten.

Das Auffinden von Information bzw. Adressen mit interessanten Inhaltenkann per ”Mund-zu-Mund“ Propaganda geschehen, oder man sammeltsolche Adressen. Suchmaschinen (google, yahoo, ...), die allen zuganglichsind, versuchen Adressen zu filtern und bereit zu stellen, die bestimmteSuchkriterien erfullen.

Man kann sich fragen, woher die Popularitat des WWW kommt. Dazubeigetragen hat:

– Einfache Bedienbarkeit, Robustheit gegenuber Fehlern.

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 7

– Analogie zu bekannten Medien wie Zeitungen, gelbe Seiten,

– Kostenfreie Dienste

Im Internet/WWW gibt es noch viele ungeklarte (juristische, finanzielle,soziale,...) Probleme: kriminelle Aktivitaten (Kinderpornographie), poli-tisch extreme Agitation, Copyright-Probleme, Datenschutzaspekte, nichteinheitliche Gesetzgebung in verschiedenen Landern, Verschlusselung, ...)

Weitere aktuelle Fragen: Wann werden Gebuhren fur welchen Diensterhoben?, Reklame auf WWW-Seiten?, Besteuerung von WWW-Dienstleistungen?; Wer ist verantwortlich fur die Inhalte?

• (ntp: network time protocol) Zeitsynchronisation:Hiermit kann ein Rechner uber Netz einen Zeit-Server befragen, wievielUhr es jetzt ist. Da man Laufzeiten (Netz, Funk, Programm) zu beruck-sichtigen hat, ist es nicht ganz einfach, hieraus mit genugender Genauigkeitdie aktuelle Zeit zu errechnen.

• Telekonferenzen; direkte Ubertragung von Video-, Audio-Daten (Telefon)Dies war ursprunglich ein (fast) synchroner Austausch von Text: eineschriftliche Unterhaltung war moglich. Es gibt auch Software, die Telefo-nieren (Audiodaten) in Realzeit ubertragt, sofern man die Ubertragungs-kapazitat hat (quality of service).

• Bestellen, Bezahlen, finanzielle Transaktionen, KreditkartenbezahlungAuch dies wird z.T. uber Netzdienste abgewickelt.

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 8

1.2 Objektorientierte Programmierung am Bei-spiel von Java

1.2.1 Was hat Java mit dem WWW zu tun?

Java ist explizit dafur entworfen worden, um Anwendungen im WWW zu imple-mentieren. Unterstutzt wird: die Verwendung graphischer Benutzeroberflachen,WWW-Netzzugriffe; Verwendung in einem Browser; beweglicher Code: Applets,Portabilitat.

Wenn man nur statische Dokumente hat, dann kann ein Browser auch nur diestatischen Hypertextdokumente sichtbar machen. Ein solches Dokument kannuber viele Ordner und auch Rechner verteilt sein. Man kann mit diesen Mittelnauch blinkende Felder u.a. einem Betrachter bieten.

Clients

Server

Internet

Eine Entlastung des Servers mittels Verlagerung von Berechnung auf denClient und eine Erhohung der Flexibilitat erhalt man erst, wenn die betrachteteSeite auf dem Rechner des Betrachters (clients) die (fast) vollen Moglichkeiteneiner Programmiersprache hat. Dies wird bei Java-Applets erreicht, indem dievom Server bereitgestellte Seite den Byte-Code eines Applets enthalt, der vomBrowser auf den lokalen Rechner geladen wird, und dort interpretiert wird. Dazumuss der Browser nur den entsprechenden Interpreter bereitstellen. Die Vorteiledieses Verfahrens sind: der Server muss nichts uber die Art (Betriebssystem,Browser, usw.) des Clients wissen; geringe Belastung des Servers und des Netzesdurch die Bytecode-Ubertragung.

Die Sicherheitsprobleme sind nicht zu vernachlassigen, da dies analog zur

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 9

Ausfuhrung eines unbekannten, von irgendwoher geladenen Programms ist. Dieswird abgeblockt durch eingeschrankte Rechte eines Applets (kein Dateizugriffusw.), und durch eine Validierung des Bytecodes vor der Ausfuhrung.

Hier hat Microsoft einen eigenen Sicherheitsansatz entwickelt, der signierteProgramme vorsieht

Mit Java kann man auch eigenstandige Anwendungen programmieren. Ja-va ist auch kompilierbar, allerdings ist die Programmierung von Applets diewesentlichste Verwendung.

Eine andere Variante HTML-Seiten flexibler zu gestalten, ist die Verwendungvon z.B. Javascript. Bei dieser Technik wird ebenfalls nur ein Interpreter auf derClientseite benotigt, der die entsprechenden Programme interpretiert. Allerdingswird hierbei das ganze Programm uber das Internet von Server zum Clienttransportiert.

Dialoganwendung Eine weitergehende Problematik ist die Erweiterung ei-ner Web-Seite zu einer Dialog-Anwendung, die Daten bzw. Anfragen zwischenServer und Client austauscht. Hierzu kann man das sogenannte CGIs verwen-den (common gateway interface). Z.B. war die Praktikumsanmeldung uber dasWWW mittels CGI und eines dahintersteckenden Haskell-Programms realisiert.Die Datenubertragung wird hier meist durch eine spezielle Codierung in derzuruckgesendeten URL durchgefuhrt. Die Programmiersprache, die auf demServer dahintersteckt, ist nicht festgelegt. Von Java wird diese Form der An-wendungen unterstutzt durch die Programmiermoglichkeit von Servlets.

1.2.2 Versionen und Kompatibilitat mit Browsern

In der Entwicklung von Java sind bisher die Hauptversionen Java 1.0 (1995),Java 1.1 (1997), Java 2 (1999) und J2SE 5 (2004) erschienen. Dazu wurden vonSun Microsystems auch die entsprechenden Entwicklungsumgebungen veroffent-licht.

• Bis einschließlich Version 1.1 trug die Entwicklungsumgebung den NamenJDK (“Java Development Kit”)

• Von JDK-Version 1.2 bis 1.4 fand ein Namenswechsel statt, die Versionenheißen Java 2 und die entsprechenden Entwicklungsumgebungen Java SDK(“Software Development Kit”).

• Die aktuelle Version ist im Grunde JDK 1.5, wobei die Namensgebungjedoch erneut geandert wurde: Die Entwicklungsumgebung heißt wiederJDK, wobei “J” fur “Java 2 Platform Standard Edition” (J2SE) steht unddie Version als JDK 5 (anstelle von 1.5) bezeichnet wird1.

Ab JDK 1.02 ist das Ereignismodell 1.02 integriert, wobei in diesem Mo-dell samtliche Ereignisse, die wahrend des Programmablaufs stattfinden, durch

1Sun schreibt in http://java.sun.com/j2se/1.5.0/docs/relnotes/version-5.0.html, dass dieVersionsnummer 5 die Produktversion sei, 1.5 die Entwicklerversion.

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 10

das Programm fließen und von einer Methode namens handleEvent() behandeltwerden.

Mit JDK 1.1 wurde das Ereignismodell grundlegend geandert. Das Ereig-nismodell 1.1 verwendet das Konzept der Event-Listener. Die verschiedenenListener sind verantwortlich fur die Behandlung einer bestimmten Art von Er-eignissen (z.B. Mouse-Listener fur Mausereignisse, Key-Listener fur Tastatur-ereignisse, etc.). Durch das Programm werden nur jene Ereignisse geleitet, furdie vorher im Quelltext Listener vorgesehen wurden. So lasst sich der Verarbei-tungsvorgang effizienter gestalten, da nicht mehr alle Ereignisse gepruft werden,die stattfinden.

Mit Version 1.2 (bzw. Java 2) wurden die JFC2-Bibliotheken ins SDK in-tegriert, die insbesondere das Swing-Paket enthalten, das die Moglichkeitender Programmierung von graphischen Benutzeroberflachen erweitert. Außer-dem wurde die Arbeitsumgebung mit Java 2 durch sogenannte Just-in-Time-Compiler verbessert, die die Ubersetzung von Java-Programmen erheblich be-schleunigen.

Die Neuerungen in Version 1.5 werden spater ausfuhrlich behandelt.Wahrend bis JDK 1.1. die meisten WWW-Browser Java-Anwendungen stan-

dardmaßig durch eine integrierte VM unterstutzten, ist dies seit Java 2 nichtmehr der Fall. Heutige moderne Webbrowser (MS IE, Netscape, Mozilla, Fire-fox, Safari) konnen Java-Applets erst ausfuhren, nachdem ein Plug-In und einevirtuelle Maschine (z.B. JRE3 von SUN) installiert wurden.

1.2.3 Objektorientierte Programmierungam Beispiel Java

Im folgenden werden die Beispiele konform zur Syntax der objektorientiertenProgrammiersprache Java (von Sun) notiert, die selbst eine an C++ angelehnteSyntax hat. Allerdings erfahrt Java wie jede Programmiersprache Anderungenund Erweiterungen, so dass man fur genauere Informationen das entsprechendeHandbuch konsultieren sollte. Wir verwenden Java 1.4 und Java 2 fur diesemersten Teil des Skriptes und die Beispiele und gehen auf Java 5 in einem extraKapitel ein.

Die zentrale Idee der Objektorientierten Programmiersprachen (OOP) istdie des Objekts als Strukturierungskonzept.

Objekte sind zusammengesetzte (Daten-)Einheiten, die auch als Einheit an-sprechbar sind. Ein Objekt belegt Speicherplatz und hat eine Identitat. DieObjekte kommunizieren miteinander durch Senden/Empfangen von Nachrich-ten. Objekte sind gekapselt. Veranderungen von Objekten werden stets mittelsder definierten Methoden durchgefuhrt.

Jedes Objekte gehort zu einer Klasse – ist Instanz einer Klasse. Klassen wer-den in der OO-Programmiersprache definiert. Klassen enthalten die Definition

2JavaFoundationClasses3J2SE Runtime Environment

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 11

der Struktur der zugehorigen Objekte und auch die Definition der Methoden,die auf Objekte dieser Klasse anwendbar sind.

Klassen (Typschablonen) konnen definiert werden. Sie entsprechen einerMenge von Objekten mit gleichem Verhalten. Eine Realisierung eines abstrak-ten Datentyps entspricht einer Klasse. Gleichzeitig wird der Klassenname alsTyp zur Compilezeit verwendet. Klassen in Java kann man in einer (Baum-)Hierarchie anordnen; in anderen Programmiersprachen kann es auch ein gerich-teter Graph sein. Die Klassenhierarchie wird verwendet, um allgemeine Aspektevon Objekten in einer Oberklasse zu definieren und zu implementieren, und dannin Unterklassen die spezielleren Eigenschaften zu implementieren.

Wenn wir mit Haskell vergleichen: Eine Klasse entspricht in etwa einem Typbzw. einer Typklasse, ein Objekt entspricht einem konstruierten Datenobjekt.Das Senden von Nachrichten entspricht einem Funktionsaufruf. Allerdings gibtes in OO-Sprachen, auch in Java, Seiteneffekte, (im Gegensatz zu Haskell),z.B. kann ein Objekt verandert werden, auch wenn verschiedene Verweise daraufexistieren (sogenanntes Aliasing).

In Java sind elementare Datentypen wie Zahlen keine Objekte, allerdings gibtes OOP, in denen auch elementare Datentypen als Objekte behandelt werden.In Java kann man die elementaren Datentypen durch Einpacken ebenfalls zuObjekten machen, falls dies notwendig ist.

1.2.4 Objekte und Methoden

Ein Objekt besteht aus Daten (bzw. Attributen). Von außen ist das Innere (dieDaten) eines Objektes nicht direkt sichtbar. Nur uber erlaubte Methodenauf-rufe ist das Innere des Objektes (seine Attribute) sichtbar und anderbar. JedesObjekt gehort zu einer Klasse: man sagt auch: ist (direkte) Instanz einer Klasse.

Betrachtet man nur die Daten, ist ein Objekt analog zu einem Record, beidem die einzelnen Attribute mit Attributnamen ansprechbar sind. Eine analogeStruktur ist ein Satz (Verbund) in einer Datenbank, bestehend aus Attributen.In Haskell ware es ein n-Tupel, bestehend aus verschiedenen Daten, wobei auchdurch geeignete Definition eines Typs die Komponenten wie Attribute angespro-chen werden konnen.

1.2.4.1 Methoden

Methoden sind auf Objekten ausfuhrbare Operationen, analog zu Prozeduren.Ein Aufruf einer Methode wird oft als Schicken einer Nachricht gedeutet, wenndie Methode an ein Objekt gekoppelt ist, bzw. auf ein Objekt angewendet wird.Hierbei entsprechen die Nachrichten den Argumenten der Prozedur.

Es gibt unterschiedliche spezifische Aufgaben von Methoden:Konstruktion: Erzeugen und Initialisieren eines ObjektsDestruktion: Abschlussarbeiten und Loschen eines ObjektsSelektion Lesen von internen Daten des ObjektsModifikation Andern der internen Daten des ObjektsAndere Verarbeitung allgemeine Prozedur

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 12

Beispiel 1.2.1 Ein Auto kann man als Klasse Auto modellieren mit den mogli-che Attributen: Marke, Farbe, Kennzeichen, Besitzer, Baujahr, Leistung in kW,Hochstgeschwindigkeit, Treibstoffverbrauch, km-Stand.Methoden:

• Erzeuge neues Objekt vom Typ Auto mit den folgenden Attributwerten:. . .

• Andere den Besitzer

• Andere das Kennzeichen

• Ermittle das Alter des Autos

• . . .

1.2.5 Nachrichten; Methodenaufruf

Die Anwendung von Methoden auf Objekte wird durch den Mechanismus desSendens von Nachrichten durchgefuhrt.Verwendet wird i.a. die sogenannte Dot-Notation.Syntaktisch: obj.meth(para1, para2,...).

Hier wird dem Objekt obj die Nachricht meth gesendet, mit den Parameternpara1, para2,...).

Dies ist analog zur Anwendung einer Funktion f meth auf ein Argument,wobei das erste Argument der Funktion stets das Objekt ist, dem die Nach-richt gesendet wird, und die weiteren Argumente den Parametern para1,para2,...) entsprechen.D.h. als Funktionsanwendung sieht obiger Beispielaufruf so aus:f meth(obj,para1,para2,...).Das Abfragen von Attributen wird ebenfalls durch Senden einer Nachrichtdurchgefuhrt, wobei der Attributname verwendet wird; der Wert des Attributeswird als Wert der Anwendung zuruckgegeben. D.h. eine Methode kann einenSeiteneffekt bewirken, und auch einen Wert (per return) zuruckgegeben. DerSeiteneffekt kann darin bestehen, in dem angesprochenen Objekt, oder eventuellin anderen Objekten die Werte von Attributen zu verandern.

1.2.5.1 Art der Verarbeitung: Call by reference und value

Objekte werden per Referenz und Wert angesprochen. D.h. Argumente sindWerte oder Referenzen. Bei einfachen Datentypen werden diese als Wert wei-tergereicht, Objekte als Argumente in Methoden werden als Referenz weiterge-reicht. Zwei Objekte mit gleichem Inhalt konnen an verschiedenen Stellen imSpeicher sich befinden, haben eine unterschiedliche Identitat, konnen als un-abhangig voneinander geandert werden. Nach der Anderung bleibt die Referenzdie gleiche.

Das hat starke Auswirkungen auf die Prufung der Gleichheit von Da-tenstrukturen / Objekten: Normalerweise wird die Referenz genommen, d.h.

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 13

verschiedene Objekte mit gleichem Inahlt sind verschieden, einen Vergleich bzgldes Inhalts muss man selbst als Vergleichsmethode definieren.

Entsprechend gibt es dann auch die Aliasproblematik: unterschiedliche Va-riaben konnen auf das gleiche Objekt verweisen.

Beispiel 1.2.2 Gegeben sei ein Rechteck durch die Koordinaten eines Eckpunk-tes und der Hohe und Breite. Wir nehmen an, dass es auf dem Bildschirm dar-gestellt wird, und die Koordinatenangaben in Pixeln erfolgt. Das Bewegen aufdem Bildschirm konnte man durchfuhren mittels folgender Sequenz von Anwei-sungen, die in einer Methode als Programmcode stehen konnte:

if (obj.left < 20){ obj.erase(); // Loeschen des Bildesobj.move(20,0); // Verschieben des Rechtecks (der Koordinaten)obj.paint(); // Zeichnen

}

Die Nachrichten sind jeweils left, erase(), move(20,0), paint().

1.2.6 Klassen

Klassen fassen gleichartige Objekte zusammen, wobei die Gleichartigkeit sichauch daraus ergibt, ob diese von der Implementierung gleich behandelt werdensollen. Klassen verhalten sich zu Objekten wie der Begriff (die Klasse) ”Auto“zu einem konkreten Auto mit dem KZ ”B-SE-1“. Das konkrete Auto ist danneine ”Instanz“ (Auspragung, Element) der Klasse.

In OOP besteht das Programmieren aus dem Definieren von Klassen, d.h.Attribute, Methoden, Hierarchie. Die Methodenprogrammierung entspricht der

”normalen“ Programmierung.Klassen konnen hierarchisch angeordnet werden. D.h. es gibt Oberklassen

und Unterklassen. Die hierarchische Anordnung soll dazu dienen, in der Ober-klasse die gemeinsamen Methoden und Attribute zu definieren, die fur alle Un-terklassen gelten. (Statt Unterklassen sagt man auch abgeleitete Klasse).

Beispiel 1.2.3 Die Klasse Fahrzeug kann man als Oberklasse von Auto de-finieren mit den Attributen Hoechstgeschwindigkeit, Besitzer. Als weitereUnterklassen von Fahrzeug kann man LKW, Boot, Bus, Motorrad definieren.Bei LKW kamen als Attribute hinzu: zul. Gesamtgewicht, Art der Guter, . . . .

Bei einem Bus: maximale Anzahl Passagiere, Ausstattung, ...

Fahrzeug99

rrrrrrrrrr OO ee

LLLLLLLLLL ii

TTTTTTTTTTTTTTTTT

Auto LKW Boot . . .

Als UML-Diagramm sieht die Struktur so aus:

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 14

Fahrzeug

Hoechstgeschwindigkeit:double

Auto Boot

Tiefgang:double

LKW

Gesamtgewicht:doubleAutokennzeichen:String

class Fahrzeug {

public double Hoechstgeschwindigkeit;private String Eigentuemer;

private static long Anzahl;

.......}class Auto extends Fahrzeug {

public String Autokennzeichen;......

}class Boot extends Fahrzeug {

public double Tiefgang;........

}

Beispiel 1.2.4 Rechteck mit oberer Eck-Koordinate, Breite und Hohe: Untender Programmcode, der in einem Applet zum Zeichnen verwendet wird:

class Rechteck {int x,y,b,h; // x,y Koordinaten, b,h, Breite und Hoehevoid paint (Graphics g) { //Methode zum Zeichnen

g.drawRect (x, y, b, h); // Aufruf einer Bibliotheksfunktion drawRect}

}

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 15

1.2.7 Methoden

In einer Klasse werden sowohl die Attribute als auch die darauf moglichen Ope-rationen definiert. Diese Operationen nennt man Methoden. Deren Definition istinnerhalb einer Klassendefinition.

Beispiel 1.2.5

class Rechteck {int x,y,b,h; //x,y Koordinaten, b,h, Breite und Hoehevoid paint (Graphics g) { // Methode zum Zeichnen

g.drawRect (x, y, b, h); // Aufruf einer Bibliotheksfunktion drawRect}void move (int xd; int yd) {

this.x = x + xd;this.y = y + yd;

}}

Die Methode move verandert die Eck-Koordinate des Rechtecks um die Dif-ferenz xd,yd.

Wenn einem Rechteck r die Nachricht move gesendet wird in der Formr.move(20,0), dann wird die Anfangskoordinate des Rechtecks entsprechendder Argumente verandert.

Die Verwendung von this bezieht sich immer auf das Objekt, an das dieNachricht gesendet wird. In anderen OOP-Sprachen wird dies z.T. auch alsself bezeichnet.

Sucht man die Analogie in Haskell, so wurde man r.move(20,0) etwa alsmove r 20 0 schreiben. Das Schlusselwort this entspricht dann der Variablenx in einer Definition von move x y z = ....

Beachte, dass die Argumente der Nachrichten nicht nur elementare Daten-typen sind, sondern auch Objekte sein konnen.

Typen bzw. Klassenangaben mussen in Java fur alle Methoden, deren Ar-gumente und deren Ergebnis gemacht werden. void steht fur den Ergebnistypeiner Methode, die Seiteneffekte, aber keinen Ruckgabewert hat.

void move (int xd; int yd)

bedeutet, dass move keinen Ergebnistyp hat, nur einen Seiteneffekt bewirkt, unddass die Argumenttypen int sein mussen.

1.2.8 Klassen und Vererbung

Klassen werden, wenn moglich und von der Implementierung her sinnvoll, hierar-chisch strukturiert: Vererbungshierarchie. D.h. man versucht diese so zu struk-turieren, dass man zunachst eine moglichst allgemeine Klasse definiert, z.B.geometrischesObjekt:

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 16

abstract class geometrischesObjekt {String Name;geometrischesObjekt (String Name) {this.Name = Name;}void paint (Graphics g);

}

Die Klasse Rechteck, Gerade, Kreis, Dreieck, usw kann man dann als Un-terklassen definieren, die mehr Methoden und mehr Eigenschaften haben, alsospezieller sind:

class Rechteck extends geometrischesObjekt {int x,y,b,h; // x,y Koordinaten, b,h, Breite und Hoehevoid paint (Graphics g) {

g.drawRect (x, y, b, h);}void move (int xd; int yd) {

this.x = x + xd;this.y = y + yd;

}}

// Beispielaufruf: re.move(2,-3)

Eine weitere Unterklasse von Rechteck konnte ein farbiges Rechteck oder einmit einem Muster gefulltes Rechteck sein.

class farbigesRechteck extends Rechteck {Color farbe;....

}

Hierbei erben die Unterklassen die Attribute und Methoden der Oberklas-se; man sagt auch die Attribute werden von der Oberklasse abgeleitet. Es istmoglich, neue hinzuzufugen. Die Unterklasse hat dann die Vereinigung der At-tribute und Methoden der Oberklasse und der in der Klasse definierten entspre-chenden Komponenten.

Es ist auch moglich und manchmal notwendig, die Methoden der Oberklassein der Unterklasse zu uberschreiben. Allerdings nur fur die Nutzung in dieserUnterklasse (und deren Unterklassen). Dies ist notwendig, da fur spezialisiertereKlassen die Methoden ebenfalls weiter spezialisiert werden mussen.

Z.B. Die Methode paint wird bei einem Rechteck nur die Linien des Recht-ecks zeichnen, bei einem farbigen Rechteck die Linien und zusatzlich die Farbe.Es ist nicht moglich, Attribute oder Methoden zu entfernen.

Zur Laufzeit kann man mit dem Operator instanceof feststellen, ob einObjekt zu einer Klasse gehort: re instanceof Rechteck;.

Oft definiert man eine Oberklasse als abstrakte Klasse mit dem Zugriffs-recht abstract, wobei man nur eine Zusammenfassung meint. Es ist dann nicht

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 17

moglich, Objekte zu erzeugen, die genau zu dieser Klasse gehoren. Dies geht nurfur ”konkrete“ Unterklassen.

1.2.9 Wesentliche Eigenschaften der objektorientiertenProgrammierung

Das Programm besteht aus einer Menge von Klassendefinitionen, die aus Er-klarungen von Attributen und Definitionen von Methoden (und Schnittstellen-beschreibungen ) bestehen. Die Verwendung von Methoden geschieht wie eineFunktionsanwendung in Attributnotation. D.h. Klassen und Methoden sind daseigentliche Programm.

Objekte gibt es nur zur Ausfuhrungszeit des Programms. Diese werden in-nerhalb eines Methodenaufrufs zur Laufzeit (mittels new) erzeugt. Das Sendenund Empfangen von Nachrichten ist ebenfalls eine Aktion zur Laufzeit.

Vererbung Klassen erben von Superklassen Methoden und Attribute. Dies giltdamit auch fur die Objekte: auf diese kann man alle Methoden einer Su-perklasse anwenden. Man kann den Methoden in Unterklassen eine andere(spezifischere) Implementierung geben.

Polymorphie Variablen mussen getypt sein (der Typ ist die Klasse), d.h. Va-riablen konnen nur Objekte einer Klasse referenzieren. Allerdings sinddann auch Objekte erlaubt, die zu Unterklassen gehoren. Welchen exak-ten Typ das Objekt hat, kann man oft erst zur Laufzeit ermitteln. Hatman z.B. eine Variable Fahrzeug fahrzeug, und Fahrzeug hat die Unter-klassen Auto, Bus, Schiff, dann kann man das Attribut Eigentuemerermitteln mittels: fahrzeug.Eigentuemer, bzw mit einer eigenen Metho-de getEigentuemer() und dem Aufruf fahrzeug.getEigentuemer(), Esware auch moglich, dass die Methode in der Unterklassendefinition uber-schrieben wird. In diesem Fall wird die spezifischere Methode verwendet.Damit kann man Programmteile allgemein formulieren. Falls Unterklas-sen zum Programm noch hinzugefugt werden, ist es nicht notwendig, diebereits verwendeten Methodenaufrufe zu andern.

Dynamische Bindung (late binding) Ist im Zusammenhang mit Overloa-ding, d.h. im gleichen Namensraum gibt es fur den gleichen Methodenna-men verschiedene Implementierungen. Das ist die oben beschriebene Artdes Methodenaufrufs, der jeweils die spezifischste Methode fur ein Ob-jekt nimmt. Die Entscheidung, welche Implementierung zu verwenden ist,untersucht die Anzahl der Argumente und die Typen bzw. Klassen der Ob-jekte, die als Argumente verwendet werden. Die Unterscheidung nach derAnzahl der Argumente kann der Kompiler vornehmen (statisches Binden),wahrend man nicht immer wahrend der Kompilierung herausfinden kann,welche Klasse das Objekt hat (bzw. haben wird): ”Dynamisches Binden“.Man nennt diese Art der Auswahl der korrekten Implementierung einerMethode nach dem Typ der Argumente auch single dispatching bzw. multi-ple dispatching, wenn es mehrere Argumente sind. Sind Typumwandlungen

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 18

moglich (double → int, so kann es zu nicht gewollten Methodenaufrufenkommen (vermutlich abhangig von der Java-Version).

Das Uberladen nach dem Typ des Ergebnisses ist nicht moglich.

Statische Bindung (early binding) Im Gegensatz dazu ist die statischeBindung, die (vom Compiler) verwendet werden kann, wenn der Metho-denaufruf zur Compilierzeit eindeutig ermittelbar ist, (genauer: die Im-plementierung der Methode); Wie oben erwahnt nach der Anzahl der Ar-gumente, aber auch wenn aufgrund der Typen der Parameter nur eineMethode moglich ist.

Das gibt es in Java 1.5 bzw. Java 2 nicht:

Mehrfachvererbung (von Attributen), D.h. eine Klasse kann nicht Unter-klasse von zwei anderen unabhangigen Klassen sein. Dies vereinfacht dieKompilierung und macht die Vererbung eindeutiger. Allerdings sind Hier-archien in Anwendungsbereichen nicht immer baumformig, so dass dieseBeschrankung manchmal zu streng ist. Das Verbot der multiplen Ver-erbung kann Kopieren von Klassen und Methoden, oder eine etwas un-naturliche Klassenhierarchie erzwingen. In Java kann man zwar keine At-tribute, dafur aber Methodennamen uber Mehrfachvererbung weitergebendurch Verwendung von Interfaces (Schnittstellen).

Pointer und Adressrechnung .

generischen Klassen Dies sind Klassen, die selbst Typ-Parameter habenkonnen. Damit kann man z.B. Listen von Zahlen als Klasse definieren.Diese Konstruktion ware nur dann sinnvoll, wenn ein Typcheckalgorith-mus in der OOP analog zum Milner- Typcheck verwendet wurde. In Javakann man Listen von Objekten definieren, d.h. das sind eher heterogeneListen, wobei die Objekte in der Liste zu einer Unterklassen einer gemein-samen Oberklasse gehoren mussen.

Generische Klassen gibt es in Java 5 (siehe extra Kapitel).

1.2.10 Wiederverwendbarkeit; Reusability

Wiederverwendung von Programmcode in verschiedener Form ist nutzlich undsinnvoll, da dadurch bereits implementierte und getestete Funktionalitaten um-sonst verwendet werden konnen. Dies erfordert bei der ersten Strukturierungaber einen Mehraufwand, da man die Verwendung durch andere Projekte /Programmierer mitbedenken muss. Ebenso wird man dadurch angeregt, eineAbstraktion und Strukturierung vorzunehmen, die in jedem Fall zu einem bes-seren Verstandnis des Problems und der Implementierung fuhrt.

Wiederverwendung kann direkt im eigenen Programm/Projekt sein, oderuber eine Bibliothek geschehen. Generell sind einfachere Strukturen, Datenty-pen, leichter wiederverwendbar als komplziertere. Leider sind ahnliche Daten-strukturen / Verarbeitungen/ Methoden/ Programmm dann doch aus verschie-

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 19

denen Grunden nicht wiederverwendbar. In Java 5 wird die Wiederverwendbar-keit erleichtert durch parametrisierte Klassen.

1.2.11 Programmierhinweise

Die Erstellung eines Programms in einer OOP erfordert zunachst, die An-wendung gedanklich so zu strukturieren, dass man die Klassenstruktur fest-legen kann. Diese Klassenstruktur sollte naturlich den Bereich der Anwendungmoglichst gut modellieren, da man nur dann erwarten kann, dass das Programmsich robust bei Veranderungen verhalt. D.h. auch bei Erweiterungen sollte dieKlassenstruktur nur wenig geandert werden mussen.

Die Methoden und Attribute, die man in einem Programm benotigt, ergebensich dann aus der benotigten Funktionalitat.

Die Superklassen haben weniger Attribute und Methoden, die in der Hier-archie weiter unten stehenden Klassen haben mehr Attribute und Methoden.

1.2.11.1 UML: Unified Modelling Language

Die Analyse und Vorstrukturierung kann man zum Teil mit graphischen Werk-zeugen vornehmen, die die Klassenstruktur, die Attribute, Methoden-Typenusw. graphisch darstellen, verwalten und verandern konnen. UML stellt zurModellierung verschiedene Formen von Diagrammen bereit. Wir betrachten nurTeile der Moglichkeiten. Diese Werkzeuge erzeugen i.a. automatisch einen Pro-grammrahmen, in den dann der spezifische Code noch eingetragen werden kann.

Beispiele fur Elemente der Diagramme und beispielhafte Diagrammstruktu-ren:

• Klasse:KlassennameAttributeMethoden

• Objekt:Objekt: KlasseAttribute = Wert

• Schnittstelle�interface�KlasseMethode()

Herbei kann man zB in der Klasse noch mit weiteren Markierungen kenn-zeichnen, ob die Attribute/ Methoden public oder private sind, auch die Kon-struktormethode kann man angeben.

Klassenname+ Attribut1: Klasse33− Attribut1

�constructor� Konstruktor123+ Methode1 (arg1:Double)− Methode2 ()

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 20

Die mit + gekennzeichneten sind public, die mit − gekennzeichneten sindprivate.

Beispiele fur Diagrammstrukturen:

• Vererbung:

Oberklasse

Unterklasse

• Beziehung

Klasse 2Klasse 1

• Enthaltensein

GanzesTeil

• Realisierung

Klasse Schnittstelle

1.2.12 Eigenschaften von Java

Automatische Speicherverwaltung Fur neu zu erzeugende Objekte wirdautomatisch Speicher bereitgestellt. Objekte, auf die es keine Referenzmehr gibt, werden automatisch (irgendwann) freigegeben (garbage collec-tion). Dies im Gegensatz zu z.B. C, C++, aber genauso wie in Haskellund Python.

Typsicherheit Der Kompiler uberpruft die Klassenangaben der Variablen aufKonsistenz mit den Methoden-Aufrufen und den cast-Aufrufen zur Typ-konversion.

API: Application Programming Interface Das ist die Menge an bereitsvordefinierten Klassen, die Java im Compiler und in der Laufzeitumgebungbereitstellt (java.lang, java.util, java.awt. java.applet,.... Ja-va (SDK bzw. alt: JDK) hat eine Vielzahl von (von Sun) mitgeliefertenBibliotheken, die die Programmierung erleichtern, aber auch fur einige

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 21

Funktionalitaten notwendig sind. Applets kann man z.B. nur program-mieren, wenn die entsprechenden Bibliotheken per import dazugeladenwerden.

Portabilitat Es wird Wert darauf gelegt, dass die Ausfuhrung der Programmeauf allen Rechner und Rechnertypen gleichartig ablauft. Die nichtporta-blen Teile sind auf den jeweiligen Rechner installiert. In der Programmier-sprache selbst erfordert das, dass es keine rechnerspezifischen Konstruktein der Programmiersprache gibt: z.B. Adressrechnungen, oder Systemzu-griffe, die Betriebssystem-abhangig sind, o. a. Dies erfordert auch die An-gabe eine operationalen Semantik, die unabhangig vom benutzten Rechnerist und die es ermoglicht, die Ergebnisse eines Programms eindeutig vor-herzusagen.

Die Verwendung der verschiedenen Windowsysteme und den Aktionenkann zu unterschiedlichem Verhalten/Aussehen fuhren.

Bytecode Der Kompiler erzeugt kein lauffahiges Programm, sondern einen in-terpretierbaren String: den ”Bytecode“. Dieser wird dann von einem ent-sprechenden Interpreter ausgefuhrt. Dieser Bytecode ist portabel, d.h. aufallen Maschinen ablauffahig, vorausgesetzt, der entsprechende Interpreter(JVM, Java Virtual Machine) ist dort installiert. Der Interpreter ist i.a.nicht portabel. Zwar entsteht durch das Interpretieren ein Geschwindig-keitsnachteil gegenuber anderen Methoden, dies ist jedoch kein Nachteilfur die Anwendungen, fur die Java entwickelt wurde, namlich solche mithohem Anteil an Netzwerk-Kommunikation und graphischer Benutzerin-teraktion.

WWW Java ist u.a. konzipiert zur Programmierung von graphischen, inter-aktiven Programmstucken (sogenannten Applets), die von einem Web-Browser auf der Client-Seite geladen und ausgefuhrt werden konnen (derBytecode des Applets). Man kann allerdings auch normale Programme(applications) damit schreiben, die dann von einem Interpreter ausgefuhrtwerden konnen.

C++ - Ahnlichkeit Die Syntax von Java ist der von C++ sehr ahnlich, auchwenn bei der Entwicklung von Java darauf geachtet wurde, solche Eigen-schaften zu vermeiden, die immer wieder Probleme verursacht haben. Sogibt es keine Operationen zum expliziten Referenzieren oder Dereferen-zieren von Objekten oder Daten: primitive Daten werden immer derefe-renziert verwendet und Objekte und Felder immer referenziert. D.h., diesogenannte Adressrechnung ist in Java verboten

Sicherheit Das Fehlen von Referenzen und Zeigern, die vom Programm belie-big manipuliert werden konnen, sowie die Einschrankung der Zugriffsrech-te fur Applets, die uber das Netzwerk kommen, tragen zur Sicherheit vonJava bei. Ein weiterer Filter ist der Bytecode-Verifier, der den bermitteltenBytecode auf unerlaubte Aktionen hin uberpruft.

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 22

Browser; Versionen Da Applets vom Server zum Client gesendet werden undauf dessen Rechner bzw. in dessen Browser ablauffahig sein sollen, kann esdazu kommen, dass Applets ”zu modern“ sind, und auf der alteren Brow-serversion nicht richtig lauffahig sind. In diesem Falle kommt es i.a. nichtzu Fehlern, sondern es passiert einfach nichts, d.h. man sieht kein App-let. Hier gibt es teilweise unterschiedliches Verhalten in den verschiedenenBrowsern wie Microsofts Internet Explorer, Netscape Communicator, usw.

1.2.12.1 Typische Phasen der Java-Entwicklung und Ausfuhrung

• Editieren: des Programms, der Klassendefinitionen, ergibt Files mit der Extension .java.• Kompilieren: des Programms und der Klassendefinitionen.

Erzeugt Bytecode: ergibt Files mit der Extension .class.• Laden: Ladt die notwendigen Bytecode-Files mit der Endung .class• Bytecode-Verifier: uberpruft den Bytecode daraufhin, ob er den geforderten Sicherheitsanforderungen entspricht.• Ausfuhren: die JVM (Java Virtual Machine) fuhrt den Bytecode aus

1.3 Programmierung in Java

1.3.0.2 Primitive Datentypen

Die primitiven Datentypen von Java sind:boolean entweder true oder falsebyte Zahlen von −128 bis 127 (8 Bit)char 16-Bit (2 Byte) Unicode-Zeichenshort Zahlen von −32768 bis 32767 (16 Bit)int Zahlen von −231 bis 231 − 1 (32 Bit)long Zahlen von −263 bis 263 − 1 (64 Bit)float Fließkommazahlendouble Fließkommazahlen mit doppelter Genauigkeit

Die Strings sind nicht primitiv, sondern eine vordefinierte Klasse.Es gibt verschiedene Methoden fur Strings:

+ zum Zusammenhangen (append), length(), charAt(int),substring(anfangsindex, endindex), equals(String other). Die equals-Methode sollte man zum Testen der Gleichheit von Strings verwenden, da sonstObjektidentitat gepruft wird.

Umlaute und ihre Unicode-Darstellung:a \u00E4o \u00F6u \u00FCß \u00DFA \u00C4O \u00D6U \u00DC

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 23

1.3.1 Operatoren

∗, /, +,− arithmetische Infix Ops (z.T. auch fur andere Typen)% modulo-Rechnung 7%3 ergibt 1++ addiere 1 , i++ (erst verwende i; addiere 1)

++i (addiere 1; verwende i )-- subtrahiere 1 i-- (verwende i; subtrahiere 1)

--i (subtrahiere 1; verwende i )<,<=, >, >=,==, ! = arithmetische Infix Vergleiche! Negation&, | striktes und, oder fur Boolesch

(werden auch fur bitweise Operation verwendet)&&, || lazy und, oder^ exklusives oder+= x += y entspricht x = x + yop= (Allgemein:)

Abkurzung: x op= a entspricht x = x op a

Es gibt noch weitere Operationen, die analog zu Registeroperationen sind:bitweises und, oder, Negation, Shift, ...

1.3.2 Ausdrucke

Ausdrucke sind, analog zu Haskell, Programmstucke, die bei Ausfuhrung einenWert haben. Diese konnen syntaktisch dort stehen, wo man auch einen entspre-chenden Wert hinschreiben kann.

Beispielsweise arithmetische Ausdrucke oder Boolesche Ausdrucke. Es istaber auch moglich, Funktionen (bzw. Methoden) zu verwenden. Diese Metho-den mussen dann mit einem entsprechenden Ruckgabetyp definiert werden undmittels return den Wert zuruckgeben.

Der Auswahloperator: a ? b : c kann verwendet werden, um Fallunter-scheidungen bei der Ruckgabe von Werten leicht zu machen. Dies wirkt analogzum if. Der Auswahloperator erzeugt einen Ausdruck, keine Anweisungsfolge.Der Unterschied wirkt sich so aus, dass b,c in a ? b : c keine Anweisungensein durfen, sondern Ausdrucke sein mussen. (In Haskell gibt es diesen Unter-schied nicht).

1.3.3 Anweisungen

1.3.3.1 if

Syntax:

if (〈 Ausdruck 〉) 〈 Anweisung 〉 else 〈 Anweisung 〉

Hinter if muss ein Boolescher Ausdruck stehen. Mehrere Anweisungen, mit{ und } geklammert, zahlen als eine Anweisung. Das else kann weggelassenwerden.

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 24

Beispiel 1.3.1 fur Boolesche Ausdrucke:

(a == b), (a != b), (a > b).

Man kann auch zusammengesetzte Boolesche Ausdrucke verwenden:

(a > 0 && a <= 10)(3*a +5 < 20 || b == c)

1.3.3.2 switch

Syntax:switch (〈 Ausdruck 〉) { case 〈 Konstante 〉: 〈 Anweisungen 〉 break ;

. . .case 〈 Konstante 〉: 〈 Anweisungen 〉 break ;default: 〈 Anweisungen 〉}

Analog zu C: Der Ausdruck muss eine ganze Zahl sein, die Konstantenmussen zur Kompilierzeit bekannt sein. Die break’s sollten jeden Fall abschlie-ßen, konnen aber weggelassen werden.

1.3.3.3 while

Syntax:while (〈 Ausdruck 〉) 〈 Anweisung 〉Der Rumpf der Schleife wird ausgefuhrt, solange der Ausdruck den Wert

true hat. Man kann mit der continue Anweisung ans Ende des Rumpfes sprin-gen.

1.3.3.4 do-while

Syntax:do 〈 Anweisung 〉 while (〈 Ausdruck 〉)Der Rumpf der Schleife wird ausgefuhrt, bis der Ausdruck den Wert false

hat. Der Rumpf wird auf jeden Fall einmal ausgefuhrt.

1.3.3.5 for

Syntax:for (〈 Init 〉; 〈 Bedingung 〉; 〈 Ausdruck 〉) 〈 Anweisung 〉Der Rumpf der for-Schleife wird ausgefuhrt, solange der Ausdruck den Wert

true hat. Man kann mit der continue Anweisung ans Ende des Rumpfes sprin-gen.

Beispiel 1.3.2 for (int i = 0; i <= 10; i++) <Anweisung>;Diese Schleife wird fur i = 0, . . . 10 durchlaufen. Alternativ zum Ausdruck

i++ kann man auch i = i+1 oder i += 1 schreiben.

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 25

1.3.3.6 Markierungen

Anweisungen kann man mit einer Marke (Label) versehen:

marke1: while (i < 0) i--;

Diese Markierung kann benutzt werden, wenn man geschachtelte Schleifenhat, und diese entweder mit break Marke1 beenden will, oder mit continueMarke1 ans Ende springen will.

1.3.3.7 Konstruktoren

Die Konstruktion eines neuen Objektes mittels new erfordert bei der Klassen-definition eine spezielle Methode, den sogenannten Konstruktor, der den glei-chen Namen wie die Klasse hat. Es kann verschiedene Konstruktoren geben,die Auswahl erfolgt analog zum Binden bei Methoden: abhangig von der An-zahl der Argumente und vom Typ der Argumente. Wenn Attribute sowohl inder Oberklasse als auch zusatzliche in der Unterklasse definiert sind, dann istim Konstruktor der Zugriff auf den Konstruktor der Oberklasse mit super.moglich.

1.3.3.8 Felder

Felder (arrays) sind Folgen von Objekten gleichen Typs, die mit Index angespro-chen werden konnen. Diese konnen mehrdimensional (d.h. mit mehreren Indizes)definiert und benutzt werden. Wir betrachten zunachst eindimensionale Felder.

Beispiel 1.3.3

int [] a; // integer feld a ist erkl\"arta = new int [10] ; // integer feld a ist jetzt ansprechbar

// und hat 10 Eintraege: von 0 bis 9for (int i = 0; i < a.length; i++) a [i] = i

Man sieht, dass Felder vor Benutzung erst angelegt werden mussen und dassauf Felder die Methode length anwendbar ist, die die Lange zuruckliefert.

Ein einfaches Beispiel fur ein zweidimensionales Feld und dessen direkteInitialisierung ist:

String[][] matrix = {{"AA","AB","AC","AD"},{"BA","BB","BC","BD"},{"CA","CB","CC","CD"}

};

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 26

1.3.4 Kommentare

Es gibt drei Arten von Kommentaren:

• Kommentar bis Zeilenende //

• Kommentare zwischen /* und */. Schachtelung ist jedoch nicht erlaubt.

• Kommentare zwischen /** und */ Die letzeren konnen mit javadoc ex-trahiert und bearbeiten werden.

Kommentare der letzten Art werden vom Programm javadoc aus dem Pro-grammtext extrahiert, um zur Dokumentation der Klassen zu dienen.

1.3.5 Klassenkonversion, Typkonversion, cast

Die Syntax des cast-Operators ist:(neue Klasse) Objekt

Damit kann man beispielsweise schreiben:varfloat = (float) vardouble

Die umgekehrte Zuweisung kann Java automatisch richtig umsetzen, da keineInformation verlorengeht.

vardouble = (float) varfloat ist erlaubt.Das gleiche kann man auch fur Klassen verwenden: Wenn geoObj Oberklassevon Rechteck ist, dann ist die Zuweisung

vargeoobj = varrechteck erlaubt, der Inhalt wird nicht verandert.Die Zuweisung

varechteck = vargeoobjist verboten, denn es konnte z.B. ein Kreisobjekt der Variablen vargeoobj zu-geordnet sein.

Erlaubt ist: var rechteck = (Rechteck) var geoobj . Hier kann es zu ei-ner Ausnahme zur Laufzeit kommen, wenn das Objekt kein Rechteck, z.B. einKreis ist.

Diese Typkonversion bei Klassen dient im wesentlichen dazu, den Typcheckzur Kompilezeit zu unterstutzen und auch um die Methoden von Oberklassenverwendbar zu machen. Umgekehrt erlaubt es diese Typkonversion, Objekteverschiedener Klassen zusammenzufassen z.B. in einem Vector.

1.3.6 Ausnahmen, Exceptions

Java hat eine Behandlung von Exceptions (Ausnahmen), wie Fehler bei externenAufrufen, Division durch 0 usw. Die zugehorigen Operatoren (Schlusselworter),um mit Exceptions umzugehen sind try, catch, throw. Fehler, die norma-lerweise zum Abbruch fuhren, kann man Abfangen mit catch, nachdem mandie Anweisung, die Fehler liefern konnte, mit try eingepackt hat. throw dientzum Erzeugen von programmierten Ausnahmen. Ein Abbruch wird erst dannerzeugt, wenn es eine Ausnahmebedingung gibt, fur die keine Ausnahmebehand-lung programmiert ist.

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 27

Wenn eine Methode selbst Ausnahmen erzeugen soll, dann muss diesin der Definition der Schnittstelle angezeigt werden, und zwar mit throwsException1, ....

Die Verwendung von try und catch: Einem try-Block der Form tryAusdruck folgen catch-Blocke: catch (Exception exception) Anweisung .

1.3.7 Zugriffsrechte

Die wichtigen sind public, und private. Es gibt auch noch protected, dasseltener verwendet wird.

Z.B.

....class Rechteck extends geometrischesObjekt {private int x, y, b, h;public void move (int xd; int yd) {

this.x = x + xd;this.y = y + yd;

}

• public bedeutet hier, dass die Methode move von außerhalb benutzt wer-den darf. d.h. die Nachricht move(10,10) kann an ein Objekt der KlasseRechteck gesendet werden.

• private bedeutet, dass die Attribute x,y,b,h nicht direkt geandert wer-den durfen, und außerdem auch nicht abgefragt werden konnen. d.h. r.bist nicht zulassig.

• protected bedeutet, dass die Attribute nur von Methoden der Unterklas-sen geandert werden durfen.

• Wenn man die Zugriffsrechte weglasst, dann darf das Attribut von allenMethoden des Pakets geandert werden darf.

1.3.8 Modifikatoren

• static: Ein als statisch gekennzeichnetes Attribut existiert in allen Ob-jekten der ganzen Klasse nur einmal, man nennt diese auch Klassen-Attribute. Fur Attribute wirkt static so, als wurde man dieses Attri-but zu einer globalen Variable fur diese Klasse erklaren. Hier kann sichman z.B. die Anzahl aller Objekte merken, oder eine Liste aller Objek-te mitfuhren. Allerdings kann das zum Verhindern der garbage collectionfuhren. Durch die Anwesenheit in dieser Liste werden die Objekte dannreferenziert.Klassen-Attribute kann man ansprechen, ohne dass ein Objekt erzeugtwurde, wobei der Aufruf als Klasse.attribut erfolgt.

Statische Methoden kann man als ”Klassenmethoden“ ansehen, die manbenutzen kann, ohne dass ein Objekt vorhanden ist, d.h. die Variable this

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 28

kann darin nicht verwendet werden. Die zugehorigen Methoden konnenbenutzt werden, ohne dass ein Objekt existiert, indem man diese aufruftmit: Klassenname. Methodenname(params).

Z.B. ist main in einer Java-Applikation stets eine Klassenmethode. Dieseerfahrt allerdings eine Sonderbehandlung, denn sie wird in einer Applika-tion automatisch aufgerufen, in einem Applet jedoch nicht.

• final: Bewirkt, angewandt auf ein Attribut, dass dessen Wert als nichtuberschreibbar angesehen wird. Damit kann Java einerseits feste Konstan-ten definieren, andererseits Oberklassen und Methoden, die nicht durchUnterklassen verandert (erweitert) werden durfen.

Beispiel 1.3.4 Dieses Beispiel zeigt einige Moglichkeiten, Klassen zu definie-ren und deren Instanzen zu erzeugen. Allerdings ist dies kein Applet, sondernein eigenstandiges Programm.

// abgewandeltes Beispiel aus Hannover Skript

class Fahrt {private double Geschwindigkeit;public String Fahrtrichtung;private Fahrzeug Benfahrzeug;public Fahrt (double Geschwindigkeit, String Fahrtrichtung,

Fahrzeug Benfahrzeug) {this.Geschwindigkeit = Geschwindigkeit;this.Fahrtrichtung = Fahrtrichtung;this.Benfahrzeug = Benfahrzeug;

}public double beschleunigt_5() {

Geschwindigkeit = Geschwindigkeit +5;return Geschwindigkeit;

}

public double Geschwindigkeit () {return this.Geschwindigkeit ;

}

}

class Fahrzeug {

public double Hoechstgeschwindigkeit;private String Eigentuemer;

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 29

private static long Anzahl;

static {Anzahl = 0;

}

public static long Anzahl() {return Anzahl;

}

// Konstruktur:public Fahrzeug() {Anzahl = Anzahl + 1;

}

public Fahrzeug(double Hoechstgeschwindigkeit,String Eigentuemer) {

Anzahl = Anzahl +1;this.Eigentuemer = Eigentuemer;this.Hoechstgeschwindigkeit = Hoechstgeschwindigkeit;

}

public double Hoechstgeschwindigkeit () {return Hoechstgeschwindigkeit ;

}

public void loesche_Fahrzeug() {Anzahl = Anzahl - 1;

}

public String Eigentuemer () {return Eigentuemer;

}

}

class Auto extends Fahrzeug {

public String Autokennzeichen;

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 30

public Auto(double Hoechstgeschwindigkeit,String Eigentuemer, String kennzeichen) {

super(Hoechstgeschwindigkeit, Eigentuemer);this.Hoechstgeschwindigkeit = Hoechstgeschwindigkeit;

this.Autokennzeichen = kennzeichen;}

}

class Boot extends Fahrzeug {

public double Tiefgang;public Boot(double Hoechstgeschwindigkeit,

String Eigentuemer, double tiefgang) {super(Hoechstgeschwindigkeit, Eigentuemer);this.Hoechstgeschwindigkeit = Hoechstgeschwindigkeit;

this.Tiefgang = tiefgang;}

}

class FahrzeugProg2 {public static void main(String[] args) {System.out.println("Anzahl Args: " + args.length);for (int i = 0; i < args.length; i=i+1)System.out.println(args[i] + " ");

System.out.println();

System.out.println("Anzahl Fahrzeuge: " + Fahrzeug.Anzahl());

Auto MeinGolf = new Auto(180.0, "myself","B-SE-1");System.out.println("Neues Auto, maxkm:" + MeinGolf.Hoechstgeschwindigkeit

+ " Besitzer:" +MeinGolf.Eigentuemer() + " AutoKZ:" + MeinGolf.Autokennzeichen) ;

Boot boot = new Boot(20.0,"Gaby",2.5);

System.out.println("Neues Boot, maxkm:" + boot.Hoechstgeschwindigkeit+ " Besitzer:" +boot.Eigentuemer() + " Tiefgang:" + boot.Tiefgang ) ;

System.out.println("Anzahl Fahrzeuge nach 2 X new: " + Fahrzeug.Anzahl());

Fahrt bootsfahrt = new Fahrt(12.0,"Norden",boot);

System.out.println("Geschwindigkeit(boot): " +bootsfahrt.Geschwindigkeit());

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 31

System.out.println("Richtung(boot): " +bootsfahrt.Fahrtrichtung);

bootsfahrt.beschleunigt_5();

System.out.println("Geschwindigkeit(boot): " +bootsfahrt.Geschwindigkeit());

System.out.println("MaximalGeschwindigkeit (MeinGolf): " +MeinGolf.Hoechstgeschwindigkeit());

System.out.println("Eigent\u00FCmer (boot): " +boot.Eigentuemer());

bootsfahrt = null;

boot.loesche_Fahrzeug();boot = null;MeinGolf.loesche_Fahrzeug();MeinGolf = null;System.out.println();System.out.println("Anzahl Fahrzeuge nach L\u00F6schen: "

+ Fahrzeug.Anzahl());}

}

1.3.9 Applets und Applikationen

In Java kann man zwei verschiedene Arten von lauffahigen Anwendungen schrei-ben:

Applikationen Diese haben in der Hauptklasse eine Methode main:

public static void main (String [] args) { ... die bei Aufruf derKlasse dann ausgefuhrt wird. Deren Argument ist standardmaßig ein Feldvon Strings: Dies sind Text-Parameter, die beim Aufruf ubergeben werden.

Applets Dazu muss im Programmcode Import-Anweisungen: importjava.applet.*; bzw. import java.swing.JApplet. Der Name derDatei und der definierten Klasse, die die ausgefuhrte Klasse des Ap-plets ist, sollten ubereinstimmen. Diese ausgezeichnete Klasse musseine Unterklasse von Applet sein. d.h. die Klasse wird definiert

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 32

durch z.B. public class geoobjtest extends Applet { .... bzw.... extends JApplet { .... Hierdurch sind automatisch Methodendefiniert, die fur diese Klasse uberschrieben werden sollten:

init(), start(), paint (Graphics g)

(Bezieht sich auf Ereignismodell 1.0). Das Applet kann dann mit einemApplet-Viewer, bzw. mittels eines Browsers in einer HTML-Datei aufge-rufen werden mit dem Schlusselwort applet (man kann auch embed oderobjectverwenden, siehe Java bzw. HTML-Dokumentation.) Bei Aufrufder Hauptklasse werden diese aufgerufen und erzeugen dann eine ent-sprechende Zeichnung bzw. interaktive graphische Anwendung. Wie obenschon erwahnt, hat ein Applet normalerweise Beschrankungen beim Zu-griff auf Files der Festplatte des Klienten.

1.3.9.1 Methoden eines Applets

Ein applet hat zumindest die Methoden

public void init()public void start()public void paint(Graphics g)public void stop()public void destroy()

Diese konnen bzw. sollten programmiert werden, d.h. in der Klasse uber-schrieben werden. Wenn der Browser das Applet aufruft, werden je nach Aktionund Zeitpunkt folgende Methoden des Applet aufgerufen:

init() Einmal mal beim Laden des Applets. Typischerweise wird in dieserMethode intitialisert, falls notwendig.

start() Wird vom Browser direkt nach der Methode initaufgerufen, aberauch, wenn das Applet-Fenster im Browser nach Besuch einer an-deren Web-Seite wieder aktiviert wird.

paint(Graphics g) Wird vom Browser aufgerufen, wenn das Fenster neu gezeichnetwerden muss, z.B. nach Verdecken und Wiederaufdecken des Fen-sters, oder beim Vergroßern des Fensters.

stop() Wird aufgerufen, wenn der Benutzer zu einer anderen Web-Seitewechselt. Kann internes Anhalten sein.

destroy() Wird vom Browser aufgerufen, wenn das Applet-Fenster geschlos-sen wird.

Beispiel 1.3.5 // ebene geometrische Objekte

// erster File: Punkt.java

public class Punkt {int x,y;Punkt (int x, int y) {this.x = x; this.y = y;

}

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 33

}

// zweiter File: geoobjtest.java

import java.applet.*;import java.awt.*;

public class geoobjtest extends Applet {GeoObjekt [] geos;Punkt p1,p2,p3,p4,m1;GeoObjekt lin;public void init () {p1 = new Punkt (10,10);p2 = new Punkt (50,50);p3 = new Punkt (100,10);p4 = new Punkt (80,120);lin = new Linie (p1,p4);m1 = new Punkt (50,70);geos = new GeoObjekt[3];geos[0] = new Kreis (30, m1);geos[1] = lin;geos[2] = new Dreieck (p1,p2,p3);

}public void paint (Graphics g) {

for (int i = 0;i < geos.length;i++)geos[i].zeichne(g);

}}abstract class GeoObjekt {public abstract void zeichne (Graphics g);public abstract boolean innen (Punkt p);

}

class Rechteck extends GeoObjekt {public Punkt lu;public int b,h; // x,y Koord , b,h, Breite,HoeheRechteck (Punkt p,int b, int h) {this.lu = p; this.b = b; this.h = h;

}public void zeichne (Graphics g) { // Methode zum Zeichnen

g.drawRect (lu.x, lu.y, b, h); // Aufruf Bibfu drawRect}public boolean innen (Punkt p) {

return this.lu.x <= p.x && p.x <= this.lu.x+b &&this.lu.y <= p.y && p.y <= this.lu.y+h;

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 34

}}

class Kreis extends GeoObjekt {public int r; // Radiuspublic Punkt m; // MittelpunktsKreis (int r, Punkt m) {this.m = m; this.r = r;

}public void zeichne (Graphics g) {

g.drawArc (m.x-r, m.y-r, 2*r, 2*r, 0, 360);// Aufruf der Bib fu drawArc

}public boolean innen (Punkt p) {

return (m.x-p.x)*(m.x-p.x) +(m.y-p.y)*(m.y-p.y) <= r*r;

}}

class Linie extends GeoObjekt {public Punkt a,b;Linie (Punkt a, Punkt b) {

this.a = a; this.b = b;}public void zeichne (Graphics g) {

g.drawLine (a.x, a.y, b.x, b.y);}public boolean innen (Punkt p) {Dreieck dr;dr = new Dreieck (p,this.a, this.b);return (p == this.a || p == this.b ||

dr.entartet() && (b.x-p.x)*(p.x-a.x) > 0&& (b.y-p.y)*(p.y-a.y) > 0);

}}

class Dreieck extends GeoObjekt {public Punkt p1,p2,p3; // Koordinaten der EckenDreieck (Punkt p1, Punkt p2, Punkt p3) {

this.p1 = p1; this.p2 = p2; this.p3 = p3;}public void zeichne (Graphics g) {

g.drawLine (p1.x, p1.y, p2.x, p2.y);g.drawLine (p2.x, p2.y, p3.x, p3.y);g.drawLine (p3.x, p3.y, p1.x, p1.y);

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 35

}public boolean entartet () {return (p3.x-p1.x)*(p2.y-p1.y)== (p2.x-p1.x)*(p3.y-p1.y);

}

public boolean innen (Punkt r) {return true;

}

}

1.3.10 Schnittstellen

Die Moglichkeit der multiplen Vererbung auf der Methodenebene bieten so-genannte ”Interfaces“. Diese bindet man in die Definition der Klasse mit-tels extends .... implements interface1, interface2, ... ein. Da-mit kann man z.B. eine nebenlaufige Berechnung erzeugen (bzw. einen ei-genstandigen Prozess erzeugen, sog. Thread), indem man die vordefinierteSchnittstelle Runnable verwendet. Diese Schnittstelle hat die Methode run().Man kann auch Interfaces selbst definieren mittels

public interface MeinInterface {methode1 (...);

}

Hierbei darf die Methode nicht implementiert werden. Nur die Namen werdenvereinbart.

Beispiel 1.3.6 Die Schnittstelle Comparable definiert eine totale Ordnungsbe-ziehung.

... implements Comparable {public int compareTo(Object other) {

Fahrzeug anderesfz = (Fahrzeug)other;if (this.hoechstgeschindigkeit

< anderesfz.hoechstgeschindigkeit) return -1;if (this.hoechstgeschindigkeit

> anderesfz.hoechstgeschindigkeit) return 1;return 0

}

Dies ist analog zu Haskells Typklasse Ord, die es erlaubt, Ausdrucke bestimm-ter Typen mit <,≤, >,≥ zu vergleichen.

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 36

1.3.11 Klassenbibliotheken in Java

Java strukturiert vordefinierte Mengen von Klassen in Pakete. Diese gehorenzum application programming interface (API). Hier muss man sich jedoch, jenach Java-Version, die Dokumentation anschauen, um sich mit den jeweils vor-handen Klassenbibliotheken vertraut zu machen. Einige Beispiele fur vorhande-ne Bibliotheken:

java.lang Basispaket, das z.B. Zahlen implementiert.

java.util Einige extra Basisfunktionalitaten: Hashtabellen, Datum, Random,Vector, enumeration (Liste)

java. applet Erzeugt sogenannte Applets. Eine Anwendung, die ein Appletwerden soll, muss als Unterklasse von applet definiert sein.

java.awt Abstract window toolkit:

java.swing Erweiterung von java.awt zur komfortableren Implementierung vonGUIs.

java.io Dient zur Verarbeitung (Lesen, Schreiben) von Files, Puffern, Pipes,Druckern, usw.

java.net Verarbeitung von Netzzugriffen, Verbindungen, Lesen, Laden vonRessourcen (URLs).

1.3.12 Mathematische Bibliothek

public final class MathDie Klasse Math kann keine Unterklassen haben, und somit kann keine Methodeuberschrieben werden. Alle Methoden und Variablen sind static. Die Ausnah-mebehandlung wie Uberlauf, Division durch 0, usw. werden auf verschiedenenPlattformen moglicherweise verschieden gehandhabt (d.h. nicht portabel).Es gibt folgende Konstante / Funktionen / Methoden:

E,PIceil(x), floor(x), rint(x), round(x) ganzzahliger Anteil, bzw. Rundungencos(x), sin(x), tan(x) trigonometrische Funktionenacos(x), asin(x), atan(x) Umkehrfunktionenexp(x), log(x), sqrt(x), pow(x,y) Einige mathematische Funktionenmax(x,y), min(x,y), abs(x) mathematische Funktionenrandom() Ergibt eine Zufallszahl zwischen 0.0 und 1.0

1.3.13 Collections, Vektoren, Listen

Java hat mehrere vordefinierte Moglichkeiten, Listen, Mengen oder Multimen-gen von Objekten zu verwalten. Logisch gesehen kann man unterscheiden zwi-schen: Listen, Mengen, Multimengen, Assoziationslisten

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 37

Listen entspricht einer Liste: Es gibt eine Reihenfolge der Objekte und es isterlaubt, dass Elemente mehrfach vorkommen.

Mengen Es gibt keine Reihenfolge, Duplikate sind verboten.

Multi-Mengen Es gibt keine Reihenfolge, aber Duplikate sind erlaubt.

Assoziationslisten (map) Ist wie eine Funktion bzw. eine indizierte Daten-bank. Es entspricht einer Liste von Paaren aus Schlusseln und Daten,wobei die Schlussel eindeutig sein mussen.

Es gibt Methoden zum Einfugen, Loschen, Vergleichen, indiziertem Zugriff,. . . und auch zum Iterieren.

Die Klasse Collection kann Objekte unterschiedlichen Typs enthalten. Indiesem Fall muss man bei der Verarbeitung eine Fallunterscheidung uber Typenmachen. Einige Funktionen sind:

boolean add(Object o) Hinzufugenvoid clear() Loschenboolean contains(Object o)boolean equals(Object o) Vergleich von collectionsboolean isEmpty()Iterator iterator()

Die Klasse Vector kann verwendet werden wie eine Liste von Objekten. Daman aber keine elementaren Datentypen in Vektoren einfugen kann, benotigtman zur Verwendung von Vektoren von Zahlen (beispielsweise), eine Verpackungdieser Zahlen in ein Objekt. Dazu dienen sogenannten Wrapper-Klassen.Short,Byte, Integer, Long, Float, Double, Character, Booleansind Wrapperklassen. Einpacken kann man Zahlen mittelsDouble x = new Double(3.14);, Auspacken mittels x.DoubleValue();.

1.3.13.1 Iterator

Ein Iterator behandelt eine Menge von Objekten, die in einem Array, Liste,Collection usw abgelegt sind, die eine Folge bilden (analog zu einem File mitSatzen). Man kann damit die Folge von vorne nach hinten abarbeiten.Das Interface Iterator hat die Methoden:

boolean hasNext()Object next() Liefert das nachste Objekt.

Als Seiteneffekt wird im Iterator eins weitergeschaltetvoid remove()

Typische Verwendung in einem Programm:

...Iterator it = col.iterator();while (it.hasNext())

...println(it.next());

Wir werden sehen, dass Java 5 Iteratoren auch in for-Schleifen erlaubt.

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 38

1.3.14 Nebenlaufige Berechnung: Threads

In Java kann man Unterprozesse anstoßen, sogenannte Threads (Berech-nungsfaden), die logisch parallel arbeiten. Diese kann man definieren als Klasse,die Unterklasse von Thread ist, oder mittels der Schnittstelle Runnable. Dieeinzige Methode dieser Schnittstelle ist run(). Einige Methoden zu Threadssind:

start() startet einen Thread, falls als Unterklasse vonThread definiert. Nach dem Start des Threads lau-fen zwei Programmteile parallel. Die Anweisungendes Threads werden ausgefuhrt. Ebenso wird mit dernachsten Anweisung, die dem start(); folgt, fort-gefahren.

sleep(int ms) Pause fur die angegebene Zeit (in ms).join() Wartet auf die Beendigung eines (anderen) Threads.

Die Angabe einer operationellen Semantik fur Threads muss ein Konzeptvon unabhangig ablaufenden Evaluatoren (Prozessen) einfuhren. Die Semantikdes Befehls sleep() beispielsweise kann nur dann deterministisch sein, wennman festlegen wurde, wieviel Ausfuhrungsschritte jeder Befehl braucht, und wiedie parallele Auswertung zeitlich genau ablaufen soll. So eine Festlegung wareUnsinn, denn die parallelen Auswertungen sollen auch logisch unabhangig sein.

Beispiel 1.3.7 Eine einfaches Beispiel, bei dem man die Aktionen der Threadsim Konsolenfenster der JVM sehen kann ist:

class Zaehlthread extends Thread {int thnr,pause;Zaehlthread(int thnr, int pause) {this.thnr = thnr;this.pause = pause;

}public void run () {int n = 0;while (n < 100) {

System.out.println("Thread: " + thnr + " : " + (n++));try {

sleep(pause);}catch(InterruptedException e) {

System.out.println("Thread: " + thnr + " InterruptedException ");}

}}

}

// Extra File:public class ThreadDemo1 {

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 39

public static void main(String[] args) {Thread t1 = new Zaehlthread(1,100);Thread t2 = new Zaehlthread(2,70);t1.start();t2.start();

}}

Die Ausgabe konnte so aussehen, wenn man die Klasse ThreadDemo1 alsApplikation startet. Beachte, dass diese nicht ganz deterministisch ist.

Thread: 2 : 0Thread: 1 : 0Thread: 2 : 1Thread: 1 : 1Thread: 2 : 2Thread: 1 : 2Thread: 2 : 3Thread: 2 : 4Thread: 1 : 3Thread: 2 : 5Thread: 2 : 6Thread: 1 : 4Thread: 2 : 7Thread: 1 : 5Thread: 2 : 8Thread: 1 : 6Thread: 1 : 7Thread: 2 : 9Thread: 1 : 8Thread: 2 : 10Thread: 1 : 9Thread: 2 : 11Thread: 1 : 10Thread: 2 : 12Thread: 2 : 13Thread: 1 : 11Thread: 2 : 14Thread: 2 : 15Thread: 1 : 12.......

1.3.15 Beispiel eines Applets: hanoi

Im folgenden der Quell-Code einer Animation der Turme von Hanoi, abgewan-delt aus der Literatur und etwas angepasst. Es ist ein Applet, das einen Thread

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 40

startet, damit es als Animation verwendbar ist. Die Methode init wird beimStart des Applets automatisch aufgerufen. Diese erzeugt einen neuen Thread,in dem die eigentliche Animation ablaufen kann. Die Methode startwird nachder Methode init ebenfalls automatisch aufgerufen uns startet diesen Thread.Die Methode Tow ist rekursiv und steuert den Ablauf.

Die Methode paint wird aufgerufen, wenn man die Fenstergroße ver/andertund das System das ganze Fenster des Applets neu zeichnen will. Die MethodegetGraphics() erlaubt den Zugriff auf das Zeichenbrett als Objekt. Ruft manbei jeder Anderung die Methode paint bzw. repaint() auf, dann ergibt sich eintypisches Flackern, da stets alles neu gezeichnet wird. In diesem Programm wirdnach einer Scheibenbewegung nur die Stelle, an der die Scheibe verschwindet,mit der Hintergrundfarbe uberschrieben, und an der Stelle, an der die Scheibeauftauchen soll, die grune Scheibe gezeichnet. Das System ubernimmt dabei au-tomatisch die neue Zeichnung und verandert die Anzeige auf dem Bildschirm.Dies kann asynchron zum Ablauf des Threads sein, bei schneller Scheibenbewe-gung fehlen manchmal Zwischenbilder.

import java.applet.*;import java.awt.*;import javax.swing.*;

class OneTower {int N;int tos;int t[];

public OneTower (int N) {this.N = N;tos = 0;t = new int [N];

}

public void push (int i) {t[tos++] = i;

}

public int pop () {return t[--tos];

}

// zeichnet einen Turmpublic void draw (Graphics g,int Y, int X, int width, int height) {drawItem (g, Y+1, X-1, N*2+1, Color.blue, width, height);for (int i = 0; i < tos; i++) {int j = 2*t[i]-1;if (j > 0)

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 41

drawItem (g, Y-i, X+N-((j+1)/2), j, Color.green, width, height);}

}

public void drawItem (Graphics g, int y, int x,int itemSize, Color c, int width, int height) {int deltax = width / (6*N+10);int deltay = height / (N+2);

g.setColor (c);g.fillRoundRect (x*deltax, y*deltay,itemSize*deltax, deltay, 10,10);

}}

public class TowerOfHanoi extends JApplet {Thread animator;int N;OneTower [] towers;

public void init () {N = 64; // N = 64;towers = new OneTower [3];this.setBackground(Color.white);//this.setDoubleBuffered(true);for (int i = 0;i < 3; i++)towers [i] = new OneTower (N);

for (int i = 0; i < N; i++) {towers[0].push (N-i);

}animator = new Thread() {

public void run() {Tow(0, 1, 2, N - 1, N - 1);

}};

}

public void start() {// System.out.println("Applet gestartet.");

animator.start();}

void Tow (int from, int help, int to, int n, int nTowers) {

if (n == 0)try {

animator.sleep(20); // animator.sleep(1);

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 42

Graphics g = getGraphics();int j1 = 2*towers[from].t[towers[from].tos-1]-1;towers[from].drawItem (g,N-towers[from].tos+1,

3+(N*2+3)*from+N-((j1+1)/2),j1/*2*towers[from].t[towers[from].tos]-1*/,Color.white, this.getSize().width, this.getSize().height);

towers[to].push (towers[from].pop());

int j2 = 2*towers[to].t[towers[to].tos-1]-1;towers[to].drawItem (g, N-towers[to].tos+1,

3+(N*2+3)*to+N-((j2+1)/2),j2/*2*towers[from].t[towers[to].tos]-1*/,Color.green, this.getSize().width, this.getSize().height);

}catch (InterruptedException e) {return;

}else {Tow (from, to, help, n-1, nTowers);Tow (from, 0, to, 0, 0);Tow (help, from, to, n-1, nTowers);

}}

public void run () {Tow (0,1,2,N-1,N-1);

}

public synchronized void paint (Graphics g) {g.setColor(Color.white);g.clearRect(0,0,this.getSize().width, this.getSize().height);for (int i = 0; i < 3; i++) {

towers[i]. draw(g,N,3+(N*2+3)*i, this.getSize().width, this.getSize().height);

}}

}

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 43

1.4 Graphische Programmierung (GUIs: gra-phical user interfaces)

Da Java eine (relativ) einfache Moglichkeit bereitstellt, graphische Benutzer-oberflachen zu programmieren, konnen wir kurz in die Programmierung undHandhabung von graphischen Benutzeroberflachen (in Applets) einfuhren.

Da die Benutzung eines Computers heute die Verwendung einer graphischenBenutzeroberflache fast zwangslaufig zur Folge hat, ist jeder schon mal Benutzergewesen. Diese Oberflachen zeichnen sich durch die Prasentation von Fensternaus, die verschiedenen Anwendungen zugeordnet sind. Fenster konnen aktivoder inaktiv sein, und visuell im Hintergrund oder im Vordergrund sein. Einweiteres Kennzeichen von GUIs ist die parallele Verwendung verschiedener Ein-gabekanale: Eingabekanale von Benutzerseite sind meist die Tastatur und eineMaus mit 1,2 oder 3 Tasten, manchmal noch weitere wie Touchscreen, Joystick,usw.

Es gibt eine Vielzahl von graphischen Elementen, die verwendet wer-den konnen: Fenster mit Schiebeleisten, waagrechte/senkrechte Menus, Radio-knopfe, Symbole zum Anklicken (Icons), Textfelder usw.

Die Verbreitung von GUIs startete vor ca. 25 Jahren. Zu diesem Zeitpunktwar die Verwendung von zeichenbasierten Bildschirmen und Interaktion mitKommandoeingabe in eine Kommandozeile vorherrschend. Auch jetzt gibt esdiesen Modus der Interaktion noch als Basis, z.B. bei PC als DOS Kommando-zeile, als Kommandozeile bei Unix, oder als interne Schnittstelle bei Großrech-nern (Mainframes).

Die große Akzeptanz der GUIs beim Benutzer kommt durch die einfacheBedienbarkeit, bei der man sich keine (textuellen) Kommandosequenzen undSyntax merken muss. Zudem kommt die graphische Oberflache der menschlichenWahrnehmung entgegen, die eher an Bildern orientiert ist.

Moglich wurden die graphischen Oberflachen erst durch schnelle Rechnerund großere Speicher, die eine schnelle Verarbeitung und Darstellung ermoglich-ten, heute ist diese Verarbeitung fast komplett in die Graphikkarte ausgelagert.Vorganger waren Großrechner mit teilweise mehr als 1000 Bildschirme an ei-nem Zentralrechner, die weitgehend passiv waren. In dieser Konstellation warengraphische Benutzeroberflachen so gut wie unmoglich, da die Rechenkapazitatzur Steuerung einer graphischen Benutzeroberflache nicht lokal war und von zuvielen Benutzern in Anspruch genommen werden konnte. Heutige Standardkon-stellation ist Anschluss an ein Netzwerk (Internet) und lokale (Rechen-. undSpeicher)- Kapazitat zur Steuerung der graphische Benutzeroberflache.

1.4.1 Programmierung, Ereignissteuerung

Im Gegensatz zur Verwendung einer Kommandozeile, bei der ein entsprechen-des Programm genau den Inhalt (einen String) der Kommandozeile sieht undentsprechend verarbeitet, muss eine programmierte graphische Benutzerober-flache und entsprechend die Anwendungsprogramme mit einer Mehrzahl von

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 44

Interaktionen und auch Eingabemoglichkeiten umgehen konnen.Z.B. muss ein Textverarbeitungsprogramm unter einer GUI i.a. die Markie-

rung eines Textstuckes ermoglichen. Dazu notwendig sind: Das Programm musswissen, was im Moment sichtbar ist, es muss herausfinden, wo die Maustastegedruckt wurde, welche Maustaste, wohin die Maus gezogen wurde und wo dieMaustaste wieder losgelassen wurde.

Die interne Methode der Mitteilung an das zugehorige Programm geschiehtuber einen Strom von Ereignissen, die vom System, Betriebssystem oder demGUI-System erzeugt werden und an das Benutzerprogramm gesendet werden.Dieser Strom ist nach der zeitlichen Reihenfolge des Auftretens der Ereignissegeordnet, wird aber im allgemeinen vom Betriebssystem und vom Window–Steuerung bereits gefiltert.

Das Prinzip der Portabilitat hier einzuhalten ist nicht ganz unproblematisch,da die verschiedenen GUIs und Systeme bezuglich der erzeugten Ereignisse nichtganz identisch sind. In der aktuellen Version von Java-Swing ist die Plattform-unabhangigkeit vollstandig gewahrleistet.

1.4.2 GUIs in Java (Ereignismodell 1.0

Im Folgenden geben wir die Klassen. Methoden und das Verhalten im Java-Ereignismodell 1.0 an. In Swing gibt es die meisten Klassen und Methodennoch, habe aber einen neuen Namen, z.B. JLabel statt Label.

Normalerweise ist die graphische Anwendung ein Applet, das durch eineKlasse definiert wird, die zur Unterklasse von applet erklart wird.

Das Bild, das der Benutzer sieht, stellen wir uns vor als einen flachen, graphi-schen und farbigen Bildschirm, der aus ca. 1000 X 1000 Bildpunkten, sogenann-ten Pixeln besteht. Dies ergibt in naturlicher Weise ein Cartesisches Koordina-tensystem, das jeden Punkt in der Form (x,y) ansprechbar macht. Normalerweisegibt es einen Zeiger (Cursor), das ist eine aktuelle Position der Tastatur, undeine Mausposition, die sich innerhalb der Flache befinden.

Es gibt eine reichliche Anzahl vordefinierter Fenstertypen und graphischerElemente:Oberste Klasse ist Component.Unterklassen sind:

Button Ein Knopf zum Anklicken.

Canvas Ein Zeichenflache.

Checkbox Ein Text und ein Kastchen zum Ankreuzen.

Choice Ein Auswahlmenu mit Kurztexten.

Container abstrakte Klasse, mit der hierarchisch ein Fenster in Unterfenstergegliedert werden kann. Die Unterklassen sind:

Panel Fenster ohne irgendwelche Rahmenobjekte.

Window mit Unterklassen Frame, Dialog

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 45

Label Textanzeigefeld

List Senkrechte, anklickbare Menuleiste.

Scrollbar Schiebeleiste

Textcomponent Textanzeige

Applet ist Unterklasse von Panel, was nur bedeutet, dass deren Methoden einemApplet sofort zur Verfugung stehen.

Zur Klasse Component gibt es eine Menge von Methoden, die verschiedeneAspekte handhaben: Einige Beispiele seien hier aufgefuhrt.

Layout Die Art der Verteilung von Subkomponenten kann gesteuert wer-den. Je nach Layout Spezifikation mittels der entsprechenden Klasse:Borderlayout North, South, Center, East, WestGridLayout(...) Komponenten sind matrixartig angeordnetFlowLayout Komponenten sind untereinander angeordnet.CardLayout Komponenten sind wie in einem Kartenstapel hin-

tereinander angeordnet.

Die aktuelle Große und Position kann ermittelt und verandert werden.bounds(), inside(), location(), move(), size(), ...

Farbe des Hintergrunds, Vordergrunds: getBackground(),setForeground(), . . . .

Ereignisse Ermitteln und Handhabung der durch den Benutzer verur-sachten Ereignisse action(), gotFocus(), keyDown(), mouseDown(),mouseEnter(), mouseUp(), handleEvent(), postEvent(), ....

Zeichnen innerhalb der Komponente, Neuzeichnen des Bildes. paint(),repaint(), update()

Status Feststellen, ob Komponente aktiv, usw.

Bei Definition einer Unterklasse konnen bzw. mussen bestimmte Methoden indiesen Klasse uberschrieben werden.

BemerkungenDie Klasse Container hat die Methode add, mit der man neue Komponenten

hinzufugen kann. Diese werden normalerweise vom zugehorigen Layout-Manageran bestimmte, vordefinierte Positionen plaziert: Bei BoderLayout sind moglich:North, West, South, East, Center, null.

Die Ereignisse, die vom Benutzer und System generiert werden, werden inder Objekthierarchie von unten nach oben durchgereicht, bis es eine Methodehandle event gibt, die diese einfangt. Diese Methode kann das Ereignis auchabweisen (bzw. weiterreichen, indem false zuruckgegeben wird.Programmierhinweise: Generell gilt: Man muss das an der Oberflache sicht-bare als Modell moglichst vollstandig in Datenstrukturen ablegen, damit das

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 46

sichtbare Bild rekonstruierbar ist und damit der Benutzer und das Programmdie gleiche Sicht der Dinge haben.

Ist die zu programmierende Anwendung komplex, so ist die Handhabungund das Verarbeiten aller moglichen Ereignisfolgen eine ebenfalls komplexe undschwierige Aufgabe, da man mit allem rechnen muss und auf jedes relevanteEreignis eine sinnvolle Aktion gestartet werden soll.

Um eine komplexere (gute, professionelle) Anwendung (Applet) in Java zuschreiben, ist ein aktuelles Handbuch notwendig. Denn man muss eine Unzahlvon Klassen, die Hierarchie, deren Methoden, die richtige Verwendung und auchdie zu behandelnden Ausnahmen kennen. Eine Einarbeitung und Orientierungwird meist erleichtert durch vorgegebene Beispiele im SDK (bzw. JDK oderauch aus anderen Quellen).

Eine Anwendung sollte anwenderfreundlich sein und einfach und zuverlassigwirken und dies auch sein. Das erfordert oft etwas Nachdenken und gutes Struk-turieren. Zum Beispiel ist im nachfolgenden Zeichenprogramm extra Aufwandgetrieben worden, um wahrend des Zeichnens die aktuelle Strecke(Ellipse) sicht-bar zu machen. Analog verhalt es sich mit Fehlermeldungen. Um diese richtigzuzuordnen und zu formulieren, sollte man sich in die Rolle eines Benutzerversetzen, der keine Ahnung von der internen Verarbeitung hat, und der nichtabgeschreckt werden soll.

Beispiel 1.4.1 (Ereignismodell 1.0) Dieses Beispiel ist ein Applet, das eineZeichenflache realisiert, auf der man Strecken und Ellipsen zeichnen kann. Esgibt einen Schalter, der mit choice realisiert ist, mit dem man von Strecke aufEllipse umschalten kann.

Wahrend des Zeichenvorgangs wird das jeweils aktuelle Objekt gezeichnet,bis es durch Loslassen der Maustaste bestatigt wird.

// veraenderte Version eines JDK Beispiels// (alte Version der Ereignissteuerung)

import java.awt.*;import java.applet.*;

import java.util.Vector;

public class DrawTestRechteck extends Applet {public void init() {

setLayout(new BorderLayout());DrawPanel dp = new DrawPanel();add("Center", dp);add("South", new SKWahl(dp));dp.init();

}

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 47

public boolean handleEvent(Event e) {switch (e.id) {case Event.WINDOW_DESTROY:System.exit(0);return true;

default:return false;

}}

public static void main(String args[]) {Frame f = new Frame("DrawTest");System.out.println("Main laeuft");DrawTestRechteck drawTest = new DrawTestRechteck();drawTest.init();drawTest.start();

f.add("Center", drawTest);f.resize(300, 300);f.show();

}}

class DrawPanel extends Panel {Vector lines = new Vector();Vector streckeOderKreis = new Vector();int x1,y1;boolean ziehen;int strecke; // 0 = strecke, 1 = kreis, 2 = Rechteckint x2,y2;

public void init() {ziehen = false;strecke = 0;

}public DrawPanel() {

setBackground(Color.white);}

public void setStrecke() {strecke = 0;

}

public void setRechteck() {strecke = 2;

}

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 48

public void setKreis() {strecke = 1;

}public boolean handleEvent(Event e) {

switch (e.id) {case Event.MOUSE_DOWN:

x1 = x2 = e.x;y1 = y2 = e.y;ziehen = true;

return true;case Event.MOUSE_UP:

lines.addElement(new Rectangle(x1, y1, e.x, e.y));// leichter Missbrauch von rectangle

streckeOderKreis.addElement(new Rectangle(strecke,0,0,0));ziehen = false;

repaint();return true;

case Event.MOUSE_DRAG:x2 = e.x;y2 = e.y;

repaint();return true;

case Event.WINDOW_DESTROY:System.exit(0);return true;

default:return false;

}}

public void paint(Graphics g) {int np = lines.size();int streckei;

/* Zeichne alle Strecken und Ellipsen */for (int i=0; i < np; i++) {

Rectangle streckeip = (Rectangle)streckeOderKreis.elementAt(i);streckei = streckeip.x;Rectangle p = (Rectangle)lines.elementAt(i);

if (streckei == 0)g.drawLine(p.x, p.y, p.width, p.height);

else {if (streckei == 1) {

if (p.height > p.y)

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 49

g.drawOval(p.x, p.y, p.width-p.x, p.height-p.y);elseg.drawOval(p.x, p.height, p.width-p.x, p.y-p.height);

}elseif (streckei == 2) {

if (p.height > p.y)g.drawRect(p.x, p.y, p.width-p.x, p.height-p.y);

elseg.drawRect(p.x, p.height, p.width-p.x, p.y-p.height);

}}

}if (ziehen) {if (strecke == 0)

{g.drawLine(x1, y1, x2, y2);}else {if (strecke == 1) {

if (y2 > y1)g.drawOval(x1,y1,x2-x1,y2-y1);

elseg.drawOval(x1,y2,x2-x1,y1-y2);

}else {if (y2 > y1)g.drawRect(x1, y1, x2-x1, y2-y1);

elseg.drawRect(x1, y2, x2-x1, y1-y2);

}}

}}

}

class SKWahl extends Panel {DrawPanel target;

public SKWahl(DrawPanel target) {this.target = target;setLayout(new FlowLayout());Choice SoderK = new Choice();SoderK.addItem("Strecke");SoderK.addItem("Ellipse");

SoderK.addItem("Rechteck");

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 50

SoderK.setBackground(Color.lightGray);add(SoderK);

}

public void paint(Graphics g) {Rectangle r = bounds();g.setColor(Color.lightGray);g.draw3DRect(0, 0, r.width, r.height, false);

}

public boolean action(Event e, Object arg) {if (e.target instanceof Choice) {

String choice = (String)arg;if (choice.equals("Strecke")) {

target.setStrecke();} else if (choice.equals("Ellipse")) {

target.setKreis();} else if (choice.equals("Rechteck")) {

target.setRechteck();}}return true;

}}

1.4.3 Ereignissteuerung nach dem Java Ereignis-Modell1.1

Die neuere Methode der Ereignisverarbeitung hat die Modellvorstellung derEreignisse und somit zwangslaufig auch die Bibliotheken, das API, und und dieProgrammierung verandert.

Die Modelle 1.0 und 1.1 sind leider nicht ganz kompatibel, so dass Program-me von Hand umgestellt werden mussen. Die Strukturierung im Ereignis-Modell1.1 funktioniert zeitlich so:

1. Ein Ereignis tritt bei einem Objekt auf (z.B. Button, Menu, . . . ).

2. Dieses Ereignis wird in ein Ereignisobjekt verpackt und an einen Beob-achter gesendet (Listener).

3. Dieser Beobachter (Methode) enthalt die Programmierung, was nach Ein-treten dieses Ereignisses zu verfahren ist.

Die Programmierung erfolgt so, dass an bestimmte Quell-Objekte einen Li-stener eingetragen wird, der selbst zu definieren ist. Statt handleEvent gibt esfur jedes Ereignis eine eigene Methode.

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 51

Das neue Modell erlaubt auch andere Programmierprinzipien wie innereKlassen, um die Beobachter (Listener) geschickter programmieren zu konnen.(Siehe hierzu Java Handbucher).

Vorteile des neuen Modells sind optimierte Verteilung der Ereignisse. Im Mo-dell 1.0 wurden (werden) die Ereignisse relativ ungezielt an die Anwendungs-programme weitergegeben (Gießkannenprinzip), wahrend im neuen Modell dieseVerteilung programmgesteuert ist. Nachteil des neuen Modells ist die Verwir-rung durch die zeitweise Koexistenz zweier Standards, wobei der neue Standardin Browsern nur abhangig von der Version und den richtigen Plugins funktioniert(siehe Paragraph 1.2.2).

Beispiel 1.4.2 // Beispiel aus Java2-Handbuch

import java.awt.*;import java.awt.event.*;import java.applet.*;

public class KlickKlack extends Applet {Button klickButton = new Button("KlickKlack");boolean geklickt = true;Color klick = new Color(255,255,0);Color klack = new Color(0,0,255);

public void init() {add(klickButton);klickButton.addMouseListener(

new MouseAdapter () {public void mouseClicked(MouseEvent e) {

Graphics g = getGraphics();if (geklickt) g.setColor(klick);else g.setColor(klack);g.fillOval(0,0,200,200);// das original war g.fillOval(0,0,getWidth,getHeight);geklickt = !geklickt;

}});

}}

1.5 Kritikpunkte an der objektorientierten Pro-grammierung

(siehe Artikel von M. Broy, Informatik Spektrum, Februar 2002)Einige Kritikpunkte:

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 52

• ”OO-Sprachen kennen keine Komposition von Klassen“Allgemeiner: Es gibt keine Operatoren, die Klassen zu neuen Klassen ver-binden. Es gibt nur die Vererbungsbeziehung zwischen Klassen. Man kannmanche Kompositions-Konzepte mittels multipler Vererbung implemen-tieren.

• ”Das OO-Ausfuhrungsmodell ist sequentiell“Hierbei gibt es die Problematik der Seiteneffekte. Es ist schwierig undkomplex, aufgrund von lokalen Eigenschaften der Programme (Metho-den) deren Wirkung zu beschreiben. Parallelisierung der Ausfuhrung wirddurch Sequentialitat stark behindert. z.B. kann man in a.methode1;b.methode2 die Methoden nicht parallel auswerten, auch wenn a,b, unddie beiden Methoden verschieden sind, da es darauf ankommen konnte,dass die Effekte in einer bestimmten Reihenfolge durchgefuhrt werden.Es gibt allerdings Programmteile, z.B. Threads, die direkt durch die Artder Programmierung im Prinzip parallel ausfuhrbar sind.

• ”Die Objektorientierung sagt uns nicht, wie wir das Verhalten von Schnitt-stellen definieren sollen“Mit Schnittstellen sind hier nicht Interfaces gemeint. Sagen wir mal Me-thodenaufruf. Hier eine operationale Semantik anzugeben erfordert i.a.,den ganzen Zustandsraum (d.h. alle Objekte und deren innere Zustande)des aktuellen Programmlaufs zu berucksichtigen. Dies ist nicht modularund auch nicht lokal.

• ”Vererbung verletzt das Geheimnisprinzip“Nur wenn ausdrucklich programmiert, gibt es unsichtbare Attribute.

• ”Letzlich gibt es nur eine einzige, syntaktische Annahme: (die Unterklasse)hat mindestens dieselben Attribute und Methoden wie die Oberklasse“Da ist was dran: da es keine Verhaltensbeschreibung der Methoden gibt,und man uberschreiben darf, weiss man a priori nichts außer dass dieMethoden vorhanden sind, aber kann ihr Verhalten nicht in der Oberklasseirgendwie festlegen.

In Haskell kann man zumindest den Typ festlegen. In Java auch, aber derTyp ist nicht so aussagekraftig wie in Haskell.

• (sinngemaß:) ”neue Projekte werden sich i.a. eine eigene Klassenhierarchieschaffen, nicht auf eine bereits vorhandene Klassenhierarchie aufbauen“.Der einfache Grund ist: das bereits vorhandene System funktioniert, aberdas neue musste Anderungen in der bestehenden Hierarchie, den Attri-buten, Methoden durchfuhren. Diese bewirkt aber moglicherweise Fehlerim vorhandenen System, muss also sehr vorsichtig gemacht werden, undist somit viel aufwendiger als das Kopieren und Modifizieren, d.h. Neu-erstellen der Klassen fur die Zwecke des neuen Projekts.

• ”Multiple Dispatching“ fehlt.Das bezog sich auf Java1 1.4. In Java 5 gibt es durch Argumenttypen

Praktische Informatik 2, SS 2005, Kapitel 1, vom 9. Maerz 2005 53

uberladene Klassen, somit ist diese Kritik nicht mehr stichhaltig.

• ”statische Analyse der Fernwirkung von Methodenaufrufen ist so gut wieunmoglich“Wenn man versucht, statisch (d.h. aufgrund des Programmtextes) vorher-zusagen, welche Auswirkung x.methode(..) auf andere Objekte hat, dannstellt man fest, dass dies

1. aufgrund der Seiteneffekte i.a. nur durch vollstandiges formales Te-sten moglich ist.

2. wieder einen Methodenaufruf auf das gleiche Objekt x erfordert konn-te. Dies ist analog zur Rekursion. Hier kann es im Extremfall bedeu-ten, dass man nicht davon ausgehen kann, dass Methodenaufrufe aufObjekte immer auf Objekte in einem konsistenten Zustand passieren,sondern dass es auch unerwartete Zwischenzustande geben kann.