Übungsbeginn: 17.4. (B-Woche) bzw. 23.4. (A-Woche) Erstes Übungsblatt: 11.4. im Netz (Lernserver) Abgabe der Lösungen jeweils 2 Wochen nach Ausgabe, 5 Minuten vor der Vorlesung Ausnahme: erste Abgabe erst am 2.5. Übungsschein: mindestens 60% der erreichbaren Punkte Prüfungsklausur im Juli, Termin wird noch bekannt gegeben Zulassungsbedingungen: (1) Übungsschein ´Digitale Informationsverarbeitung´ und (2) Übungsschein ´Programmierung und Programmiersprachen´ Organisatorisches Programmierung und Programmiersprachen Dr. Claudia Leopold Institut für Informatik Abt. Parallelverarbeitung und Komplexe Systeme Webseite zur Vorlesung (über Lernserver erreichbar): http://www.informatik.uni-leipzig.de/~leopold/grundPS.html [email protected]Hauptgebäude, Zi. 2-40
106
Embed
Programmierung und Programmiersprachen - IfI: Startseitegraebe/vorlesungen/pps/Leopold/Folien.pdf · Objektorientiert mit Java, Springer-Verlag, 2000, Kapitel 3,7,8. Bernd Oesterreich:
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Übungsbeginn: 17.4. (B-Woche) bzw. 23.4. (A-Woche)Erstes Übungsblatt: 11.4. im Netz (Lernserver)Abgabe der Lösungen jeweils 2 Wochen nach Ausgabe,5 Minuten vor der Vorlesung
Ausnahme: erste Abgabe erst am 2.5.
Übungsschein: mindestens 60% der erreichbarenPunkte
Prüfungsklausur
im Juli, Termin wird noch bekannt gegebenZulassungsbedingungen:
(1) Übungsschein ´Digitale Informationsverarbeitung´ und(2) Übungsschein ´Programmierung und Programmiersprachen´
Organisatorisches
Programmierung und Programmiersprachen
Dr. Claudia LeopoldInstitut für Informatik
Abt. Parallelverarbeitung undKomplexe Systeme
Webseite zur Vorlesung (über Lernserver erreichbar):http://www.informatik.uni-leipzig.de/~leopold/grundPS.html
Implementierungsdetails nur innerhalb desObjektes sichtbar -> Implementierung kann ohneAnpassung der übrigen Programmteile geändertwerden (bei gleicher Signatur)
Erleichtert Debugging, da Fehler besser lokalisierbar
Klasse= Zusammenfassung gleichartiger Objekte
gleiche Attribute, aber unterschiedliche Attributwerte
gleiche Methoden
Klasse umfaßt
Attribute, aber keine Attributwerte (Ausnahme: Klassenvariablen)
Methoden
Objekte
Osterei Klasse
Nachrichten
Aufbau einer Nachricht
Empfänger Methodenname Argumente
Beispiele: rect.move(20,0), rect.delete()
Senden einer Nachricht bewirkt Aufruf der entsprechendenMethode des Zielobjektes
Nachrichtenaustausch dient
Übermittlung von Informationen
Inanspruchnahme von Diensten (Client/Server)
Instanzierung
Vorgehen bei objektorientierter Programmierung:
1. Definition einer Klasseeinschließlich Implementierung der Methoden
2. Instanzierung
= ´Ableiten´ von Objekten aus der Klasse
Attribute werden angelegt und initialisiert (zumBeispiel mit default-Werten)
= Definition von Methoden mit gleichem Namen,aber unterschiedlicher Signatur
Beispiel:
public void scale(factor: float) {x = x * factor; y = y * factor;
}
public void scale(factorX: float, factorY: float) {x = x * factorX; y = y * factorY;
}
Aufruf bewirkt Ausführung der Methode mit denpassenden Parametern
scale(1.3) vs. scale(1.2, 3.7)
Überschreiben von Methoden
In der Oberklasse bereits implementierte Methoden könnenin der Unterklasse mit einer neuen Implementierungüberschrieben werden (engl.: override).
Beide Methoden haben dann den gleichen Namen und diegleiche Signatur.
Beispiel:Reimplementierung der Methode draw in coloredRectangle
Aufruf der Methode bewirkt:Für Objekte der Oberklasse wird die Methode der Oberklasseausgeführt.Für Objekte der Unterklasse wird die Methode der Unterklasseausgeführt.
Dynamische Polymorphie
Variable kann für Objekte verschiedener Klassenstehen, sofern eine - eventuell mehrstufige -Vererbungsbeziehung besteht .
Beispiel:
rect: Rectangle;
rect := new Rectangle();rect.draw(); - Aufruf der Methode aus Klasse Rectangle
rect := new coloredRectangle();rect.draw(); - Aufruf der Methode aus Klasse coloredRectangle
Polymorphie (Vielgestaltigkeit)
= Methode (gegeben durch Name) kann sich an Kontextanpassen
Unterscheiden:
statische Polymorphie (Überladen)
auch in nicht-objektorientierten Sprachen, z.B. ´/´ für intund float
dynamische Polymorphie (Überschreiben)
Verhalten der Methode sollte nur angepaßt, aber nichtgrundsätzlich geändert werden (Gefahr von Programmier-fehlern)
Arbeiten mit Objekten
Allgemeine Operationen für Objekte:Erzeugen
Vergleich
Zuweisung
evtl. Löschen (z.B. in C++)
Erzeugenvon Objekten:
durch Konstruktor = spezielle Methode der jeweiligenKlasse
eventuell überladen
in Java existiert impliziter Konstruktor
Dynamische Bindung
= Verknüpfung zwischen Methodenaufruf undauszuführendem Programmcode erfolgt erst zur Laufzeit
Statische Bindung = Verknüpfung erfolgt zurÜbersetzungszeit, durch den Compiler
Firma Person0..1 0..*beschäftigtarbeitgeber arbeitnehmer
Firma Person0..1 0..*beschäftigt
arbeitet bei
PPS 1.2-7
Methodenaufrufe bei Aggregationen
Typische Programmstruktur:
Methoden zur Zusammenarbeit mit anderen (´fremden´)Objekten werden vom Gesamtobjekt zur Verfügunggestellt
Der Aufruf einer solchen Methode bewirkt den Aufrufgeeigneter Methoden der Teilobjekte.
Dazu enthält die Implementierung der Methode desGesamtobjekts entsprechende Methodenaufrufe an dieTeilobjekte. (im Klassendiagramm nicht sichtbar)
PPS 1.2-10
Beispiel: Der Warenwert eines Einkaufskorbes berechnet sich alsSumme der Einzelpreise.
Komposition
Spezialfall der Aggregation, bei dem die Einzelteile vomAggregat existenzabhängig sind
Markierung durch ausgefüllte Raute
PPS 1.2-9
hatVorderseite
Zettel 1
Rückseite
hat1
1
1
Mehrgliedrige Assoziation
PPS 1.2-12
Zug
datumzugnummer
Platz
wagennrplatznr
Fahrgast
name
1 1..*
1..*
Reservierung
Assoziationen zwischen > 3 Klassen analog
Gleiche Klasse kann mehrfach an einer Assoziationbeteiligt sein
Rekursive Assoziation
PPS 1.2-11
Direkte Rekursion: Mitarbeitersachbearbeiter
manager
*
1
Indirekte Rekursion:
führt
namezimmernummer
Patient
Person
*
hat
familien-angehöriger
1
Attributierte Assoziation
Assoziation, der Eigenschaften zugeordnet sind
diese Eigenschaften charakterisieren weder die eine nochdie andere Klasse, sondern die Assoziation selbst
Modellierung durch Assoziationsklasse
PPS 1.2-14
Unternehmenname
anschrift
Mitarbeitername
anschrift
1..*1..*
Arbeitsverhältnis
von: Datumbis: Datum
Implementierung von Assoziationen
meist mittels Attributen in den beteiligten Klassen
häufig: Attributname = Rollenname in der Assoziation
gegebenenfalls Verwendung von Arrays oder anderenSammlungsklassen
PPS 1.2-13
Person Schrank1 0..*besitzteigentümer
class Person{
...Schrank[] einrichtung;...
}
class Schrank{
...Person eigentümer;...
}
einrichtung
Vererbung - Notation
PPS 1.2-16
Unterklasse5Unterklasse1
Oberklasse
Unterklasse3Unterklasse2 Unterklasse4
Diskriminator1 Diskriminator3
Diskriminator2
Diskriminator muss nicht angegeben werden
auch bei gleichem Diskriminator sind Einzelpfeilezulässig
Vererbung
auch: Ist-BeziehungUnterklasse ist Spezialisierung der Oberklasse
Objekte abgeleiteter Klassen sollen jederzeit anstelle vonObjekten ihrer Basisklasse eingesetzt werden können
Oberklasse ist Generalisierung der UnterklasseUnterscheidungsmerkmal zwischen Ober- und Unterklasse:DiskriminatorDiskriminator ist ´virtuelles Attribut´ (durch Zugehörigkeitzur einen oder anderen Unterklasse wird eine Eigenschaftdes Objekts beschrieben)Zuordnung der Attribute und Methoden zur Ober- oderUnterklasse sollte nach inhaltlichen Gesichtspunktenerfolgen (nicht: maximale Wiederverwendung)
PPS 1.2-15
Quadrat/Rechteck-Problem I
PPS 1.2-18
Nachteile:
Redundanz (b ist überflüssig)
Zusicherung verwendet Attributeder Oberklasse -> Einhaltungdurch Methoden der Oberklassenicht garantiert (Zusicherungdort nicht bekannt)
Beste Variante, hat trotzdem Nachteilder Redundanz
Günstig: Keine Unterscheidung zwischenRechtecken, die aufgrund ihrer Kantenlänge ´zufällig´Quadrate sind und´richtigen´ (entsprechend klassifizierten) Quadraten
Rechtecka {a>0}b {b>0}
setKanten(a,b)anzeigen()entfernen()
isQuadrat():bool
Quadrat/Rechteck-Problem II
PPS 1.2-19
Quadrata {a>0}
setA(na)anzeigen()entfernen()
Rechteck
b {b>0}setB(nb)
anzeigen()entfernen()
Nachteile:
ex. kein Diskriminator
Zuweisung q=r ist zulässig, aberinhaltlich nicht sinnvoll
sequenzausdruck beschreibt Reihenfolge der NachrichtenNachrichten, die während der Bearbeitung der Nachricht Nummer xgesendet werden, erhalten Nummern x.1, x.2 usw.
vorgängerBedingung ist Aufzählung der Nachrichten, dievorher gesendet werden müssen (Bsp. 2.3, 3.1/ 4.2:)
´*´ bezeichnet wiederholtes Senden der gleichenNachricht
Paralleles Senden: 1.2.*||[i:=1..n]:
Bedingtes Senden: 1.2.* [i>5]:
PPS 1.2-34
PPS 1.2-33
Kollaborationsdiagramm - Beispiel
... :Reservierung
:Bestellung
:Bestell-position
1:reserviere(b)
1.1.*[i=1..*]: bpos:=gibBestellPos()
parameter b<< >>
1.1.1: artikel:=gibArtikel()
:Lager1.1.2: anzahl:=gibAnzahl()
1.1.3: bpos:=reserviere(artikel,anzahl)
local bpos<< >>
Sequenzdiagramm - Beispiel
PPS 1.2-36
:Reservierung b:Bestellung bpos:Bestell-position
:Lager
reserviere(b)* gibBestellPos()
bpos
* gibArtikel()
* gibAnzahl()
reserviere(artikel, anzahl)
artikel
anzahl
Sequenzdiagramm
stellt gleiche Information wie Kollaborationsdiagrammdar, aber mit Betonung des zeitlichen Ablaufs
PPS 1.2-35
objekt 1
objekt 2new()
delete()
nachricht()
antwort
objekt 1
Selbstdelegation
Zusammenfassung Modellierung
wird überwiegend in Analyse/Design-Phasen eingesetzt
objektorientierte Modellierung ist eine Form derModellierung
Modelle sind abstrakte Beschreibungen
der realen Welt
existierender Software
zu konstruierender Software
verschiedene Modelltypen beschreiben verschiedeneAspekte des Systems und ergänzen einander
Vorgehensmodell bestimmt, welche Modelltypen inwelcher Reihenfolge wie detailliert erstellt werden(nicht Bestandteil der UML)
PPS 1.2-38
Formen des Nachrichtenaustauschs
Synchronmit Rückantwort (auch: sequentiell, Normalfall in
Erstellen der Datei Hello.javapublic class Hello {
public static void main(String args[]) {System.out.println("Hello World!");
}}
Übersetzen des Quelltextesjavac Hello.java -> Hello.class
Ausführen des Programmsjava Hello
PPS 1.3-6
Das JVM-Konzept
PPS 1.3-5
Programm
Bytecode
Compiler (javac)
Interpreter (java)Just-In-Time Compiler
Rechner Rechner
Interpreter(JIT Compiler)
Lexikalische Elemente 2
PPS 1.3-8
Kommentare// Einzeiliger Kommentar bis Zeilenende
/* MehrzeiligeKommentare dürfen nicht geschachteltwerden */
/*** Dokumentationskommentare für javadoc* beschreiben Methoden etc. verbal und kennzeichnen* Parameter und Rückgabewerte.* <i> HTML </i> ist zulässig.* /
Weitere Unterschiede zu C:Kein Präprozessor -> kein #define, #include, #ifdef
Zeilen können nicht mit \ verkettet werden
Lexikalische Elemente 1
Unicode
Zeichen werden in 2 Byte kodiert
Kompatibel zu ASCII-Zeichensatz
char/String-Konstanten sowie Bezeichner im Programm dürfenUmlaute und Sonderzeichen enthalten
Bsp.: übertrag und \u00FCbertrag sind identisch
PPS 1.3-7
Bezeichner
sollten mit Buchstabe, dürfen auch mit ´_´ oder ´$´ beginnen
Schlüsselwörter sind nicht zulässig
Klassennamen groß, z.B. EineKlasse
Variablen-, Attribut- und Methodennamen klein, z.B. eineMethode
Konstantennamen vollständig groß, z.B. LIMIT
C- vs Java-Datentypen
PPS 1.3-10
in Java nicht vorhanden:
Zeiger
Aufzählungstypen (enum)
Verbundtypen (struct und union)
Bitfelder
Typdefinitionen
sizeof-Operator
unsigned, short int, long int
Neu in JavabooleanNaN = Not A Number (undefiniert, entsteht bei Division durch 0)
POSITIVE_INFINITY, NEGATIVE_INFINITY
Primitive Datentypen
PPS 1.3-9
Variablen haben stets einen definierten Wert:
Attribute werden mit 0 (bzw. 0.0 etc.) initialisiert
Lokale Variablen -> Datenflußanalyse durch Compiler
boolean
char
byte
short
int
long
float
double
1 bit
16 bits
8 bits
16 bits
32 bits
64 bits
32 bits
64 bits
true, false
Unicode-Zeichen
ganze Zahl m. Vorz.
- " -
- " -
- " -
Fließkommazahl
- " -
Zeichenketten
Zeichenketten sind Objekte der Klassenjava.lang.String - konstante Zeichenketten, oderjava.lang.StringBuffer - veränderliche Zeichenketten
StringBuffer s2 = new StringBuffer("Zeichenkette");
Verkettung und Automatische Konvertierung:for (int i=1; i<10; i++)
System.out.println(s1+i+"-te"+s2);
Methoden für String: length(), charAt(), equals(), etc.
Methoden für StringBuffer: length(), append(), insert(), etc.
ArraysArrays sind spezielle Objekte -> werden zur Laufzeit mit newerzeugtLänge wird beim Erzeugen (zur Laufzeit!) festgelegt und kanndanach nicht mehr verändert werdenZur Laufzeit geprüft: 0 <= indexausdruck < array.lengthAutomatische InitialisierungBilden von Unterklassen nicht möglichIndextyp ist int
PPS 1.3-11
int[] a;a = new int[100];
Bsp. 1:
boolean[][] b;b = new boolean[n][m];
Bsp. 2:
//Deklaration// Erzeugung
int[] a = {5,9,2,3};int[][] b= { {0}, {1,2}, {1,2,3} }
Bsp. 3:
Ausdrücke und Operatoren
Ähnlich C:
Arithmetische Operatoren
Vergleichsoperatoren (Ergebnistyp boolean, auch fürObjekte)
Java verwendet call-by-value (Wertübergabe)Primitive Datentypen können nicht verändert werden
bei Objekten können nur Attribute verändert werden, nichtdas Objekt selbst
Lokale Zuweisungen können durch final verboten werden
PPS 1.4-6
void beispiel (int number, final int number2, Point punkt) {number = 7;// außerhalb der Methode nicht geändertnumber2 = 8; // Fehlermeldungpunkt.x = 3; // Änderung auch außerhalbpunkt = new Point(); // außerhalb keine Änderungpunkt.x = 5;// außerhalb keine Änderung
}
Instanzvariablen und -methoden
In Java können nur Methoden Programmcode enthalten;globale Funktionen (wie in C) gibt es nicht
Im Gegensatz zu Funktionen beziehen sichInstanzmethoden stets auf ein Objekt und damit aufaktuelle Attributwerte
PPS 1.4-5
Zugriff auf Instanzvariablen und -methoden erfolgtdurch Anwendung des Punkt-Operators auf das Objekt,z.B. punktA.color, punktA.moveTo(3,4)
Zur Unterscheidung von Klassenvariablen/-methodenwerden Attribute in Java häufig als Instanzvariablen undMethoden als Instanzmethoden bezeichnet
Konstruktoren
PPS 1.4-8
Konstruktoren haben den gleichen Namen wie die Klasse
Konstruktoren haben keinen Ergebnistyp
In einer Klasse können mehrere (überladene)Konstruktoren definiert sein
Falls ein Konstruktor einen anderen Konstruktor aufruft,so muß dieser Aufruf die erste Anweisung desKonstruktors sein
Ist für eine Klasse kein Konstruktor definiert, so wird einimpliziter Konstruktor verwendet
Arrays als Parameter
Bei formalen Parametern kann die Länge des Arrays offengelassen werden:
PPS 1.4-7
int sum(int[] a) {int erg = 0;for (int i=0; i<a.length; i++)
erg += a[i];return erg;
}
int [] myFeld;myFeld = new int[10];int sum = sum(myFeld);
Beispiel: Konstruktoren
class Point {
int x, y, color;
Point(int x, int y) {
this.x = x; this.y = y; color = 0;
}
Point(int x, int y, int color) {
this(x,y); this.color = color;
}
}
PPS 1.4-10
Das Schlüsselwort this
this ist einVerweis auf das aktuelle Objekt
Verwendung:
Aufruf einer Methode mit dem aktuellen Objekt alsParameter, z.B.
alle Klassen sind Nachfahren der Klasse java.lang.Object
Zugriff auf Oberklasse durch Schlüsselwort super
(Zugriff auf Konstruktoren und überschriebene Methoden)
PPS 1.4-14
public class BlinkingPoint extends Point {boolean blinkt;public void blinkenAus() {blinkt = false;}public BlinkingPoint(int x, int y) {
super(x,y);this.blinkt = false;
}}
Initialisierung von Klassenvariablen
Klassenvariablen werden bei der Deklaration oder durchstatische Konstruktoren initialisiert
In beiden Fällen erfolgt die Wertzuweisung beim Ladender Klasse
Initialisierungen werden in textueller Reihenfolgeausgeführt
PPS 1.4-13
class Beispiel {
static int i=3;
static int j;
static {
j=3*i;
}
Vererbung und ÜberladenÜberladene Methoden müssen sich in den Parametern(nicht nur im Ergebnistyp) voneinander unterscheiden
Die Auswahl der Methode erfolgt zur Übersetzungszeit
Falls eindeutig bestimmt, wird die Methode mit denpassenden Parametern (Anzahl, Typ) ausgewählt
Falls die Parameter verschiedener Methoden inVererbungsbeziehung zueinander stehen oderanderweitig eine Typkonvertierung möglich ist, wird dieMethode mit den speziellsten Parametern ausgewählt
PPS 1.4-16
// Son sei Unterklasse von FatherSon son = new Son();public void test (Father father) {...};public void test (Son son) {...};test(son); // bewirkt Aufruf der Son-Variante
Vererbung und Konstruktoren
1) Anlegen des Speicherbereiches, Initialisieren mit 02) Aufruf des passenden Konstruktors, dabei rekursiveAnwendung der folgenden Regeln:
a) Falls der Konstruktor mit einem Aufruf von super (oder this)beginnt, zunächst Aufruf des entsprechenden Konstruktorsb) Falls a) nicht zutrifft und die Oberklasse keinen explizitenKonstruktor enthält, Aufruf des Default-Konstruktors derOberklassec) Falls a), b) nicht zutrifft und die Oberklasse einenparameterlosen Konstruktor enthält, Aufruf diesesKonstruktorsd) Falls a), b), c) nicht zutrifft -> Fehlermeldung
3) Initialisierung der Attribute und lokalen Variablen desKonstruktors, falls Deklaration mit Zuweisung verbunden4) Ausführung der Anweisungen des Konstruktors
PPS 1.4-15
Beispiel 2 zum Überladen
public class Bsp {public static void main(String args[]) {
Son son = new Son();Aufrufer aufrufer = new Aufrufer();aufrufer.test(son);
}}
PPS 1.4-18
public class Aufrufer {public void test(Father father) {...}
// Bei nachträglichem Hinzufügen ohne Neuübersetzung von// Bsp.java nicht berücksichtigt:public void test(Son son) {...}
}
Beispiel 1 zum Überladen
public class Bsp {public static void main(String args[]) {
Son son = new Son(); // Son sei Unterklasse von FatherFather father = son;Aufrufer aufrufer = new Aufrufer();aufrufer.test(father);
}}
PPS 1.4-17
public class Aufrufer {public void test(Son son) {...} // Son-Variantepublic void test(Father father) {...} // Father-Variante
}
Auswahl der Methode zur Übersetzungszeit-> Auswahl nach statischem Typ-> Es wird die Father-Variante von test aufgerufen
Beispiele zum Überdecken
PPS 1.4-20
class Point {int x, y, color;...
}class RealPoint extends Point {
float x, y, color;int i = super.x;...
}
RealPoint rp = new RealPoint();Point p = rp;float f = rp.x;int i = p.x; // Auswahl laut statischem Typ
Bsp.1
Bsp.2
Überdecken von Variablen
Vererbung kann zum Überdecken von Instanzvariablenführen
PPS 1.4-19
class Point {int x, y, color;...
}class RealPoint extends Point {
float x, y, color;...
}
Überdeckte Variablen sind lebendig, aber nicht sichtbar
Zugriff durch super möglich
Auswahl erfolgt zur Übersetzungszeit (laut statischem Typ)
Überdecken von Variablen sollte vermieden werden
Beispiel 1 zur Typkonvertierung
Zugriff auf Methoden und Attribute, die nur in derUnterklasse definiert sind
PPS 1.4-22
class BlinkingPoint extends Point {boolean blinkt;public void blinkenAus() {...}
}...BlinkingPoint bp = new BlinkingPoint();Point p = bp;if (((BlinkingPoint) p).blinkt)
((BlinkingPoint) p).blinkenAus();
Typkonvertierung für Objekte
Änderung des für den Compiler relevanten Typs
PPS 1.4-21
RealPoint rp = new RealPoint();Point p = rp;RealPoint rp2 = p; // Fehlermeldung des CompilersRealPoint rp2 = (RealPoint) p;
Voraussetzung: neuer Typ = dynamischer Typ oderneuer Typ = Oberklasse des dynamischen Typs
Andernfalls wird zur Laufzeit eine Ausnahme ausgelöst
Dieser Fall sollte durch Verwendung von instanceofvermieden werden
if (p instanceof RealPoint)RealPoint rp2 = (RealPoint) p;
Überschreiben, Überladen und Überdecken
Überschreiben und Überladen beziehen sich auf Methoden;Überdecken bezieht sich auf Attribute
beim Überschreiben haben alle Parameter den gleichen Typ,beim Überladen gibt es Unterschiede
gleiche Parametertypen, aber unterschiedlicher Ergebnistyp-> Fehlermeldung durch Compiler
überschriebene Methoden werden dynamisch gebunden,überdeckte Attribute werden statisch gebunden
Konsequenz: bei Methoden ist kein Typcast nötig, falls neuerTyp = dynamischer Typ
Klassenmethoden werden nicht überschrieben, sondern neudefiniert
Klassen- und Instanzmethoden mit gleicher Signatur sindnicht zulässig
PPS 1.4-24
Beispiel 2 zur Typkonvertierung
Zugriff auf überdeckte Variablen
PPS 1.4-23
class Point {int x, y, color;...
}class RealPoint extends Point {
float x, y, color;...
}...RealPoint rp = new RealPoint();Point p = rp;int i = ((Point) rp).x;float f = ((RealPoint) p).x;
Wrapper-Klassen
Jedem primitiven Typ ist eine Wrapper-Klassezugeordnet: int - Integer, float - Float etc.
Nutzen:
Die Wrapperklassen sind Unterklassen von Object undstellen zusätzliche Methoden zur Verfügung
Viele Methoden (z.B. der Klasse Vector) verlangen alsParameter Objekte
für Klassen: public, defaultdefault - nur innerhalb des Pakets sichtbarpublic - überall sichtbarKlasse nicht sichtbar -> Attribute/Methoden nichtsichtbar (unabhängig von deren Modifikator)
default
private
protected
public
Klasse
X
X
X
X
Unterklasse
(gl. Paket)
X
X
Paket
X
X
X
Welt
X
Import-Anweisung
Import aller Klassen eines Paketes durchimport paketname.*
(als erste Anweisung hinter package, sofern vorhanden)Import einer bestimmten Klasse durch
import paketname.KlassennameImport eines Paketes impliziert nicht den Import derUnterpaketeauch ohne Import-Anweisung kann über
paketname.Klassenname.methode()auf fremde Klassen zugegriffen werdenImport kann Datenkapselung nicht aufhebenjava.lang.* wird automatisch importiert
PPS 1.4-29
Datenkapselung - public
package paketA;
public class One {
public int a;
}
public class Two extends One {
...
}
public class Three {
...
}PPS 1.4-32
package paketB;
import paketA.One;
public class Four extends One {
... = a ...
}
public class Five {
... = one.a ...
}
Datenkapselung - private
Als private gekennzeichnete Attribute / Methodensind für Objekte anderer Klassen nicht sichtbar
Trotzdem können die verschiedenen Objekte dergleichen Klasse gegenseitig auf ihre privatenAttribute/ Methoden zugreifen
Als private gekennzeichnete Attribute / Methodenwerden nicht vererbt
Falls in der Unterklasse Attribute/Methoden mitgleichem Namen definiert werden, so handelt essich um eine Neudefinition (kein Überschreiben,Überladen, Überdecken)
PPS 1.4-31
Datenkapselung - default
PPS 1.4-34
package paketA;
public class One {
public int a;
}
public class Two extends One {
...
}
public class Three {
...
}
package paketB;
import paketA.One;
public class Four extends One {
... = a ...
}
public class Five {
... = one.a ...
}
Datenkapselung - protected
PPS 1.4-33
package paketA;
public class One {
public int a;
}
public class Two extends One {
...
}
public class Three {
...
}
package paketB;
import paketA.One;
public class Four extends One {
... = a ...
}
public class Five {
... = one.a ...
}
Abstrakte KlassenKlassen müssen als abstract gekennzeichnet werden,wenn sie mindestens eine abstrakte Methode definierenoder erben
Interfaces sind spezielle Klassen, die nur abstrakteMethoden und Konstanten enthalten
explizite Kennzeichnung als public abstractbeziehungsweise public final static kann entfallen
möglich: public, default
falls public: Filename = Name des Interfaces .java
PPS 1.4-37
public interface KannBlinken {void blinkenEin();void blinkenAus();
}public interface KannVerschieben {
int GRENZE = 100;boolean move(int dx, int dy);
}
Verwendung von Interfaces und abstrakten Klassen
Möglich: Deklaration von Variablen mit dem Typ einesInterfaces/einer abstrakten Klasse
Diesen Variablen können Objekte aller Klassenzugewiesen werden, die das Interface implementieren
Der Compiler akzeptiert dann den Aufruf der Methodendes Interfaces
Analog: Interfaces/abstrakte Klassen als Elementtyp vonFeldern bzw. Typ formaler Parameter
Typcast, instanceof sind anwendbar
PPS 1.4-40
KannBlinken leuchtObjekt;if (...) leuchtObjekt = new BlinkingPoint();else leuchtObjekt = new BlinkingArrow();leuchtObjekt.blinkenEin();// Nicht zulässig ist leuchtObjekt.move(3,4);
Beispiel: Interfaces
public class BlinkingPoint extends GeomFigur implementsKannBlinken, KannVerschieben {
Thread-Programmierung (z.B. Pthreads, Java Threads):explizite Erzeugung der Threads und Zuweisung vonAufgaben durch den ProgrammiererSprachkonstrukte zur Synchronisation undBeeinflussung des Scheduling
Scheduling = räumliche und zeitliche Zuordnung der Threads zuProzessoren
Messagingauch: Message-Oriented Middleware (MOM), z.B. Java MessageService API
Verteilte Prozesse kommunizieren über gemeinsamenSpeicher -> ermöglicht zeitliche Entkopplung vonSender und Empfänger
Varianten:
Message Queuing: Als gemeinsamer Speicher dienenSchlangen (Queues), in die Nachrichten eingefügt bzw.aus denen Nachrichten entnommen werden können
im System existieren meist mehrere Schlangen mitunterschiedlichen Zugriffsrechten
Publish-and-Subscribe: Produzenten stellen Klassenvon Informationen zur Verfügung, Konsumentenkönnen diese abonnieren (vergleichbar Mailinglisten)
PPS 2.1-21
Mobiler Code - Einsatzgebiete
Erweiterungen des Client/Server-Modells:
Remote Evaluation: Code wird zur Laufzeit vom Clientzum Server geschickt (z.B. Übermittlung einer Funktion zwecksBerechnung durch leistungsfähigen Server)
Code on Demand: Server verwaltet Datenbank mitProgrammtexten und versendet sie bei Bedarf an dieKlienten (Beispiel: Applets in Webseite)
Mobile Agenten: Programm wandert während seinerAusführung durch Netzwerk zwecks Nutzung entfernterRessourcen; Programm entscheidet selbst, wann undwohin es migriert
Agenten können kooperierenPPS 2.1-20
2.2. Java Threads
Besonderheit Java: Threadprogrammierung ist in dieSprache integriert
Ein Programm (d.h., ein Prozeß des Betriebssystems)kann mehrere Threads umfassen
Die Threads eines Programmes verfügen übergemeinsamen Speicher
daneben existieren lokale Variablen der Threads
Alle Threads arbeiten mit dem gleichen Programmtext,aber unterschiedlichen Programmzählern
- > typisch: Verschiedene Threads bearbeiten verschiedene MethodenPPS 2.1-23
Verteilte Objekte
Verteiltes Programmiermodell - betrachten Objekte, diesich auf verschiedenen Rechnern befinden (-> getrennteAdreßräume)
Konzept: verbinden mit jedem Objekt einen eigenenProzeß (Unterschied zu sequentiellem Java und Threads!)
Prozeß verwaltet das Objekt im Sinne eines Servers
andere Prozesse können den Programmcode nichtselbst ausführen, sondern müssen dazu die Dienste desServers in Anspruch nehmen -> RMI = Remote MethodInvocation = entfernter Methodenaufruf
Systeme: CORBA, Java RMI, DCOMPPS 2.1-22
Beispiel 1 zur Threaderzeugung
public class BspThread extends Thread {...public void run() {
System.out.println("Gruesse vom erzeugten Thread");}
}
public class Bsp {public static void main(String[] args) {
BspThread t = new BspThread();t.start();System.out.println("Gruesse vom Hauptprogramm");
}}
PPS 2.1-25
Threaderzeugung mittels Thread
Die Klasse Thread des Pakets java.lang definiertMethoden zur Arbeit mit Threads: run, start, etc.
Threaderzeugung mittels Thread:
Bilden einer Unterklasse von Thread
Überschreiben der vordefinierten Methode runmit der gewünschten Funktionalität des Threads
Aufruf der von Thread geerbten Methode start
-> bewirkt Start des Threads und impliziten Aufruf von run
PPS 2.1-24
Beispiel 2 zur Threaderzeugung
public class NutzerThread extends ... implements Runnable {public void run() {
System.out.println("Gruesse vom erzeugten Thread");}
}
public class Bsp {public static void main(String[] args) {
NutzerThread nutzerThread = new NutzerThread();Thread hilfsThread = new Thread(nutzerThread);hilfsThread.start();System.out.println("Gruesse vom Hauptprogramm");
}}
PPS 2.1-27
Threaderzeugung mittels RunnableDa Java nur Einfachvererbung erlaubt, schließt die vorigeMethode Vererbung nach inhaltlichen Aspekten aus
Threaderzeugung mittels Runnable ist flexibler (aber etwas
komplizierter):
Runnable ist vordefiniertes Interface, enthält nur eineMethode: void run()
Aufrufende Klasse erzeugt zwei Objekte: Nutzer-Threadeiner eigenen Klasse und Hilfs-Thread der Klasse Thread
Klasse des Nutzer-Threads implementiert Runnable
Bei Erzeugung des Hilfs-Threads Übergabe desNutzerobjekts als Argument des Konstruktors
Aufruf der Methode start des Thread-ObjektsPPS 2.1-26
Beenden von Threads 2
PPS 2.1-29
Mit join() kann ein Thread auf die Beendigung einesanderen Threads warten:
public final void join() throws InterruptedException
Threadprogramme sind unstrukturiert: jeder Threaddarf jeden zum Abbruch auffordern
Threads leben eventuell länger als dasHauptprogramm
Abbruch aller Threads durch System.exit(0)
statt 0 Angabe eines Fehlercodes möglich
System.exit(0) kann in Hauptprogramm oder erzeugtemThread aufgerufen werden
Beenden von Threads 1
automatisch am Ende der run-Methode
Direkter Abbruch (stop) durch andere Threads soll inJDK 1.3 nicht mehr verwendet werden (Problem:Ressourcenfreigabe)
Andere Threads können durch Aufruf der Methode
public void interrupt()
zum Abbruch auffordern
Thread kann durch
public boolean isInterrupted()
feststellen, ob er zum Abbruch aufgefordert wurde undgegebenenfalls die run-Methode beenden
PPS 2.1-28
Beispiel zum Unterbrechen
public class BspThread extends Thread {public void run() {
public class Bsp {...BspThread t = new BspThread();t.interrupt();
} PPS 2.1-31
Unterbrechen von Threads
erfolgt mittels der Methode
public static void sleep(long milllis)
Bei Eingang einer Abbruchanforderung während desSchlafes wird eine Ausnahme ausgelöst und der Threadsofort geweckt -> Ausnahme abfangen
Aufruf : Thread.sleep(100) - bezieht sich auf den aktuellenThread, kann auch das Hauptprogramm sein
Mit
public final boolean isAlive()
kann abgefragt werden, ob ein Thread noch läuft, z.B.
if (t.isAlive()) t.interrupt();PPS 2.1-30
Locks und Objekte
in Java besteht eine 1:1-Beziehung zwischen Lock undObjekt
Sinn: gemeinsame Ressourcen sind in Java-ProgrammenAttribute und damit einem Objekt zugeordnet
Alle Ressourcen des Objekts werden durch den gleichenLock geschützt
PPS 2.1-33
Markierung mit synchronized ist möglich für
Methode- es wird der Lock des aktuellen Objektsangefordert
Anweisungsblock - Programmierer legt explizit fest,von welchem Objekt der Lock angefordert wird
Synchronisation
Kritischer Bereich:
Abschnitt des Programms, in dem Zugriff aufgemeinsame Ressourcen erfolgt
darf nicht durch andere Prozesse, die die gleicheRessource nutzen, unterbrochen werden
PPS 2.1-32
Java-Threads basieren auf dem Monitor-Konzept:
jedem Objekt ist ein Schlüssel (Lock) zugeordnet
Programmierer markiert kritische Bereiche mit demSchlüsselwort synchronized
Java-System stellt sicher, daß sich zu einem Zeitpunktnur ein Thread in einem kritischen Bereich des gleichenObjektes befindet
Beispiel: Monitor
public class Konto {int kontostand = 0;synchronized void einzahlen(int betrag) {kontostand+=betrag; }synchronized void abheben(int betrag) {kontostand-=betrag; }
}public class Kontoinhaber extends Thread {
public void run() { einzahlen(200); abheben(50); }}public class Bsp {
Konto unserKonto = new Konto();Kontoinhaber susi = new Kontoinhaber(unserKonto);Kontoinhaber fritz = new Kontoinhaber(unserKonto);susi.start(); fritz.start();
}PPS 2.1-35
PPS 2.1-34
Ausschließlicher Zugriff
wird durch das Monitor-Konzept realisiert
Nach Erzeugen eines Objekts ist dessen Lock verfügbar.
Sobald ein Thread einen kritischen Bereich erreicht, wirdautomatisch der dazugehörige Lock angefordert.
Falls verfügbar, wird der Lock dem aufrufenden Threadzugeordnet und ist dann für andere Threads nicht mehrverfügbar.
Andernfalls wird der Thread in die Warteliste desangeforderten Locks eingetragen.
Bei Verlassen des kritischen Bereichs wird der Lockautomatisch freigegeben. Falls Threads warten, erhälteiner von ihnen den Lock (welcher ist nicht festgelegt).
wait und notify
Weiterer Synchronisationsmechanismus - eignet sich fürSynchronisation zwischen Produzenten undKonsumenten (Anwendung Monitor: ausschließlicher Zugriff)
Durch Aufruf wait() gibt der Besitzer des Locks diesenfreiwillig ab und begibt sich in einen zweiten Warteraum("Schlafsaal") zum Objekt
wait() kann nur in kritischem Bereich aufgerufen werden
Durch Aufruf von notify() wird ein (willkürlichausgewählter) Thread des Schlafsaals in den Warteraumdes Locks geschickt
2) Erstellen einer Klasse A, die das Interface implementiert
3) Erzeugen von Stub und Skeleton mit Hilfe des Werkzeugsrmic
4) Starten der RMI-Registry als Hintergrundprozeß aufdem Server-Rechner
5) Starten des Serverprozesses - darin Erzeugen einesObjekts der Klasse A und Anmelden dieses Objekts untereinem Namen xyz bei der RMI-Registry (mittels Naming.bind)
Serverprozeß läuft auch nach Beendigung von main() weiterPPS 2.1-47
Serialisierung
Abspeichern des Objektzustandes in einem zurDatenübertragung geeigneten Format (Folge von Bits)
Abgespeichert werden
die Werte aller eigenen und geerbten Attribute, außerstatic, transient
für Attribute, die Objekte sind, rekursiv auch derenAttribute (bei zyklischen Verweisen nur einmal)
Verweis auf zugehörige Klasse (Programmtext, Version)
Objekte können nur serialisiert werden, wenn sie das(leere) Interface Serializable implementieren
Weitere Anwendung: Sichern in Files (Persistenz)PPS 2.1-46
3. Skriptsprachen
PPS 3-1
Literatur für dieses Kapitel:D. Barron: The World of Scripting Languages, Wiley, 2000.
Praktische Umsetzung 2
6) Kopieren des Stub auf den Client-Rechner (insArbeitsverzeichnis)
7) Client-Programm muß kennen:
Name des Zielrechners (z.B. paral.informatik.uni-leipzig.de)
frei gewählten Namen des Servers (d.h.: xyz)
Erhält dann durch Aufruf von Naming.lookup(daten)vom RMI Registry des Server-Rechners einen VerweisfernesObjekt auf das Server-Objekt
8) Dieser Verweis ermöglicht Aufruf von Server-Methodenmit der üblichen Syntax, z.B. fernesObjekt.m()
PPS 2.1-48
Anwendungsgebiete und Sprachen
Systemadministration , Steuerung von Anwendungen
Betriebssysteme, Netzwerke, Datenbanken
Unix Shells, Perl, Tcl
Zusammensetzen von Komponenten
Tk, Visual Basic
Anwendungen, bei denen schnelle Programmentwicklungwichtiger ist als schnelle Programmausführung (Prototyp)
Visual Basic
Web-Programmierung auf Client- und Serverseite
JavaScript, VBScript, Perl
=>Skriptsprachen sind auf ein (eventuell breites)Anwendungsgebiet spezialisiert
PPS 3-3
Merkmale
werden häufig nicht zu den Programmiersprachen gezählt
einfache Sprachen
leicht zu erlernen (zumindest Sprachkonzept)
schnelle Entwicklung von Programmen
pragmatisch
einfaches Typsystem, dynamische Typisierung
werden interpretiert oder implizit kompiliert
-> direkter Aufruf des Programms ohne vorherigeÜbersetzung
große praktische Bedeutung
PPS 3-2
Beispiele: Perl
PPS 3-5
Schreiben in File Bsp.pl:#!/usr/bin/perlprint "Hello World\n"
Ausführung in Unixdurch:
>BspAusführung in Windowsdurch:
> perl Bsp
#!/usr/bin/perl$word = shift;while (<>) {print if /$word/};Aufruf durch:
Bsp xyz File1 File2
#!/usr/bin/perlwhile (<STDIN>) {
print if /wichtig/};
Perl - Einführung
Perl = Practical Extraction and Report Language
Ende 80-er Jahre eingeführt, danach weiterentwickelt
zunächst Unix, jetzt alle wichtigen Betriebssysteme
Spezialisierung: Textverarbeitung, Extraktion vonInformationen aus Files
Befehle des Betriebssystems (auch zur Netzwerk-programmierung) sind in Perl-Skripts direkt verfügbar
Syntax erlaubt Varianten des gleichen Befehls - Prinzip:fehlende Informationen werden sinnvoll ergänzt
Beispiel: Variablen können, müssen aber nicht deklariert werden
günstig für ungeübten ProgrammiererPPS 3-4
Zusammengesetzte Datentypen
Liste
z.B. ("rot", "blau", "gruen"), qw(rot blau gruen), (1..8)
Vertauschen von Daten: ($a, $b) = ($b, $a);
Array
z.B. @bsp = (0, "nichts", 0.0); -> $bsp[0] enthält 0 etc.