45
Unterlagen: Praktische Informatik 2, Sommersemester 2002 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 o. 28213 Fax: 069/ 798 28919 25. April 2002

Unterlagen: Praktische Informatik 2, Sommersemester 2002 · alle Firmen senden mit einem Klick ihre Reklame an viele (alle) Mailadressen. Heute gibt es viele Filter und Vermeidungsstrategien,

  • Upload
    vanhanh

  • View
    216

  • Download
    0

Embed Size (px)

Citation preview

Unterlagen: Praktische Informatik 2,

Sommersemester 2002

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 28597 o. 28213Fax: 069/ 798 28919

25. April 2002

Kapitel 1

WWW, OO und Java

1.1 Internet + WWW

Das Internet ist ein weltweiter Verbund von elektronischen Geraten(Computer, Router, Gateways, Drucker,. . . ) (Knoten), die mitStandleitungen,Telefonleitungen, Funkverbindungen, . . . verbunden sindund uber Internetprotokolle 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 amerikanischenVerteidigungsministeriums zur Vernetzung von Rechnern undAusfallsicherheit.

• 1983: ARPANet, danach verschiedene andere Netze (NSFNET).TCP / IP wird als Standard verwendet. Starke Nutzung inForschungseinrichtungen 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.

1

Praktische Informatik 2, SS 2002, Kapitel 1 2

Die Knotenadressen (IP-Adressen) sind von der Form n.n.n.n, wobei n eineZahl zwischen 1 und 255 sein kann. Z.B. ist 141.2.10.1 die Adresse des Rechnersder KI. Es sind nicht alle kombinatorisch moglichen Adressen zulassig. Manchehaben feste Bedeutung: 127.0.0.1. (localhost, bzw. loopback.device), istimmer ein Ruckverweis auf den eigenen Rechner. Die IP-Adresse setzt sichaus Netzwerk-Adresse und Rechneradresse zusammen. Es gibt drei Arten vonNetzwerken, die sich nur durch die Große des Netzwerks und der Adresseunterscheiden. 1) Netzwerkadresse ist ein Byte, aber nur zwischen 1 und 126.Die Rechner haben dann drei Byte zur Adressierung. 2) Netzwerkadresse sindzwei Byte, das erste Byte ist zwischen 128 und 191. 3. kleine Netzwerke, derenAdresse 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. Es gibt Vereinbarungen, diesen Adressraum inZukunft zu erweitern.

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: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/Information. Einseitig, asynchron.

I.a. wird das Protokoll SMTP (simple mail transport protocol) verwendet.Dies funktioniert analog zum Prinzip der Briefpost: Briefe (mit Absenderund Empfanger-Adresse und Daten) werden von einer Poststelle zum

Praktische Informatik 2, SS 2002, Kapitel 1 3

Verteiler 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 Binardatenzu 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)Mailadressen. Heute gibt es viele Filter und Vermeidungsstrategien,die unerwunschte und/oder kommerzielle Reklamepost weitgehendausschalten.

• 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 Nachrichtenentfernt. Es gibt viele sogenannte Newsgruppen zu den verschiedenstenThemen. Zu unmoderierten Newsgruppen kann jeder unkontrolliert etwasbeitragen. Moderierte Newsgruppen zensieren die Zettel (Nachrichten)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.

• 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 derProgramme geschieht auf dem entfernten Rechner. Damit kann man z.B.seine elektronische Post auf dem Fachbereichsrechner von den USA herlesen: 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).

Praktische Informatik 2, SS 2002, Kapitel 1 4

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 Rechner(bzw. seinem ihm zugeordneten Knoten) gewisse Daten (i.a. HTML(hyper text markup language)-Dokumente) zur Verfugung, die anderesich von außerhalb anschauen durfen. Diese Daten sind i.a. als Einheitenstrukturiert, die uber Adressen ( Links) verbunden sind und eine eigeneweltweit eindeutige Adresse haben (URL). Der Benutzer (die Surferin)holt sich die Daten, wobei i.a. ein sogenannter Browser (z.B. NetScapeCommunicator, Internet Explorer) verwendet wird, der die Daten in Formvon Seiten (graphisch gestaltet) anzeigt. Diese Seiten sind i.a. in HTMLgeschrieben mit evtl. eingebetteten weiteren Aufrufen. Eine Erweiterung,die aktuell diskutiert wird, ist XML. Um die graphische Gestaltungsehr flexibel zu gestalten, wurde Java (von Sun) entwickelt. Java isteine Programmiersprache, bei deren Design die Prioritaten entsprechendgesetzt wurden: Portabilitat, Sicherheit, Objektorientiert, in HTML leichtverwendbar. ( Wir werden Java noch behandeln. )

Jede Seite (Datenpaket) hat eine eindeutige Adresse und wird unterAngabe dieser Adresse geladen. Man kann das WWW als großesund offenes Hypertextsystem ansehen: Als System von vernetztenDokumenten.

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.

– 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),politisch extreme Agitation, Copyright-Probleme, Datenschutzaspekte,nicht einheitliche 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

Praktische Informatik 2, SS 2002, Kapitel 1 5

berucksichtigen hat, ist es nicht ganz einfach, hieraus mit genugenderGenauigkeit die aktuelle Zeit zu errechnen.

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

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

