Upload
godafrid-wessels
View
107
Download
1
Embed Size (px)
Citation preview
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 1
Programmierkurs Java
Vorlesung
am FB Informatik
der Universität Oldenburg
Vorlesung 10
Dietrich Boles
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 2
Gliederung von Vorlesung 10
• Klassen und Objekte in Java (II)– Wiederholung
– Überladen von Methoden
– Objektarrays
– Objektparameter
– Objektattribute (Subobjekte)
– Klassenvariablen
– Klassenmethoden
– Konstante
– String-Objekte
– main-Funktion
– OO-Programme
– Beispiel
• OO-Softwareentwicklung– Überblick
– OO-Analyse
– OO-Entwurf
– OO-Programmierung
– OO-Test
– UML
– Beispiel
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 3
Wiederholung
Objekte (Instanz):
– setzen sich zusammen aus
• Datenelementen (Attribute)
• den auf den Attributen ausführbaren Operationen (Methoden)
– werden durch Klassen beschrieben
Attribute (Instanzvariablen):
– Variablen, für die in jedem Objekt Speicherplatz reserviert sind
Methoden:
– realisieren die auf Objekten einer Klasse anwendbaren Operationen
Konstruktoren:
– spezielle Methoden zur Initialisierung von Objekten
Instantiierung:
– Erzeugung von Objekten
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 4
Wiederholung
public class Stack { // Klassendefinition // Attribute int[] store; // zum Speichern von Daten int actual; // aktueller Index
// Konstruktoren public Stack(int size) { this.store = new int[size]; this.actual = -1; // Attributzugriff } public Stack(Stack stack) { this(stack.store.length); for (int i=0; i<this.store.length; i++) this.store[i] = stack.store[i]; this.actual = stack.actual; }
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 5
Wiederholung
// Methoden public boolean isFull() { return this.actual == (this.store.length-1); }
public boolean isEmpty() { return this.actual == -1; }
public void push(int value) { this.store[++this.actual] = value; }
public int pop() { return this.store[this.actual--]; }
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 6
Wiederholung
public static void main(String[] args) { //Objektvariablen, -erzeugung und -initialisierung Stack stack1 = new Stack(10); Stack stack2 = new Stack(5);
int wert = 1234; while ((wert > 0) && !stack1.isFull()) { stack1.push(wert % 10); // Methodenzugriff wert = wert / 10; }
while (!stack1.isEmpty() && !stack2.isFull()) stack2.push(stack1.pop());
while (!stack2.isEmpty()) { System.out.println(stack2.pop());} } } // Objektzerstörung
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 7
Überladen von Methoden
• Überladen von Methoden:– zwei oder mehrere Methoden (auch Konstruktoren!) einer Klasse können
denselben Namen besitzen, wenn
• sie eine unterschiedliche Anzahl an Parametern besitzen oder
• wenn sich die Parametertypen an entsprechender Stelle unterscheiden
public class Int {
int value = 0;
public void add(int v) { this.value += v; }
public void add(float v) { this.value += (int)v; }
public void add(int v1, int v2) { this.value += v1 + v2; }
public static void main(String[] args) {
Int obj = new Int();
obj.add(3); // int-add
obj.add(3.4F); // float-add
obj.add(4, 5); // int-int-add
} }
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 8
Objektarrays
public class Mitarbeiter { int id; float gehalt = 5555.0F; public Mitarbeiter(int no) { this.id = no; } public int getId() { return this.id; }
public static void main(String[] args) { Mitarbeiter[] studis = new Mitarbeiter[3]; for (int i=0; i<studis.length; i++) studis[i] = new Mitarbeiter(i); int id = studis[2].getId(); Mitarbeiter[] profs = {new Mitarbeiter(4), new Mitarbeiter(5)};} }
studis 0 1 2 idgehalt
Stack Heap
0 1 2
5555. 5555. 5555.
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 9
Objektparameterpublic class Mitarbeiter { float gehalt; int abteilung = 1; public Mitarbeiter(float g) { this.gehalt = g; }
public static void main(String[] args) { Mitarbeiter dibo = new Mitarbeiter(4444.0F); change(dibo, 6666.0F); System.out.println(dibo.gehalt); }
public static void change(Mitarbeiter m, float g) { m.gehalt = g; m = new Mitarbeiter(3333.0F);} }
dibo
Stack Heapmain
mchange
ggehaltabteilung
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 10
Objektattribute (Subobjekte)
public class Gehirn { ... }public class Herz { ... }public class Arm { ... }
public class Mensch { Herz herz; // Subobjekt Gehirn gehirn; // exklusives Subobjekt Arm[] arme; // mehrere Subobjekte public Mensch() { this.gehirn = new Gehirn(); this.herz = new Herz(); this.arme = new Arm[2]; this.arme[0] = new Arm(); this.arme[1] = new Arm(); } public void transplantation(Herz neuesHerz) { this.herz = neuesHerz;} }
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 11
Klassenvariablen
• Definition: Klassenvariablen (static-Variablen) sind globale Variablen bzgl. einer Klasse (d.h. der Menge aller Methoden einer Klasse). Sie sind von allen Instanzen der Klasse zugreifbar. Der Wert einer Klassenvariablen ist für alle Instanzen einer Klasse stets identisch.
• Beispiel: Jedes Objekt einer Klasse soll eine eindeutige ID erhalten!
public class Mitarbeiter { float gehalt; int id; static int idZaehler = 0; // Klassenvariable public Mitarbeiter(float geh) { this.gehalt = g; this.id = Mitarbeiter.idZaehler++; // alternativ: this.id = idZaehler++; // alternativ: this.id = this.idZaehler++; }
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 12
Klassenvariablen
public static void main(String[] args) { Mitarbeiter dibo = new Mitarbeiter(6666); // -> dibo.id == 0 Mitarbeiter kurt = new Mitarbeiter(5555); // -> kurt.id == 1;} }
• Definition: mit Hilfe des Schlüsselwortes static• Zugriff: via <Klassenname> . <Attributname>
dibo kurt
gehalt
id
gehalt
id
idZaehler
Stack
Heap
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 13
Klassenmethoden
• Definition: Klassenmethoden beschreiben das Verhalten von Operationen, die ausschließlich einer Klasse und nicht den von ihr erzeugten Objekten zugeordnet sind.
• Motivation:– Zugriff auf Klassenvariablen– Zugriff auf Elemente einer Klasse, ohne eine Instanz dieser Klasse zu besitzen
public class Mitarbeiter { float gehalt; int id; static int idZaehler = 0; // Klassenvariable public Mitarbeiter(float geh) { this.gehalt = g; this.id = Mitarbeiter.idZaehler++; } public static int getZaehler() { // Klassenmethode return Mitarbeiter.idZaehler; }
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 14
Klassenmethoden
public static void main(String[] args) { Mitarbeiter dibo = new Mitarbeiter(6666); System.out.println(Mitarbeiter.getZaehler() ); // alternativ: dibo.getZaehler() } }
• Definition: mit Hilfe des Schlüsselwortes static• Zugriff: via <Klassenname> . <Methodenname>
• Anmerkungen:– kein Zugriff auf Instanzvariablen/-methoden innerhalb einer Klassenmethode– i.a. Zugriff auf Klassenvariablen– Bereitstellung allgemeingültiger Operationen
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 15
Klassenmethoden
public class Bruch { int zaehler, nenner; public Bruch(int z, int n) { this.zaehler = z; this.nenner = n; } public void mult(Bruch b) { this.zaehler *= b.zaehler; this.nenner *= b.nenner; } public static Bruch mult(Bruch b1, Bruch b2); return new Bruch(b1.zaehler * b2.zaehler, b1.nenner * b2.nenner); } public static void main(String[] args) { Bruch b1 = new Bruch(3, 4); Bruch b2 = new Bruch(7, 8); b1.mult(b2); // b1 *= b2 Bruch b4 = Bruch.mult(b1,b2); // b4 = b1 * b2} }
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 16
Konstanten
• Definition: Konstante = ausschließlich lesbare Klassenvariable
• Schlüsselwort final: nicht veränderbar; nur lesbar
public class Circle { public static final double PI = 3.1415926; double radius; public Circle(double r) { this.radius = r; } public double getRadius() { return this.radius; } public static void main(String[] args) { Circle c = new Circle(3.4); double umfang = 2 * Circle.PI * c.getRadius(); Circle.PI = 3.1416; // Fehler!}
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 17
String-Objekte
• Strings (Zeichenketten) sind in Java keine Standarddatentypen
• es existiert eine vordefinierte Klasse String im JDK:public class String { public String() {...} public String(char[] str) {...} public String(String str) {...} public int length() {...} public char charAt(int index) {...} public boolean equals(String str) {...} public boolean startsWith(String prefix) {...} public int indexOf(char ch) {...} public String subString(int begInd, int endInd) {...} public String concat(String str) {...} public static String valueOf(int i) {...} ...}
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 18
String-Objekte
• Definition, Erzeugung und Initialisierung: String str = new String(“hello“); // alternativ: String str = “hello“;• +-Operator: String str = “hello“ + “world!“;• Konvertierung in String-Objekte: int i = 4711; System.out.println(“Ich bin Nummer“ + i + “!“);
public class Bruch { ... public String toString() { return this.zaehler + “/“ + this.nenner; } } Bruch bruch = new Bruch(3,4); System.out.println(“Bruch:“ + bruch); // automatischer Aufruf der toString-Methode
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 19
String-Objekte
• Manipulation von String-Objekten:– nicht direkt möglich (keine entsprechenden Methoden vorhanden)
– Grund: Performance
– Umweg über Klasse StringBuffer aus dem JDK:
public class StringBuffer {
public StringBuffer(int length) {...}
public StringBuffer(String str) {...}
public void setCharAt(int index, char ch) {...}
public StringBuffer append(String str) {...}
public StringBuffer insert(int off, String str) {...}
public String toString() {...}
...
}
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 20
String-Objekte
• Vorgehensweise bei der Manipulation von String-Objekten:– Umwandlung des zu manipulierenden String-Objektes in StringBuffer-
Objekt
– Manipulation mit StringBuffer-Methoden
– Re-Umwandlung mittels der toString-Methode
String str = “moin moin“;
StringBuffer buffer = new StringBuffer(str);
for (int i=0; i<buffer.length(); i++)
if (buffer.charAt(i) == ‘o‘)
buffer.setCharAt(i,‘e‘);
str = buffer.toString();
System.out.println(str); // mein mein
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 21
main-Funktion
public static void main(String[] args) { ... }• Klassenmethode
• besitzt eine Klasse X eine main-Funktion und wird der Java-Interpreter mit java X aufgerufen, so startet das Programm automatisch mit dem Aufruf der Funktion X.main
• args: Übergabeparameter der Shell
public class Echo {
public static void main(String[] args) {
for (int i=0; i<args.length; i++)
System.out.println(args[i]);
} }
$ java Echo hello world $ java Echo moin
hello moin
world $
$
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 22
OO-Programme
• Definition OO-Programm:– statisch: Menge an Klassen + eine Hauptklasse (Hauptprogramm)– dynamisch: Menge an miteinander kommunizierenden Objekten
• Gliederung: – jede Klasse i.a. in einer separaten Datei (zur Zeit im selben Verzeichnis!)– Aufruf: java X Aufruf der main-Prozedur der Klasse X
Verzeichnis uni:Datei Mensch.java: public class Mensch {...}Datei Uni.java: public class Uni {...}Datei Bibliothek.java: public class Bibliothek {...}Datei UniBetrieb.java: public class UniBetrieb {...}
Compilieren: javac *.javaAusführen: java UniBetrieb
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 23
Beispiel
Datenstruktur „Speicher“, in der prinzipiell beliebig vieleElemente gespeichert werden können: public class Speicher { public void add (String str) {...} public void remove(String str) {...} public boolean isElement(String value) {...} // weitere Methoden ... }
1. Implementierungsalternative: verkettete Liste
2. Implementierungsalternative: wachsendes Array
Voll?
obj obj obj obj obj
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 24
Beispiel (verkettete Liste)
class ListElem { ListElem prev; ListElem next; String value; public ListElem(ListElem p, ListElem n, String v) { this.prev = p; this.next = n; this.value = v; }}
public class List { ListElem first;
public List() { this.first = null;} public void add(String value) { this.first = new ListElem(null, this.first, value); if (this.first.next != null) this.first.next.prev = this.first; }
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 25
Beispiel (verkettete Liste) public boolean IsElement(String value) { ListElem help = this.first; while (help != null) { if (help.value.equals(value)) return true; help = help.next; } return false; } public void remove(String value) { ListElem help = this.first; while (help != null) { if (help.value.equals(value)) { if (help.prev != null) help.prev.next = help.next; if (help.next != null) help.next.prev = help.prev; if (help == this.first) this.first = help.next; } help = help.next; } }
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 26
Beispiel (verkettete Liste)
public void print() { System.out.println("*****"); ListElem help = this.first; while (help != null) { System.out.println(help.value); help = help.next; } System.out.println("*****"); } public static void main(String[] args) { List list = new List(); list.add("1"); list.add("2"); list.add("3"); list.add("1"); list.add("1"); list.add("4"); list.print(); list.remove("1"); list.remove("5"); list.print(); list.add("1"); list.print();} }
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 27
Beispiel (wachsendes Array)
public class DynArray { String[] values; int next;
public DynArray() { this.values = new String[3]; this.next = 0; } public void add(String value) { if (this.next == this.values.length) this.grow(); this.values[this.next++] = value; } public boolean IsElement(String value) { for (int i=0; i<this.next; i++) if (this.values[i].equals(value)) return true; return false; }
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 28
Beispiel (wachsendes Array)
public void remove(String value) { for (int i=0; i<this.next; i++) if (this.values[i].equals(value)) { for (int j=i+1; j<this.next; j++) this.values[j-1] = this.values[j]; this.next--; i--; } }
public void grow() { String[] store = new String[2*this.values.length]; for (int i=0; i<this.next; i++) store[i] = this.values[i]; this.values = store; }
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 29
Beispiel (wachsendes Array)
public void print() { System.out.println("*****"); for (int i=0; i<this.next; i++) System.out.println(this.values[i]); System.out.println("*****"); }
public static void main(String[] args) { DynArray store = new DynArray(); store.add("1"); store.add("1"); store.add("2"); store.add("3"); store.add("1"); store.add("1"); store.add("4"); store.add("5"); store.print(); store.remove("1"); store.remove("5"); store.print(); store.add("1"); store.print(); }}
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 30
OO-Softwareentwicklung• Ziel der Softwareentwicklung:
Erstellung eines Softwaresystems zur Lösung eines Problems
• OO-Softwareentwicklung:– Analyse des Anwendungsgebietes– Modellierung des Anwendungsgebietes– Transformation in ein Modell des Lösungsraumes– Transformation in ein Programm (= Abstraktion des Anwendungsgebietes)– durchgängiger Prozeß ohne Strukturbruch
• Vorgehensmodell mit folgenden Phasen:– OO-Analyse– OO-Entwurf/-Design– OO-Implementierung/-Programmierung– OO-Test
• Evolutionäres Vorgehen: iterativ und inkrementell
Problem Programm
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 31
OO-Analyse
• Aufgabe: – Untersuchung des Problem- bzw. Anwendungsbereiches
• Ziel: – Erstellung eines Modells (OOA-Modell) als Abbild des statischen Aufbaus des
Anwendungsgebietes sowie der dynamischen Abläufe im Anwendungsgebiet
• Aktivitäten:– Identifikation von Objekten und Klassen
– Identifikation von Beziehungen zwischen Objekten
– Identifikation von Methoden und Attributen
– Identifikation von (Arbeits-)Abläufen
• Methoden:– grammatikalische Untersuchung der Problembeschreibung:
• Substantive Klassen/Objekte• Adjektive Attribute• Verben Methoden• Sätze mit mehreren Substantiven Beziehungen
– CRC-Methode
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 32
OO-Entwurf
• Aufgabe: – Abbildung des Modells des Anwendungsgebietes (OOA-Modells) auf ein Modell
des zu entwickelnden Systems (OOD-Modell)
• Ziel: – konkrete Vorbereitung der Implementierungsphase
• Aktivitäten:– Ergänzung des OOA-Modells um weitere Klassen/Objekte/Attribute/Methoden,
die im Problembereich nicht auftreten, bei der Implementierung aber unerläßlich sind (Speicherung, Darstellung, ...)
– Entwurf der Softwarearchitektur
– Berücksichtigung von Betriebssystem, Programmiersprache, Datenverwaltung, ...
• Methoden:– Untersuchung von möglichen Anwendungsszenarien des Systems
– Verwendung von Entwurfsmustern (Design Pattern)
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 33
OO-Programmierung
• Aufgabe: – Umsetzung des OOD-Modells in eine konkrete Programmiersprache
• Ziel: – Erstellung eines Programmsystems
• Aktivitäten:– Implementierung der Klassen des OOD-Modells
– Aufbau von Klassenbibliotheken
• Methoden:– relativ mechanische Überführung des OOD-Modells in ein Programm
– Nutzung von Klassenbibliotheken
• Anmerkungen:– Nutzung nicht-objektorientierter Sprachen ist nicht ausgeschlossen
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 34
OO-Test
• Aufgabe: – Überprüfung der Korrektheit des Programmsystems
• Ziel: – Erstellung eines korrekten, vollständigen Programmsystems
• Aktivitäten:– Test der Korrektheit der Methoden der einzelnen Klassen– Test der Korrektheit der einzelnen Klassen– Test der Korrektheit des Zusammenspiels der einzelnen Klassen
• Methoden:– übliche Testmethoden
• Anmerkungen:– Vorteile objektorientierter Software (Datenkapselung, Erweiterbarkeit,
Wiederverwendbarkeit) kommen zur Geltung– OO-Modellierungsnotationen sorgen für gute Dokumentation und Verständlichkeit
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 35
UML
• Unified Modeling Language:
– OO-Modellierungsnotation
– Festhalten von Ergebnissen
– Kommunikationsgrundlage
– keine Entwicklungsmethode!
– Strukturdiagramme
• Klassendiagramme
• Paketdiagramme
– Verhaltensdiagramme
• Anwendungsfalldiagramme
• Interaktionsdiagramme
– Sequenzdiagramme
– Kollaborationsdiagramme
• Zustandsdiagramme
• Aktivitätsdiagramme
– Implementierungsdiagramme
• Komponentendiagramme
• Einsatzdiagramme
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 36
Beispiel
• Implementierung des TicTacToe-Spiels:
Beim TicTacToe-Spiel versuchen zwei Personen das Spiel zu gewinnen, indem sie abwechselnd Kreuz-Figuren (Spieler A) und Kreis-Figuren (Spieler B) auf einem 3x3-Brett so plazieren, dass ihre Figuren in einer Horizontalen, Vertikalen oder Diagonalen eine 3er-Reihe bilden. Anfangs ist das Brett leer. Das Spiel endet mit einem Unentschieden, wenn alle Felder des Brettes besetzt sind und kein Spieler eine 3er-Reihe bilden konnte.
leeres Spielbrett Zug von Spieler A Sieger: Spieler AZug von Spieler B
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 37
Beispiel• Identifikation von Objekten / Klassen:
– Spiel (class TTTSpiel)– Spieler (class TTTSpieler)– Spielbrett (class TTTBrett)– Spielfiguren (class TTTFigur)– Spielregeln (class TTTRegeln)– Spielzüge (class TTTSpielzug)
• Identifikation von Beziehungen zwischen Objekten: – ein Spiel besteht aus einem Spielbrett– zu einem Spiel gehören Spielregeln– zu einem Spiel gehören zwei Spieler– auf dem Spielbrett können Spielfiguren plaziert werden– auf dem Spielbrett werden Spielzüge ausgeführt– jede Spielfigur gehört einem Spieler– jeder Spieler kennt die Spielregeln– Spielzüge müssen regelkonform zu den Spielregeln sein– ...
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 38
Beispiel
TTTSpielzug......
TTTSpieler
ist_spieler_aliefere-
Naechsten-Spielzug()
...
TTTFigur......
TTTBrett...... TTTRegeln
...
...
TTTSpiel......
gehört
kennt
1
1
1
0..9
1
2
1
1
TTTProgramm......
ausführen
regelkonform
UML-Klassendiagramm:
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 39
Beispiel• Identifikation von Attributen / Methoden:
class TTTSpiel: void spielen();
class TTTBrett: void fuehreZugAus(TTTSpieler spieler, TTTSpielzug zug); void gebeSpielbrettAus();
class TTTFigur: boolean a_oder_b; int zeile, spalte;
class TTTRegeln: boolean spielzugOK(TTTSpielzug zug); boolean spielEnde(); void gebeSiegerBekannt();
class TTTSpieler:boolean ist_spieler_a;TTTSpielzug liefereNaechstenZug(TTTSpielzug geg_zug);
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 40
Beispiel
spielen()
liefereNaechsten-Spielzug(zug)
...
spielzugOK(akt_spieler, zug)
[antwort = true] fuehreSpielzugAus (akt_spieler, zug)
gebeSpielbrettAus()
zug
antwort
akt_spieler: TTTSpieler
tictactoe: TTTSpiel
regeln: TTTRegeln
brett: TTTBrett
...
• Identifikation von Arbeitsabläufen (UML-Sequenzdiagramm):
Programmierkurs Java Vorlesung 10 Dietrich Boles Seite 41
Beispiel
akt_spieler: TTTSpieler
tictactoe: TTTSpiel
regeln: TTTRegeln
brett: TTTBrett
1: spielen()
1.1: zug := liefereNaechstenZug(zug)
1.2: antwort := spielzugOK(akt_spieler, zug)
1.3: fuehreSpielzugAus(akt_spieler, zug)
1.4: gebeSpielbrettAus()
• Identifikation von Arbeitsabläufen (UML-Kollaborationsdiagramm):