Beruflich Dokumente
Kultur Dokumente
Einführung in Die Objektbasierte Programmierung
Einführung in Die Objektbasierte Programmierung
TUM
WS 2021/2022
Programmieren in Java.
Achtung:
Nicht jede Abbildung lässt sich durch einen Algorithmus realisieren!
(↑Berechenbarkeitstheorie)
Beispiel: Alltagsalgorithmen
Beachte:
Ein Programmsystem berechnet i.a. nicht nur eine Funktion,
sondern immer wieder Funktionen in Interaktion mit
Benutzerinnen und/oder der Umgebung.
Objektbasiertes Programmieren
Basistypen und ihre Operationen
Beispiel Suchmaschine
Methoden
Aufrufen von Methoden
Zusammenfassung
Beispiel Suchmaschine
Klassendiagramme
I Perspektive:
I Wer macht was?
=⇒ Eigenschaften und Fähigkeiten von Objekten
(algorithmische Perspektive: Wie wird's gemacht?)
mmm:Buch
Attribute
autor="Fred Brooks"
title="The mythical man month"
auflage=2
Modellierung ...
Methoden
ausleihen
zurückgeben
...
Klasse (Typ)
Buch
Attribute
String"autor
String"title
int"auflage
...
Methoden
void"ausleihen(Date,"Date)
void"zurückgeben(Date)
...
Verallgemeinerung
mmm:Buch
Attribute
autor=TFred"BrooksT
title=TThe"mythical"man"monthT
auflage=2
Modellierung ...
Methoden
ausleihen
zurückgeben
...
Verallgemeinerung
mmm:Buch
Attribute
autor=:FredüBrooks:
title=:Theümythicalümanümonth:
auflage=2
Modellierung ...
Methoden
ausleihen
zurückgeben
...
Verallgemeinerung Verwendung
mmm:Buch
Attribute
autor=:FredüBrooks:
title=:Theümythicalümanümonth: Buchümmmü=ünewüBuchw);
auflage=2 mmm.autor=:FredüBrooks:;
Modellierung ... mmm.title=:Theümythicalümanümonth:;
Methoden mmm.auflage=2;
ausleihen
zurückgeben
...
Verallgemeinerung Verwendung
mmm:Buch
Attribute
autor=:FredüBrooks:
title=:Theümythicalümanümonth: Buchümmmü=ünewüBuchw);
auflage=2 mmm.autor=:FredüBrooks:;
Modellierung ... Erzeugung mmm.title=:Theümythicalümanümonth:;
Methoden mmm.auflage=2;
ausleihen
zurückgeben
...
I Identität
Eigenschaften können sich ändern, die Identität ist konstant
Durch Namen (Referenz) sichergestellt
I Zustand
Menge der Eigenschaften zu einem Zeitpunkt
Durch Attribute realisiert
I Verhalten
Ausführen von Aktionen, die den Zustand ändern
Durch Methoden realisiert (später!)
Eine Klasse ist ein Bauplan für gleichartige Objekte und legt fest,
Schema:
I class Name { Klassenrumpf }
hse:Buch
Attribute mmm:Buch
autor=1DieterRRombachRetRal.1 Attribute
title=1ARhandbookRofR...1 autor=1FredRBrooks1
auflage=1 title=1TheRmythicalRmanRmonth1
... auflage=2
Methoden ...
ausleihen csr:Buch Methoden
zurückgeben Attribute ausleihen
... autor=1StacyRPowellRetRal.1 zurückgeben
title=1CleanroomRSWREngineering1...
auflage=1
...
Methoden
ausleihen
zurückgeben
...
Modelle
Klasse (Typ)
Buch
Attribute
String"autor
Instanziierung String"title
int"auflage
...
Methoden
void"ausleihenPDateE"Datew
void"zurückgebenPDatew
...
hse:Buch
Attribute mmm:Buch
autor=TDieter"Rombach"et"al.T Attribute
title=TA"handbook"of"...T autor=TFred"BrooksT
auflage=1 title=TThe"mythical"man"monthT
... auflage=2
Methoden ...
ausleihen csr:Buch Methoden
zurückgeben Attribute ausleihen
... autor=TStacy"Powell"et"al.T zurückgeben
title=TCleanroom"SW"EngineeringT...
auflage=1
...
Methoden
ausleihen
zurückgeben
...
Modelle
Klasse (Typ)
Buch
Attribute
String"autor
Instanziierung String"title
int"auflage
...
Methoden
void"ausleihenPDateE"Datew
void"zurückgebenPDatew
...
hse:Buch
Attribute mmm:Buch
autor=TDieter"Rombach"et"al.T Attribute
title=TA"handbook"of"...T autor=TFred"BrooksT
auflage=1 title=TThe"mythical"man"monthT
... auflage=2
Methoden ...
ausleihen csr:Buch Methoden
zurückgeben Attribute ausleihen
... autor=TStacy"Powell"et"al.T zurückgeben
title=TCleanroom"SW"EngineeringT...
auflage=1
...
Methoden
ausleihen
Zu einer Klasse (Typ) kann es
zurückgeben
... mehrere Objekte (Instanzen)
geben !
Modelle
Bibliothek
Attribute
Buch[] buecher;
Person[] staff;
Time[] oeffnungszeiten; Klasse (Typ)
...
Methoden
...
tumbib:Bibliothek
Attribute
Buch{] buecher;
...
Methoden
...
Bibliothek
Attribute
Buch[]Rbuecher;
Person[]Rstaff;
Time[]Roeffnungszeiten; Klasse (Typ)
...
Methoden
...
hse:Buch
Attribute
autor=1DieterRRombachRetRal.1
title=1ARhandbookRofR...1
tumbib:Bibliothek auflage=1
csr:Buch
Attribute
Attribute ...
Methoden autor=1StacyRPowellRetRal.1
title=1CleanroomRSWREngineering1
Buch{] buecher; ausleihen
auflage=1
zurückgeben
... ...
...
Methoden
Methoden ausleihen
zurückgeben
... mmm:Buch ...
Attribute
autor=1FredRBrooks1
title=1TheRmythicalRmanRmonth1
auflage=2
...
Methoden
ausleihen
zurückgeben
...
Bibliothek
Attribute
Buch[]"buecher;
Person[]"staff;
Time[]"oeffnungszeiten; Klasse (Typ)
]]]
Methoden
]]]
hse:Buch
Attribute
autor=TDieter"Rombach"et"al]T
title=TA"handbook"of"]]]T
tumbib:Bibliothek auflage=1
csr:Buch Buch
Attribute
Attribute ]]]
Methoden autor=TStacy"Powell"et"al]T Attribute
title=TCleanroom"SW"EngineeringT
Buch{] buecher; ausleihen
auflage=1
String"autor
zurückgeben
... ]]]
]]] String"title
Klasse (Typ)
Methoden
Methoden ausleihen int"auflage
zurückgeben
]]] mmm:Buch ]]] ]]]
Attribute
autor=TFred"BrooksT Methoden
title=TThe"mythical"man"monthT
auflage=2
void"ausleihenPDateE"Datew
]]]
Methoden
void"zurückgebenPDatew
ausleihen ]]]
zurückgeben
]]]
]]]
hse:Buch
Attribute
autor=TDieter"Rombach"et"al]T
title=TA"handbook"of"]]]T
tumbib:Bibliothek auflage=1
csr:Buch Buch
Attribute
Attribute ]]]
Methoden autor=TStacy"Powell"et"al]T Attribute
title=TCleanroom"SW"EngineeringT
Buch{] buecher; ausleihen
auflage=1
String"autor
zurückgeben
... ]]]
]]] String"title
Klasse (Typ)
Methoden
Methoden ausleihen int"auflage
zurückgeben
]]] mmm:Buch ]]] ]]]
Attribute
autor=TFred"BrooksT Methoden
title=TThe"mythical"man"monthT
auflage=2
void"ausleihenPDateE"Datew
]]]
Methoden
void"zurückgebenPDatew
ausleihen ]]]
zurückgeben
]]]
deniert werden.
I Variablen müssen deklariert werden
I Auÿer für sog. primitive Typen (auch Basistypen) muss noch
ein Konstruktor aufgerufen werden.
I Primitive Typen: z.B. int für ganze Zahlen, double für
Flieÿkommazahlen
Objekt:
zaehler
nenner
class Rational {
int zaehler; // D e k l a r a t i o n eines int = Attributs
int nenner; // D e k l a r a t i o n eines int = Attributs
// Konstruktor Rational () existiert automatisch
// Me t h o d en . . .
}
Rational a;
a = new Rational ();
a.zaehler=3; a.nenner=4;
zaehler 3
a
nenner 4
zaehler 3
a
nenner 4
Rational b = a;
zaehler 3
a
nenner 4
zaehler 3
a
nenner 4
int b = a.zaehler;
zaehler 3
a
nenner 4
b 3
p
y
i s t
d
ϕ
x
class Point {
double x;
double y;
// Konstruktor Point () existiert automatisch
// Me t h o d en ...
}
0x485DE430
0x485DE434
0x485DE438
0x485DE430
x: 0x485DE434
y: 0x485DE438
q: 0x485DE430
0x485DE430
x: 0x485DE434
y: 0x485DE438
q: 0x485DE430
I Initialisiere:
I p = new Point();
I n = 5;
I Point p; p: 0x397E64DC
p=new Point();
0x397E64DC
Point q = p;
x: 0.0
I int n; y: 0.0
n = 5; n: 5
int k = n;
I Im Falle einer Referenz ist dies der Verweis auf das jeweilige
Objekt
I Im Falle eines primitiven Typs ist es der Wert selbst.
I Point p; p: 0x397E64DC
p=new Point(); k: 5
0x397E64DC
Point q = p;
x: 0.0
I int n; y: 0.0
n = 5; n: 5
int k = n; q: 0x397E64DC
I Im Falle einer Referenz ist dies der Verweis auf das jeweilige
Objekt
I Im Falle eines primitiven Typs ist es der Wert selbst.
I Betrachte:
p: 0x397E64DC
k: 5
I q.x = 10; 0x397E64DC
x: 10.0
y: 0.0
n: 5
q: 0x397E64DC
I Betrachte:
p: 0x397E64DC
k: 5
I q.x = 10; 0x397E64DC
x: 10.0
I q = new Point(); y: 0.0
n: 5
q: 0x61645EE8
p2
y2
p1
y1
x1 x2
// andere M e t h od e n
...
}
class Count {
private static int count = 0;
private int info;
// Konstruktor
Count() {
info = count; count = count+1;
} ...
} // e n d o f c l a s s Count
a info 0
a info 0
b info 1
count 3
a info 0
b info 1
c info 2
Auÿerhalb der Klasse Class kann man auf eine öentliche (!!)
Klassen-Variable name mithilfe von Class.name
zugegreifen.
Objektbasiertes Programmieren
Beispiel Suchmaschine
Methoden
Zusammenfassung
Beispiel Suchmaschine
Klassendiagramme
TUM - EidI 21/22 - Pretschner - S. 48
Basistypen
Ein Datentyp (kurz: Typ) legt eine Menge möglicher Werte
und die möglichen Operationen (Methoden) auf diesen Typen
fest.
Die Benutzung kleinerer Typen wie byte oder short spart Platz.
Die Benutzung kleinerer Typen wie byte oder short spart Platz.
Unicode ist ein Zeichensatz, der alle irgendwo auf der Welt
gängigen Alphabete umfasst, also zum Beispiel:
double
Gleitkomma−Zahlen
float
long
int
ganze Zahlen
short
byte char
short xs = 1;
int x = 999999999;
System.out.println(x + xs);
float xs = 1.0f;
int x = 999999999;
System.out.println(x + xs);
short xs = 1;
int x = 999999999;
System.out.println(x + xs);
float xs = 1.0f;
int x = 999999999;
System.out.println(x + xs);
String s0 = "";
String s1 = "Hel";
String s2 = "lo Wo";
String s3 = "rld!";
System.out.println(s0 + s1 + s2 + s3);
Beispiel:
double x = -0.55e13;
System.out.println("Eine Gleitkomma-Zahl: "+x);
Objektbasiertes Programmieren
Beispiel Suchmaschine
Methoden
Zusammenfassung
Beispiel Suchmaschine
Klassendiagramme
TUM - EidI 21/22 - Pretschner - S. 65
Objekte identifizieren
Suchmaschine Programmieren Lernen
Peter Pepper
deutsch
Sep 2007
Effective Java
Effective Java
Feb 2006 Joshua Bloch
Joshua Bloch
englisch
englisch Thinking in Java
Thinking in Java
Bruce Eckel May 2008
Bruce Eckel
englisch
englisch
Programmieren Lernen
Programmieren Lernen
Peter Pepper
Peter Pepper
deutsch
Sep 2007 deutsch
Sep 2007
Programmieren Lernen
Peter Pepper
Thinking in Java
deutsch
Bruce Eckel
englisch
Programmieren Lernen
Peter Pepper
deutsch
Peter Pepper
deutsch
Sep 2007
Programmieren Lernen
Peter Pepper
Thinking in Java
deutsch
Document
title
Klassenentwurf
Bruce Eckel author
englisch language
releaseDate
...
Vorname
Nachname
Geburtsdatum
eMail
...
Author
Vorname firstName
Nachname lastName
Geburtsdatum birthday
eMail eMail
... ...
Sep 2007
May 2008
Effective Java
Joshua Bloch
englisch
Dokument
Programmieren Lernen
Autor
Peter Pepper
deutsch
Bewertung
...
Effective Java
Review
Joshua Bloch
englisch
Dokument document
Programmieren Lernen
Autor author
Peter Pepper
Bewertung rating
deutsch
... ...
Objektbasiertes Programmieren
Beispiel Suchmaschine
Methoden
Zusammenfassung
Beispiel Suchmaschine
Klassendiagramme
TUM - EidI 21/22 - Pretschner - S. 74
Operationen und Funktionen
Diverse Operationen haben wir bereits verwendet:
I durchschnitt(x,y)=(x+y)/2
I fahrenheit(c)=c*9/5+32
I fac(0)=1 und n>0 ⇒ fac(n)=n*fac(n-1)
I +(a,b)=a inkrementiert um b
I bitwiseor(a,b)=a bitweises oder b
Beispiele:
int fahrenheit(int celsius) {
// n i c h t Teil der Signatur :
return (celsius * 9) / 5 + 32;
}
double fahrenheit(double celsius) {
// n i c h t Teil der Signatur :
return (celsius * 9) / 5 + 32;
} TUM - EidI 21/22 - Pretschner - S. 78
Methodenaufruf
Beispiel: Ohmsches Gesetz
Syntax: Methoden-Name(Aktualparameter)
Ergebnis: Ein Element mit dem Rückgabetypen der Methode.
Beispiel:
class Rational{
double zaehler, nenner;
Rational(double z,double n) {
zaehler = z;
nenner = n;
}
}
Beispiel:
Dazu gibt es das Schlüsselwort this. Der Wert von this ist die
Adresse des entsprechenden Objekts.
Aufruf-Syntax:
Bezugsobjekt.Methoden-Name(Parameter);
Ist kein Bezugsobjekt angegeben =⇒ immer implizit this.
Point p
x 0.3e1
y 0.4e1
...
Point p Point p
x 0.3e1 x 0.5e1
y 0.4e1 y 0.8e1
... ...
class Cyclic {
int info;
Cyclic ref;
// Konstruktor
public Cyclic() {
info = 17;
ref = this;
}
...
} // end of class Cyclic
class Cyclic {
int info;
Cyclic ref;
// Konstruktor
public Cyclic() {
info = 17;
ref = this;
}
...
} // end of class Cyclic
Innerhalb eines Members kann man mithilfe von this auf das
aktuelle Objekt selbst zugreifen.
info
a
ref
info 17
a
ref
info 17
a
ref
Objektbasiertes Programmieren
Beispiel Suchmaschine
Methoden
Zusammenfassung
Beispiel Suchmaschine
Klassendiagramme
TUM - EidI 21/22 - Pretschner - S. 94
Aufrufen von Methoden
mit Bezugsklasse:
Beispiel: Weather.fahrenheit(15);
I Nur statische Methoden (Schlüsselwort static)
I Diese sind unabhängig vom Zustand konkreter Objekte
mit Bezugsobjekt:
Beispiel: p.shift(2.0, 4.0);
I Ohne expliziten Bezug wird immer this als Bezugsobjekt
angenommen
Aktuelle Koordinaten:
R2
// Attribute : Endpunkte
Beispiel: Linien im Point p1;
Point p2;
Konzept:
// Methoden
p2 Line(Point p1, Point p2) {
y2 this.p1 = p1;
p1 this.p2 = p2;
y1 }
0x818BCD48
x : 1.0 0x818BCD4C
0x818BCD50
y : 2.0 0x818BCD54
p2
p1 0x818BCD58
0x818BF00C
x : 7.0 0x818BF010
Line l = new Line(new Point(1.0, 2.0),
new Point(7.0, 4.0)); 0x818BF014
y : 4.0 0x818BF018
0x818BF01C
0x818BCD48
x : 1.0 0x818BCD4C
0x818BCD50
y : 2.0 0x818BCD54
p2
p1 0x818BCD58
0x818BF00C
x : 7.0 0x818BF010
Line l = new Line(new Point(1.0, 2.0),
new Point(7.0, 4.0)); 0x818BF014
l.shift(5.0, 8.0); y : 4.0 0x818BF018
0x818BF01C
0x818BCD48
x : 6.0 0x818BCD4C
0x818BCD50
y : 10.0 0x818BCD54
p2
0x818BCD58
0x818BF00C
x : 7.0 0x818BF010
Line l = new Line(new Point(1.0, 2.0),
new Point(7.0, 4.0)); 0x818BF014
l.shift(5.0, 8.0); y : 4.0 0x818BF018
0x818BF01C
0x818BCD48
x : 6.0 0x818BCD4C
0x818BCD50
y : 10.0 0x818BCD54
0x818BCD58
0x818BF00C
x : 12.0 0x818BF010
Line l = new Line(new Point(1.0, 2.0),
new Point(7.0, 4.0)); 0x818BF014
l.shift(5.0, 8.0); y : 12.0 0x818BF018
0x818BF01C
Denition Call-by-value
Beim Aufruf von Methoden werden alle Parameter zuerst komplett
ausgewertet und dann die Werte als Kopie an die aufgerufene
Methode übergeben.
I Ausgabe:
p.x = 3.0
p.y = 7.0
dx = 2.0
(main) p.x 1.0 (arg. s_shift) q.x = (main) p.x 1.0 (arg.s_ shift) q.x = (main) p.x 3.0 (main) p.x 3.0
(main) p.y 7.0 (arg. s_shift) q.y = (main) p.y 7.0 (arg.s_ shift) q.y = (main) p.y 7.0 (main) p.y 7.0
Beispiel:
public class Rational {
int zaehler, nenner;
...
public boolean equals(Rational r) {
return (zaehler * r.nenner == r.zaehler * nenner);
}
}
Beispiel:
I int foo(int a) {
int x = a + 1;
a = x * x; // Schlechter Programmierstil
return a + x;
}
foo(a)
int a (Parameter)
int x
x = a + 1;
a = x * x;
return a + x;
I Mathematische Lösung:
(p2.x − p1.x)2 + (p2.y − p1.y)2
p
I Methode in Java:
double length() {
return Math.sqrt((p2.x-p1.x) * (p2.x-p1.x)
+ (p2.y-p1.y) * (p2.y-p1.y));
}
I Mathematische Lösung:
(p2.x − p1.x)2 + (p2.y − p1.y)2
p
I Methode in Java (Bessere Lösung):
double length() {
return Math.sqrt(square(p2.x - p1.x)
+ square(p2.y - p1.y));
}
Objektbasiertes Programmieren
Beispiel Suchmaschine
Methoden
Zusammenfassung
Beispiel Suchmaschine
Klassendiagramme
TUM - EidI 21/22 - Pretschner - S. 110
Zusammenfassung Klassen
Eine Klassen-Deklaration besteht aus Deklarationen von:
// Objekt = Methoden :
public Rational add(Rational r) {
int x = zaehler * r.nenner +r.zaehler * nenner;
int y = nenner * r.nenner;
return new Rational (x,y);
}
public void addToThis(Rational r) {
zaehler = zaehler * r.nenner + r.zaehler * nenner;
nenner = nenner * r.nenner;
}
public boolean equals(Rational r) {
return (zaehler * r.nenner == r.zaehler * nenner);
}
public String toString() {
if (nenner == 1) return "" + zaehler;
if (nenner > 0) return zaehler +"/"+ nenner;
return (-zaehler) +"/"+ (-nenner);
}
} // end of class Rational
Beispiel:
a.inc(b);
zaehler 3 zaehler 7
a a
nenner 4 nenner 4
b 1
class C {
private Rational r1;
public C() {
r1=new Rational(1,2);
incArgByOne(r1);
// Wert von r1 jetzt 3/2 !!!!
}
private void incArgByOne(Rational r) {
r.addToThis(new Rational(1));
}
}
Objektbasiertes Programmieren
Beispiel Suchmaschine
Methoden
Zusammenfassung
Beispiel Suchmaschine
Klassendiagramme
TUM - EidI 21/22 - Pretschner - S. 120
Objekte identifizieren
Suchmaschine Programmieren Lernen
Peter Pepper
deutsch
Sep 2007
Programmieren Lernen
Peter Pepper
Thinking in Java
deutsch
Document
title
Klassenentwurf
Bruce Eckel author
englisch language
releaseDate
...
Programmieren Lernen
Objekterzeugung
Peter Pepper
deutsch
Document
title w
ne
author
language
releaseDate ne
w Thinking in Java
...
Bruce Eckel
Document()
englisch
Programmieren Lernen
ge()
986
Objektmethoden
Peter Pepper getA
deutsch getA
utho
r()
t()
tac
Con
get
P. Pepper
Author
...
Author()
getAge()
getContact()
...
getAge() ne deutsch
w
getLanguage()
Author
... w
Author() ne
getAge()
getContact() ne
w
...
getContact()
deutsch
get
Aut
hor(
)
deutsch
get
Aut
hor(
)
)
t act( get
Age
Con (
get )
P. Pepper 34 [Jahre]
Objektbasiertes Programmieren
Beispiel Suchmaschine
Methoden
Zusammenfassung
Beispiel Suchmaschine
Klassendiagramme
TUM - EidI 21/22 - Pretschner - S. 127
Klassendiagramme: Klassen
Eine graphische Visualisierung der Klasse Rational, die nur die
wesentliche Funktionalität berücksichtigt, könnte so aussehen:
Rational
− zaehler : int
− nenner : int
Besteht ein System aber aus sehr vielen Klassen, kann man
damit die Beziehungen zwischen verschiedenen Klassen
verdeutlichen.
Besteht ein System aber aus sehr vielen Klassen, kann man
damit die Beziehungen zwischen verschiedenen Klassen
verdeutlichen.
UML wurde nicht speziell für Java entwickelt. Darum werden Typen
abweichend notiert. Auch lassen sich manche Ideen nicht oder nur
schlecht modellieren.
Line Point
p1
x,y: double
p2
shift(dx, dy: double) : void rotate(angle:double) : void
shift(dx,dy:double) : void
1
Cyclic