Praktische Informatik 2, SS 2002, Kapitel 1 6

1.2 Objektorientierte Programmierung amBeispiel von Java

1.2.1 Was hat Java mit dem WWW zu tun?

Java ist explizit dafur entworfen worden, um Anwendungen im WWWzu implementieren. Unterstutzt wird: die Verwendung graphischerBenutzeroberflachen, 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 2002, Kapitel 1 7

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. Javaist 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 Erweiterungeiner Web-Seite zu einer Dialog-Anwendung, die Daten bzw. Anfragen zwischenServer und Client austauscht. Hierzu kann man das sogenannte CGIs verwenden(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 derAnwendungen 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) und Java 2 (1999) erschienen. Dazu wurden von SunMicrosystems auch die entsprechenden Entwicklungsumgebungen veroffentlicht.Bis einschließlich Version 1.1 trugen diesen den Namen JDK1. Ab JDK-Version 1.2 fand ein Namenswechsel statt, die Versionen heißen Java 2 unddie entsprechenden Entwicklungsumgebungen Java SDK2. Die aktuelle Versionist Java 2 SDK 1.4 (2002).

Die Wahl der Version, mit der man arbeitet, hangt vom Anwendungsfall ab.Version 1.0 wird von jedem Java-fahigen Browser unterstutzt. Ab JDK 1.02 istdas Ereignismodell 1.02 integriert, wobei in diesem Modell samtliche Ereignisse,die wahrend des Programmablaufs stattfinden, durch das Programm fließen undvon einer Methode namens handleEvent() behandelt werden.

Mit JDK 1.1 wurde das Ereignismodell grundlegend geandert. DasEreignismodell 1.1 verwendet das Konzept der Event-Listener. Dieverschiedenen Listener sind verantwortlich fur die Behandlung einer bestimmtenArt von Ereignissen (z.B. Mouse-Listener fur Mausereignisse, Key-Listenerfur Tastaturereignisse, etc.). Durch das Programm werden nur jene Ereignissegeleitet, fur die vorher im Quelltext Listener vorgesehen wurden. So lasst sich

1Java Development Kit2Software Development Kit

Praktische Informatik 2, SS 2002, Kapitel 1 8

der Verarbeitungsvorgang effizienter gestalten, da nicht mehr alle Ereignissegepruft werden, die stattfinden.

Applets, die mit JDK 1.1 erstellt sind, konnen mit moderneren WWW-Browsern (MS IE 4.0 bis 5.x, Netscape ab 4.07) ausgefuhrt werden.

Mit Version 1.2 (bzw. Java 2) wurden die JFC3-Bibliotheken ins SDKintegriert, die insbesondere das Swing-Paket enthalten, das die Moglichkeitender Programmierung von graphischen Benutzeroberflachen erweitert. Außerdemwurde die Arbeitsumgebung mit Java 2 durch sogenannte Just-in-Time-Compiler verbessert, die die Ubersetzung von Java-Programmen erheblichbeschleunigen.

Die meisten WWW-Browser unterstutzen Java 2 nicht mehr durch eineintegrierte VM, allerdings konnen die Applets durch Installation eines BrowserPlug-Ins (z.B. von Sun das JRE4) ausgefuhrt werden (Netscape 4.7 unterstutztJava 1.4 mit JRE-Plug-In, Netscape 6 unterstutzt Java 1.3.0 mit integriertemPlug-In, MS IE 5.5 unterstutzt Java 1.1.5 integriert, und Java 1.4 mit JRE-Plug-In, MS IE 6 hat keine integrierte VM und Plug-In und benotigt deswegendie Installation eines Plug-Ins zum Ausfuhren von Java-Programmen, z.B. JRE1.4).

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. Mittlerweile gibt es Java 2, das teilweise in diesemSkript verwendet wird.

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

Objekte sind zusammengesetzte (Daten-)Einheiten, die auch alsEinheit ansprechbar sind. Die Objekte kommunizieren miteinander durchSenden/Empfangen von Nachrichten. Veranderungen von Objekten werdenstets mittels der sogenannten Methoden durchgefuhrt.

Jedes Objekte gehort zu einer Klasse. Klassen werden in der OO-Programmiersprache definiert. Klassen enthalten die Definition der Strukturder zugehorigen Objekte und auch die Definition der Methoden, die auf Objektedieser Klasse anwendbar sind.

Klassen kann man in einer (Baum-) Hierarchie anordnen. DieseKlassenhierarchie wird i.a. verwendet, um allgemeine Aspekte von Objektenin einer Oberklasse zu definieren, und dann in Unterklassen die speziellerenEigenschaften zu definieren bzw. implementieren.

3JavaFoundationClasses4JavaRuntimeEnviroment

Praktische Informatik 2, SS 2002, Kapitel 1 9

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

Ein Objekt besteht aus Daten und Methoden. Von außen ist das Innere (dieDaten und Methoden) eines Objektes nicht direkt sichtbar. Nur uber erlaubteZugriffe und Schnittstellen ist das Innere des Objektes (seine Attribute) sichtbarund anderbar.Jedes Objekt gehort zu einer Klasse: man sagt auch: ist (direkte) Instanz einerKlasse.

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, wobeiauch durch geeignete Definition eines Typs die Komponenten wie Attributeangesprochen werden konnen.

Beispiel 1.2.1 Ein Auto kann man als Klasse Auto modellieren mit denmogliche Attributen: Marke, Farbe, Kennzeichen, Besitzer, Baujahr, Leistungin 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,...).

Praktische Informatik 2, SS 2002, Kapitel 1 10

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 dieNachricht 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.

Beispiel 1.2.2 Gegeben sei ein Rechteck durch die Koordinaten einesEckpunktes und der Hohe und Breite. Wir nehmen an, dass es auf demBildschirm dargestellt wird, und die Koordinatenangaben in Pixeln erfolgt. DasBewegen auf dem Bildschirm konnte man durchfuhren mittels folgender Sequenzvon Anweisungen, 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 Oberklassenund Unterklassen. Die hierarchische Anordnung soll dazu dienen, in derOberklasse die gemeinsamen Methoden und Attribute zu definieren, die fur alleUnterklassen gelten. (Statt Unterklassen sagt man auch abgeleitete Klasse).

Beispiel 1.2.3 Die Klasse Fahrzeug kann man als Oberklasse von Autodefinieren mit den Attributen Hoechstgeschwindigkeit, Besitzer. Als

Praktische Informatik 2, SS 2002, Kapitel 1 11

weitere Unterklassen von Fahrzeug kann man LKW, Bus, Motorrad definieren.Bei LKW kamen als Attribute hinzu: zul. Gesamtgewicht, Art der Guter, ...

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

Fahrzeug

yyrrrrrrrrrr

�� %%KKK

KKKK

KK

))SSSS

SSSS

SSSS

SSSS

Auto LKW Bus . . .

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:

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}

}

1.2.7 Methoden

In einer Klasse werden sowohl die Attribute als auch die darauf moglichenOperationen definiert. Diese Operationen nennt man Methoden. DerenDefinition ist innerhalb einer Klassendefinition.

Beispiel 1.2.5

class Rechteck {

Praktische Informatik 2, SS 2002, Kapitel 1 12

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 dieDifferenz 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 elementareDatentypen sind, sondern auch Objekte sein konnen.

Typen bzw. Klassenangaben mussen in Java fur alle Methoden, derenArgumente und deren Ergebnis gemacht werden. void steht fur den Ergebnistypeiner Methode, die 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,hierarchisch strukturiert. D.h. man versucht diese so zu strukturieren, dass manzunachst eine moglichst allgemeine Klasse definiert, z.B. geometrischesObjekt:

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 alsUnterklassen definieren, die mehr Methoden und mehr Eigenschaften haben,also spezieller sind:

Praktische Informatik 2, SS 2002, Kapitel 1 13

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 Oberklasse.Es ist moglich, neue hinzuzufugen. Die Unterklasse hat dann die Vereinigungder Attribute und Methoden der Oberklasse und der in der Klasse definiertenentsprechenden Komponenten.

Es ist auch moglich, die Methoden der Oberklasse in der Unterklasse zuuberschreiben. Allerdings nur fur die Nutzung in dieser Unterklasse (und derenUnterklassen). Dies ist notwendig, da fur spezialisiertere Klassen die Methodenebenfalls weiter spezialisiert werden mussen. Z.B. Die Methode paint wirdbei einem Rechteck nur die Linien des Rechtecks zeichnen, bei einem farbigenRechteck die Linien und zusatzlich die Farbe. Es ist nicht moglich, Attributeoder 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 demZugriffsrecht abstract. Es ist dann nicht moglich, Objekte zu erzeugen, diegenau zu dieser Klasse gehoren. Dies geht nur fur “konkrete“ Unterklassen.

1.2.9 Wesentliche Eigenschaften der objektorientiertenProgrammierung

Das Programm besteht aus einer Menge von Klassendefinitionen, dieaus Erklarungen von Attributen und Definitionen von Methoden (undSchnittstellenbeschreibungen ) bestehen. Die Verwendung von Methodengeschieht wie eine Funktionsanwendung in Attributnotation. D.h. Klassen undMethoden sind das eigentliche Programm.

Praktische Informatik 2, SS 2002, Kapitel 1 14

Objekte gibt es nur zur Ausfuhrungszeit des Programms. Diese werdeninnerhalb 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. Diesgilt damit auch fur die Objekte: auf diese kann man alle Methoden einerSuperklasse anwenden. Man kann den Methoden in Unterklassen eineandere (spezifischere) Implementierung geben.

Polymorphie Variablen mussen getypt sein (der Typ ist die Klasse), d.h.Variablen konnen nur Objekte einer Klasse referenzieren. Allerdings sinddann auch Objekte erlaubt, die zu Unterklassen gehoren. Welchen Typdas Objekt hat, kann man erst zur Laufzeit ermitteln. Hat man z.B.eine Variable Fahrzeug fahrzeug, und Fahrzeug hat die UnterklassenAuto, Bus, Schiff, dann kann man auf die Methode Eigentuemeranwenden: fahrzeug.Eigentuemer. Es ware auch moglich, dass dieMethode in der Unterklassendefinition uberschrieben wird. In diesem Fallwird die spezifischere Methode verwendet.

Damit kann man Programmteile allgemein formulieren. Falls Unterklassenzum Programm noch hinzugefugt werden, ist es nicht notwendig, diebereits verwendeten Methodenaufrufe zu andern.

Dynamische Bindung (late binding) Das ist der oben beschriebeneMethodenaufruf, der jeweils die spezifischste Methode fur ein Objektnimmt. Gleiche Operationen (gleicher Name, gleiche Anzahl vonArgumenten, gleiche Intension) die auf Objekte verschiedener Klassenangewendet werden, konnen verschieden programmiert sein. An derStelle der Verwendung muss man keine Rucksicht auf die Klassenehmen. “Dynamisch“ deswegen, da man nicht immer wahrend derKompilierung herausfinden kann, welche Klasse das Objekt hat, d.h.welche implementierte Variante der Methode angewendet werden muss.

Man nennt diese Art der Auswahl der korrekten Implementierung einerMethode nach dem Typ eines aktuellen Arguments auch single dispatching.Es gibt Programmiersprachen (z.B. Dylan), die auch sogenanntes multipledispatching durchfuhren: Auswahl der Methode nach den Typen vonmehreren Argumenten. Dies erfordert eine mehrdimensionale Tabelleder Zuordnung von Typen zur richtigen Methode. Java hat keineUnterstutzung des multiple dispatching.

Statische Bindung (early binding) Im Gegensatz dazu ist die statischeBindung, die (vom Compiler) verwendet werden kann, wenn derMethodenaufruf zur Compilierzeit eindeutig ermittelbar ist, (genauer: dieImplementierung der Methode).

Das gibt es in Java nicht:

Praktische Informatik 2, SS 2002, Kapitel 1 15

Mehrfachvererbung (von Attributen), D.h. eine Klasse kann nichtUnterklasse von zwei anderen unabhangigen Klassen sein. Dies vereinfachtdie Kompilierung und macht die Vererbung eindeutiger. Allerdingssind Hierarchien in Anwendungsbereichen nicht immer baumformig,so dass diese Beschrankung manchmal zu streng ist. Das Verbot dermultiplen Vererbung kann Kopieren von Klassen und Methoden, oder eineetwas unnaturliche Klassenhierarchie erzwingen. In Java kann man zwarkeine Attribute, dafur aber Methodennamen uber Mehrfachvererbungweitergeben durch Verwendung von Interfaces.

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 Typcheckalgorithmusin der OOP analog zum Milner- Typcheck verwendet wurde. In Java kannman Listen von Objekten definieren, d.h. das sind eher heterogene Listen,wobei die Objekte in der Liste zu einer Unterklassen einer gemeinsamenOberklasse gehoren mussen.

Pointer und Adressrechnung .

1.2.10 Programmierhinweise

Die Erstellung eines Programms in einer OOP erfordert zunachst, dieAnwendung gedanklich so zu strukturieren, dass man die Klassenstrukturfestlegen kann. Diese Klassenstruktur sollte naturlich den Bereich derAnwendung moglichst gut modellieren, da man nur dann erwarten kann,dass das Programm sich robust bei Veranderungen verhalt. D.h. auch beiErweiterungen sollte die Klassenstruktur nur wenig geandert werden mussen.

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

Die Superklassen haben wenig Attribute und Methoden, die in der Hierarchieweiter unten stehenden Klassen haben mehr Attribute und Methoden.

1.2.11 Eigenschaften von Java

Automatische Speicherverwaltung Fur neu zu erzeugende Objekte wirdautomatisch Speicher bereitgestellt. Objekte, auf die es keine Referenzmehr gibt, werden automatisch (irgendwann) freigegeben (garbagecollection). 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 Aufrufen

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,....

Praktische Informatik 2, SS 2002, Kapitel 1 16

Java (SDK bzw. alt: JDK) hat eine Vielzahl von Sun mitgeliefertenBibliotheken, die die Programmierung erleichtern, aber auch fureinige Funktionalitaten notwendig sind. Applets kann man z.B. nurprogrammieren, wenn die entsprechenden Bibliotheken per importdazugeladen werden.

Portabilitat Es wird Wert darauf gelegt, dass die Ausfuhrung derProgramme auf allen Rechner und Rechnertypen gleichartig ablauft. Dienichtportablen Teile sind auf den jeweiligen Rechner installiert. In derProgrammiersprache selbst erfordert das, dass es keine rechnerspezifischenKonstrukte in der Programmiersprache gibt: z.B. Adressrechnungen, oderSystemzugriffe, die Betriebssystem-abhangig sind, o. a. Dies erfordert auchdie Angabe eine operationalen Semantik, die unabhangig vom benutztenRechner ist und die es ermoglicht, die Ergebnisse eines Programmseindeutig vorherzusagen.

Bytecode Der Kompiler erzeugt kein lauffahiges Programm, sondern eineninterpretierbaren String: den “Bytecode“. Dieser wird dann von einementsprechenden Interpreter ausgefuhrt. Dieser Bytecode ist portabel,d.h. auf allen Maschinen ablauffahig, vorausgesetzt, der entsprechendeInterpreter (JVM, Java Virtual Machine) ist dort installiert. DerInterpreter ist i.a. nicht portabel. Zwar entsteht durch das Interpretierenein Geschwindigkeitsnachteil gegenuber anderen Methoden, dies ist jedochkein Nachteil fur die Anwendungen, fur die Java entwickelt wurde, namlichsolche mit hohem Anteil an Netzwerk-Kommunikation und graphischerBenutzerinteraktion.

WWW Java ist u.a. konzipiert zur Programmierung von graphischen,interaktiven Programmstucken (sogenannten Applets), die von einemWWW-Browser auf der Client-Seite geladen und ausgefuhrt werdenkonnen (der Bytecode des Applets). Man kann allerdings auchnormale Programme (applications) damit schreiben, die dann von einemInterpreter ausgefuhrt werden konnen.

C++ - Ahnlichkeit Die Syntax von Java ist der von C++ sehr ahnlich,auch wenn bei der Entwicklung von Java darauf geachtet wurde, solcheEigenschaften zu vermeiden, die immer wieder Probleme verursachthaben. So gibt es keine Operationen zum expliziten Referenzieren oderDereferenzieren von Objekten oder Daten: primitive Daten werden immerdereferenziert verwendet und Objekte und Felder immer referenziert. D.h.,die sogenannte Adressrechnung ist in Java verboten

Sicherheit Das Fehlen von Referenzen und Zeigern, die vom Programmbeliebig manipuliert werden konnen, sowie die Einschrankung derZugriffsrechte fur Applets, die uber das Netzwerk kommen, tragen zurSicherheit von Java bei.

Praktische Informatik 2, SS 2002, Kapitel 1 17

Browser; Versionen Da Applets vom Server zum Client gesendet werdenund auf dessen Rechner bzw. in dessen Browser ablauffahig sein sollen,kommt es haufig dazu, dass Applets “zu modern“ sind, und auf dem altenBrowser nicht lauffahig sind. In diesem Falle kommt es i.a. nicht zu Fehlern,sondern es passiert einfach nichts, d.h. man sieht kein Applet. Hier gibt esteilweise unterschiedliches Verhalten in Microsofts Internet Explorer unddem Netscape Communicator.

1.3 Programmierung in Java

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 Klasse String ist nicht elementar, 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.

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

Praktische Informatik 2, SS 2002, Kapitel 1 18

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 Ausfuhrungeinen Wert haben. Diese konnen syntaktisch dort stehen, wo man auch einenentsprechenden Wert hinschreiben kann.

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

Der Auswahloperator: a ? b : c kann verwendet werden, umFallunterscheidungen bei der Ruckgabe von Werten leicht zu machen.Dies wirkt analog zum if. Der Auswahloperator erzeugt einen Ausdruck, keineAnweisungsfolge. Der Unterschied wirkt sich so aus, dass b,c in a ? b : ckeine Anweisungen sein durfen, sondern Ausdrucke sein mussen. (In Haskellgibt es diesen Unterschied nicht).

1.3.3 Anweisungen

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 2002, Kapitel 1 19

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)

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 Fallabschließen, konnen aber weggelassen werden.

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 Rumpfesspringen.

do-while

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

hat. Der Rumpf wird auf jeden Fall einmal ausgefuhrt.

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 Rumpfesspringen.

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 2002, Kapitel 1 20

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.

Konstruktoren

Die Konstruktion eines neuen Objektes mittels new erfordert bei derKlassendefinition eine spezielle Methode, den sogenannten Konstruktor, der dengleichen Namen wie die Klasse hat (Es kann verschiedene Konstruktoren geben,die Auswahl erfolgt abhangig von der Anzahl der Argumente). Wenn Attributesowohl in der Oberklasse als auch zusatzliche in der Unterklasse definiert sind,dann ist im Konstruktor der Zugriff auf den Konstruktor der Oberklasse mitsuper. moglich.

Felder

Felder (arrays) sind Folgen von Objekten gleichen Typs, die mit Indexangesprochen werden konnen. Diese konnen mehrdimensional (d.h. mitmehreren Indizes) definiert und benutzt werden. Wir betrachten zunachsteindimensionale 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 2002, Kapitel 1 21

1.3.4 Kommentare

Es gibt drei Arten von Kommentaren:

• Kommentar bis Zeilenende //

• Kommentare zwischen /* und */

• Kommentare zwischen /** und */ Die letzeren konnen mit javadocextrahiert und bearbeiten werden.

Kommentare der letzten Art werden vom Programm javadoc aus demProgrammtext 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 vargeoobjzugeordnet sein.

Erlaubt ist: var rechteck = (Rechteck) var geoobj . Hier kann es zueiner Ausnahme zur Laufzeit kommen, wenn das Objekt ein Kreis ist.

Diese Typkonversion bei Klassen dient im wesentlichen dazu, die Methodenvon Oberklassen verwendbar zu machen. Umgekehrt erlaubt es dieseTypkonversion, Objekte verschiedener Klassen zusammenzufassen z.B. in einemVector.

1.3.6 Ausnahmen, Exceptions

Java hat eine Behandlung von Exceptions (Ausnahmen), wie Fehler bei externenAufrufen, Division durch 0 usw.. Die zugehorigen Schlusselworter um mitExceptions umzugehen sind try, catch, throw. Fehler, die normalerweise zumAbbruch fuhren, kann man Abfangen mit catch, nachdem man die Anweisung,die Fehler liefern konnte, mit try eingepackt hat. throw dient zum Erzeugen vonprogrammierten Ausnahmen. Ein Abbruch wird erst dann erzeugt, wenn es eineAusnahmebedingung gibt, fur die keine Ausnahmebehandlung programmiert ist.

Praktische Informatik 2, SS 2002, Kapitel 1 22

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 wichtigsten sind public und private. Z.B. schreibt man normalerweise:

....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 benutztwerden darf. d.h. die Nachricht move(10,10) kann an ein Objekt derKlasse Rechteck gesendet werden.

• private bedeutet, dass die Attribute x,y,b,h nicht direkt geandert werdendurfen, und außerdem auch nicht abgefragt werden konnen. d.h. r.b istnicht zulassig.

Weitere Zugriffsrechte gibt es im Zusammenhang mit packages, die ein Paketvon Klassen sind.

1.3.8 Modifikatoren

• static: Ein als statisch gekennzeichnetes Attribut existiert in allenObjekten der ganzen Klasse nur einmal. Fur Attribute wirkt dies wiedie Erklarung zu einer globalen Variable fur diese Klasse. Hier kann manz.B. die Anzahl aller Objekte sich merken, oder eine Liste aller Objektemitfuhren. Allerdings ist das in Konkurrenz zum Garbage Collector, dernichtreferenzierte Objekte loschen darf. Durch die pure Anwesenheit indieser Liste werden die Objekte dann referenziert. Diese Klassen-Attributekann man ansprechen, ohne dass ein Objekt erzeugt wurde.

Statische Methoden kann man als “Klassenmethoden“ ansehen, die manbenutzen kann, ohne dass ein Objekt vorhanden ist, d.h. die Variable thiskann darin nicht verwendet werden. Die zugehorigen Methoden konnenbenutzt werden, ohne dass ein Objekt existiert, indem man diese aufruftmit: Klassenname. Methodenname.

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

Praktische Informatik 2, SS 2002, Kapitel 1 23

• final: Bewirkt, angewandt auf eine Datenkomponente, dass deren Wertals nicht uberschreibbar angesehen wird. Damit kann Java einerseits festeKonstanten definieren, andererseits Oberklassen und Methoden, die nichtdurch Unterklassen verandert (erweitert) werden durfen.

Beispiel 1.3.4 Dieses Beispiel zeigt einige Moglichkeiten, Klassen zudefinieren und deren Instanzen zu erzeugen. Allerdings ist dies kein Applet,sondern ein 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;

private static long Anzahl;

static {Anzahl = 0;

}

Praktische Informatik 2, SS 2002, Kapitel 1 24

// Folgendes scheint nicht mehr unterst"utzt zu werden:// protected void finalize () throws Throwable {// super.finalize();// Anzahl--;// }

public static long Anzahl() {return Anzahl;

}

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;public Auto(double Hoechstgeschwindigkeit,

String Eigentuemer, String kennzeichen) {

Praktische Informatik 2, SS 2002, Kapitel 1 25

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());

System.out.println("Richtung(boot): " +

Praktische Informatik 2, SS 2002, Kapitel 1 26

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 Anwendungenschreiben:

Applets Dazu muss im Programmcode die import-Anweisung importjava.applet.*; stehen. Der Name der Datei und der definiertenKlasse, die die ausgefuhrte Klasse des Applets ist, solltenubereinstimmen. Diese ausgezeichnete Klasse muss eine Unterklassevon Applet sein. d.h. die Klasse wird definiert durch z.B.public class geoobjtest extends Applet { .... Hierdurch sindautomatisch zwei Methoden definiert, die fur die Klasse uberschriebenwerden sollten: init(), paint (Graphics g) (Bezieht sich aufEreignismodell 1.0). Das Applet kann dann in einer HTML-Dateiaufgerufen werden mit dem Schlusselwort applet (man kann auch embedoder objectverwenden, siehe Java bzw. HTML-Dokumentation.) BeiAufruf der Hauptklasse werden diese aufgerufen und erzeugen dann eine

Praktische Informatik 2, SS 2002, Kapitel 1 27

entsprechende Zeichnung bzw. interaktive graphische Anwendung. Wieoben schon erwahnt, hat ein Applet normalerweise Beschrankungen beimZugriff auf Files der Festplatte des Klienten.

Zur Laufzeit ist das Applet jeweils in einen Kontext eingebunden, derplattformabhangig ist und den dort installierten Teil des Laufzeit-APIverwendet.

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.

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;}

}

// 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) {

Praktische Informatik 2, SS 2002, Kapitel 1 28

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;

}}

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) {

Praktische Informatik 2, SS 2002, Kapitel 1 29

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);

}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 bietensogenannte “Interfaces“. Diese bindet man in die Definition der Klassemittels extends .... implements interface1, interface2, ... ein.Damit kann man z.B. eine nebenlaufige Berechnung erzeugen (bzw. eineneigenstandigen 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 (...);

Praktische Informatik 2, SS 2002, Kapitel 1 30

}

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

Beispiel 1.3.6 Die Schnittstelle Comparable definiert eine totaleOrdnungsbeziehung.

... 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, Ausdruckebestimmter Typen mit <,≤, >,≥ zu vergleichen.

1.3.11 Klassenbibliotheken in Java

Java strukturiert vordefinierte Mengen von Klassen in Pakete. Diese gehorenzum application programming interface (API).

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).

Praktische Informatik 2, SS 2002, Kapitel 1 31

1.3.12 Mathematische Bibliothek

public final class MathDie Klasse Math kann keine Unterklassen haben, und somit kann keineMethode uberschrieben werden. Alle Methoden und Variablen sind static.Die Ausnahmebehandlung wie Uberlauf, Division durch 0, usw. werden aufverschiedenen Plattformen moglicherweise verschieden gehandhabt (d.h. nichtportabel).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 oderMultimengen von Objekten zu verwalten. Logisch gesehen kann manunterscheiden zwischen: Listen, Mengen, Multimengen, Assoziationslisten

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 indizierteDatenbank. 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 Verpackung

Praktische Informatik 2, SS 2002, Kapitel 1 32

dieser 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();.

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.void remove()

Typische Verwendung in einem Programm:

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

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

1.3.14 Nebenlaufige Berechnung: Threads

In Java kann man Unterprozesse anstoßen, sogenannte Threads(Berechnungsfaden), die logisch parallel arbeiten. Diese kann man definieren alsKlasse, die Unterklasse von Thread ist, oder mittels der Schnittstelle Runnable.Die einzige Methode dieser Schnittstelle ist run(). Einige Methoden zu Threadssind:

start() startet einen Thread, falls als Unterklasse vonThread definiert. Nach dem Start des Threadslaufen zwei Programmteile parallel. Die Anweisungendes Threads werden ausgefuhrt. Ebenso wird mitder nachsten Anweisung, die dem start(); folgt,fortgefahren.

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 {

Praktische Informatik 2, SS 2002, Kapitel 1 33

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 ");}

}}

}public class ThreadDemo1 {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. Beachte, dass diese nicht ganzdeterministisch 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 : 6

Praktische Informatik 2, SS 2002, Kapitel 1 34

Thread: 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.4 Graphische Programmierung (GUIs:graphical 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 verschiedenerEingabekanale: Eingabekanale von Benutzerseite sind meist die Tastatur undeine Maus mit 1,2 oder 3 Tasten, manchmal noch weitere wie Touchscreen,Joystick, usw.

Es gibt eine Vielzahl von graphischen Elementen, die verwendetwerden konnen: Fenster mit Schiebeleisten, waagrechte/senkrechte Menus,Radioknopfe, Symbole zum Anklicken (Icons), Textfelder usw.

Die Verbreitung von GUIs startete vor ca. 20 Jahren. Zu diesem Zeitpunktwar die Verwendung von zeichenbasierten Bildschirmen und Interaktionmit Kommandoeingabe in eine Kommandozeile vorherrschend. Auch jetztgibt es diesen Modus der Interaktion noch als Basis, z.B. bei PC alsDOS Kommandozeile, oder als Kommandozeile bei Unix. Bei Großrechnern(Mainframes) ist dies noch der interne Standard, obwohl auch hier graphischeBenutzeroberflachen in vielen Fallen zur Interaktion mit dem Rechner verwendetwerden.

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 menschlichen

Praktische Informatik 2, SS 2002, Kapitel 1 35

Wahrnehmung entgegen, die eher an Bildern orientiert ist.Moglich wurden die graphischen Oberflachen erst durch schnelle Rechner

und großere Speicher, die eine schnelle Verarbeitung und Darstellungermoglichten. Vorganger waren Großrechner mit teilweise mehr als 1000Bildschirme an einem Zentralrechner, die weitgehend passiv waren. In dieserKonstellation sind graphische Benutzeroberflachen so gut wie unmoglich,da die Rechenkapazitat zur Steuerung einer graphischen Benutzeroberflachenicht lokal ist und evtl. von zu vielen Benutzern in Anspruch genommenwird. Heutige Standardkonstellation ist Anschluss an ein Netzwerk (Internet)und lokale (Rechen+Speicher)- Kapazitat zur Steuerung der graphischeBenutzeroberflache.

1.4.1 Programmierung, Ereignissteuerung

Im Gegensatz zur Verwendung einer Kommandozeile, bei der ein entsprechendesProgramm genau den Inhalt (einen String) der Kommandozeile siehtund entsprechend verarbeitet, muss eine programmierte graphischeBenutzeroberflache und entsprechend die Anwendungsprogramme mit einerMehrzahl von Interaktionen und auch Eingabemoglichkeiten umgehen konnen.

Z.B. muss ein Textverarbeitungsprogramm unter GUI i.a. die Markierungeines Textstuckes ermoglichen. Dazu notwendig sind: Das Programm musswissen, was im Moment sichtbar ist, es muss herausfinden, wo die Maustastegedruckt wurde, wohin sie gezogen wurde und wo die Maustaste wiederlosgelassen 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 teilweise 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 neueren Version von Java-Swing ist die Plattform-unabhangigkeit vollstandig gewahrleistet.

1.4.2 GUIs in Java (Ereignismodell 1.0

Betrachten wir jetzt mal die Moglichkeiten in Java. Normalerweise ist diegraphische Anwendung ein Applet, das durch eine Klasse definiert wird, diezur Unterklasse von applet erklart wird.

Das Bild, das der Benutzer sieht, stellen wir uns vor als einen flachen,graphischen und farbigen Bildschirm, der aus ca. 1000 X 1000 Bildpunkten,sogenannten Pixeln besteht. Dies ergibt in naturlicher Weise ein CartesischesKoordinatensystem, das jeden Punkt in der Form (x,y) ansprechbar macht.Normalerweise gibt es einen Cursor, das ist eine aktuelle Position der Tastaturund einer Mausposition, die sich innerhalb der Flache befinden.

Praktische Informatik 2, SS 2002, Kapitel 1 36

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

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 werden.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

hintereinander 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 verursachtenEreignisse action(), gotFocus(), keyDown(), mouseDown(),mouseEnter(), mouseUp(), handleEvent(), postEvent(), ....

Praktische Informatik 2, SS 2002, Kapitel 1 37

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 Oberflachesichtbare als Modell moglichst vollstandig in Datenstrukturen ablegen, damitdas sichtbare Bild rekonstruierbar ist und damit der Benutzer und dasProgramm die 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 undgutes Strukturieren. Zum Beispiel ist im nachfolgenden Zeichenprogrammextra Aufwand getrieben worden, um wahrend des Zeichnens dieaktuelle Strecke(Ellipse) sichtbar zu machen. Analog verhalt es sich mitFehlermeldungen. Um diese richtig zuzuordnen und zu formulieren, sollte mansich in die Rolle eines Benutzer versetzen, der keine Ahnung von der internenVerarbeitung hat, und der nicht abgeschreckt 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.

Praktische Informatik 2, SS 2002, Kapitel 1 38

// 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();

}

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;

Praktische Informatik 2, SS 2002, Kapitel 1 39

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;

}

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;

Praktische Informatik 2, SS 2002, Kapitel 1 40

}}

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)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);

else

Praktische Informatik 2, SS 2002, Kapitel 1 41

g.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");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;

}}

Praktische Informatik 2, SS 2002, Kapitel 1 42

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 dassProgramme von Hand umgestellt werden mussen. Die Strukturierung imEreignis-Modell 1.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 einenBeobachter gesendet (Listener).

3. Dieser Beobachter (Methode) enthalt die Programmierung, was nachEintreten dieses Ereignisses zu verfahren ist.

Die Programmierung erfolgt so, dass an bestimmte Quell-Objekte einenListener eingetragen wird, der selbst zu definieren ist. Statt handleEvent gibtes fur jedes Ereignis eine eigene Methode.

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 Modell 1.0 wurden (werden) die Ereignisse relativ ungezielt an dieAnwendungsprogramme weitergegeben (Gießkannenprinzip), wahrend im neuenModell diese Verteilung programmgesteuert ist. Nachteil des neuen Modells istdie Verwirrung durch die zeitweise Koexistenz zweier Standards, wobei der neueStandard in Browsern nur abhangig von der Version und den richtigen Pluginsfunktioniert (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 () {

Praktische Informatik 2, SS 2002, Kapitel 1 43

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 objektorientiertenProgrammierung

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

• “OO-Sprachen kennen keine Komposition von Klassen“Allgemeiner: Es gibt keine Operatoren, die Klassen zu neuen Klassenverbinden. Es gibt nur die Vererbungsbeziehung zwischen Klassen.Man kann manche Kompositions-Konzepte mittels multipler Vererbungimplementieren.

• “Das OO-Ausfuhrungsmodell ist sequentiell“Hierbei gibt es die Problematik der Seiteneffekte. Es ist schwierig undkomplex, aufgrund von lokalen Eigenschaften der Programme (Methoden)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 vonSchnittstellen definieren sollen“Mit Schnittstellen sind hier nicht Interfaces gemeint. Sagen wir malMethodenaufruf. 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.

Praktische Informatik 2, SS 2002, Kapitel 1 44

• “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,aber das neue musste Anderungen in der bestehenden Hierarchie, denAttributen, Methoden durchfuhren. Diese bewirkt aber moglicherweiseFehler im vorhandenen System, muss also sehr vorsichtig gemacht werden,und ist somit viel aufwendiger als das Kopieren und Modifizieren, d.h.Neu-erstellen der Klassen fur die Zwecke des neuen Projekts.

• “Multiple Dispatching“ fehltDie aufgerufene Methodenimplementierung hangt ab vom Typ zweierArgumente.Dies erfordert in OO-Programmierung, dass in jeder Klasse (Typ desArgument1) die Implementierung (bzw. ein entsprechender Aufruf) furjeden moglichen Typ von Argument2 vorhanden ist.

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

1. aufgrund der Seiteneffekte i.a. nur durch vollstandiges formalesTesten moglich ist.

2. wieder einen Methodenaufruf auf das gleiche Objekt x erfordertkonnte. Dies ist analog zur Rekursion. Hier kann es imExtremfall bedeuten, dass man nicht davon ausgehen kann,dass Methodenaufrufe auf Objekte immer auf Objekte in einemkonsistenten Zustand passieren, sondern dass es auch unerwarteteZwischenzustande geben kann.