Klassen

Werbung
2
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 04/05
First things first,
but not necessarily in that order.
- Dr. Who, Meglos
Ziele
Klassen
ƒ Verstehen des Syntax einer Java-Klasse und ihrer graphischen
Beschreibung in UML
ƒ Verstehen des Speichermodells von Java
Martin Wirsing
ƒ Lernen Objekte zu erzeugen und einfache Methoden zu schreiben
in Zusammenarbeit mit
Michael Barth, Philipp Meier und Gefei Zhang
11/04
M. Wirsing: Klassen
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 04/05
3
4
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 04/05
Einfache Klassen in Java und UML
Einfache Klassen in Java und UML
Eine Klassendeklaration in Java hat die Gestalt
ƒ Objekte
Objekte sind kleine Programmstücke.
überall
sichtbar
{
Jedes Objekt hat spezifische Fähigkeiten.
Objekte kooperieren, um eine umfangreiche Aufgabe
gemeinsam zu erfüllen
ƒ Klassen
Klassen sind Fabriken für Objekte.
public c(params1) {body1}
...
Konstruktor
formaler
Parameter
public typem+1 methodName1(params1) {body1}
...
public typem+n methodNamen(paramsn) {bodyn}
Methode
Jedes Objekt gehört zu genau einer Klasse; es ist Instanz dieser Klasse
}
Ergebnistyp
M. Wirsing: Klassen
private type1 attr1;
...
nur
innerhalb der
Klasse
sichtbar
Jede Klasse kann einen ganz bestimmten Typ
von Objekten erzeugen.
Attribut
(engl. field)
public class C
M. Wirsing: Klassen
Kopf der Methode
Rumpf der
Methode
5
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 04/05
Klasse Point
Einfache Klassen in Java und UML
public class Point
{
private int x,y;
Klassenname
vordefinierte lokale
Variable this
bezeichnet das gerade
betrachtete Objekt
In UML wird eine Klasse C folgendermaßen repräsentiert (angepasst an
Java-Syntax):
C
public Point(int x0, int y0)
{
this.x = x0;
this.y = y0;
}
public void move(int dx, int dy)
{
this.x = this.x + dx;
this.y = this.y + dy;
}
type1
...
typem
attr1
attrm
typem+1 methodName1(params1)
...
typem+n methodNamen(paramsn)
y-Koordinate
von this
Bemerkung
ƒ In UML wird eine Pascal-ähnliche Syntax für Attribut- und Methodendeklarationen
public int getX()
{
return this.x;
}
Rückgabe des
Ergebniswerts
6
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 04/05
verwendet. Wir haben dies zugunsten einer einheitlichen Syntax an Java angepasst.
ƒ Die Konstruktoren werden meist nicht im Klassendiagramm aufgeführt.
ƒ Die Methodenrümpfe erscheinen nicht im UML-Klassendiagramm, da UML-Diagramme zur
abstrakteren Repräsentation von Klassen verwendet werden.
public int getY()
{
return this.y;
}
ƒ Man kann Methodenrümpfe als Notizen an das Diagramm hängen.
}
M. Wirsing: Klassen
M. Wirsing: Klassen
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 04/05
7
8
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 04/05
Notizen in UML
Beispiel:
Beispiel
In UML wird die Klasse Point folgendermaßen repräsentiert:
„-“ für private
this.x = this.x + dx;
Point
-int
-int
x
y
+void move (int dx, int dy)
+int getX ()
+int getY ()
„+“ für public
M. Wirsing: Klassen
this.y = this.y + dy;
Point
-int
-int
x
y
+void move (int dx, int dy) +int getX ()
+int getY ()
M. Wirsing: Klassen
Notiz
(für Rumpf
von move)
9
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 04/05
Objekte und deren Speicherdarstellung
Objekte sind Referenztypen
ƒ In einer Objektvariable wird nur ein Zeiger (Link, Referenz) auf das
wirkliche Objekt gespeichert
Jeder Zustand eines sequentiellen Java-Programms besteht aus
ƒ einem Keller für die lokalen Variablen
Zeiger
(Link, Referenz)
ƒ einer Halde („heap“) für die Objekte
3
b
true
ƒ Die Java Maschine kümmert sich um Platz für die Daten des Objekts.
o
z
p
z
q
z
Lokale
Variablen
Keller
ƒDazu gehört
...
:Point
x = 1
y = 2
Zeiger auf Objekt von Point
ƒ Point p;
:C
i
10
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 04/05
ƒ Besorgung von zusätzlichem Platz bei Bedarf
ƒ Recyclen von nicht mehr benötigem Platz
Dies heißt: Garbage Collection
Objekte der
Klasse Point
ƒ Der Programmierer hat stets einen Link auf das Objekt zur Verfügung
:Point
x = 2
y = 1
Halde
M. Wirsing: Klassen
i
3
p
z
:Point
x = 1
y = 2
M. Wirsing: Klassen
11
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 04/05
Objekte und deren Speicherdarstellung
In UML wird ein Objekt der Klasse C folgendermaßen repräsentiert:
Objektinstanz
mit Name
objektName: C
:C
attr1 = wert1
...
attrm = wertm
attr1 = wert1
...
attrm = wertm
Objektinstanz
OHNE Name
(„anonymes“ Objekt)
12
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 04/05
Objekte und deren Speicherdarstellung
Beispiel: Objekte der Klasse Point
Objektinstanz
mit Name
@123 : Point
: Point
x= 1
y= 2
x= 1
y= 2
Objektinstanz
OHNE Name
(„anonymes Objekt)
Zwei VERSCHIEDENE Objekte der Klasse Point mit gleichen Attributwerten!
M. Wirsing: Klassen
M. Wirsing: Klassen
13
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 04/05
14
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 04/05
Objekte und deren Speicherdarstellung
Objekte und deren Speicherdarstellung
Durch Zuweisung verändert sich der Wert der Instanzvariable
Nachher
p.x = p.x + 2;
:C
Instanzvariable
Beispiel
i
3
:C
b
true
...
o
z
p
z
q
z
Vorher
i
3
b
true
o
z
p
z
q
z
Lokale
Variablen
@123:Point
x = 1
y = 2
Halde
Keller
...
@123:Point
x = 3
y = 2
:Point
x = 2
y = 1
:Point
x = 2
y = 1
M. Wirsing: Klassen
M. Wirsing: Klassen
15
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 04/05
Objekte und deren Speicherdarstellung
Methodenaufruf verändert den Zustand
16
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 04/05
Zuweisung von Objekten
Bei Zuweisung von Objekten werden nur die Referenzen übernommen
Beispiel
p = q;
q.move(2, 2); ergibt
Vorher
:C
i
3
b
true
o
z
p
z
q
z
...
@123:Point
x = 3
y = 2
:C
i
3
b
true
o
z
p
z
q
z
:Point
x = 4
y = 3
M. Wirsing: Klassen
...
@123:Point
x = 3
y = 2
:Point
x = 4
y = 3
M. Wirsing: Klassen
17
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 04/05
18
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 04/05
Zuweisung von Objekten
Datenmüll
ƒ Nach der Zuweisung ist ein Objekt unerreichbar geworden
Bei Zuweisung von Objekten werden nur die Referenzen übernommen
ƒ Kein Link zeigt mehr darauf
ƒ Es ist Müll (engl.: garbage) und wird automatisch vom
Speicherbereinigungsalgorithmus („Garbage Collector“) gelöscht
p = q;
:C
i
3
b
true
o
z
p
z
q
z
:C
...
@123:Point
x = 3
y = 2
i
3
b
true
o
z
p
z
q
z
:Point
x = 4
y = 3
Nachher
Müll
(„Garbage“)
:Point
x = 4
y = 3
M. Wirsing: Klassen
M. Wirsing: Klassen
19
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 04/05
20
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 04/05
Beeinflussung, Manipulation
Beeinflussung, Manipulation
ƒ Wenn zwei Referenzen auf das gleiche Objekt zeigen
ƒ Wenn zwei Referenzen auf das gleiche Objekt zeigen
ƒ Jedes kann die Felder des anderen beeinflussen
ƒ Ein Name ist dann ein sog. Alias für den anderen
Beispiel
...
@123:Point
x = 3
y = 2
ƒ Jedes kann die Felder des anderen beeinflussen
ƒ Ein Name ist dann ein sog. Alias für den anderen
q.x = 25; ändert die x-Koordinate von p
Beispiel
q.x = 25; ändert die x-Koordinate von p
:C
i
3
b
true
o
z
p
z
q
z
...
q ist Alias
für p
Vorher
M. Wirsing: Klassen
:C
i
3
b
true
o
z
p
z
q
z
:Point
x = 4
y = 3
...
q ist Alias
für p
:Point
x = 25
y = 3
M. Wirsing: Klassen
Nachher
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 04/05
21
22
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 04/05
Erzeugung von Objekten und Konstruktoren
Erzeugung von Objekten: Beispiel Point
Will man einer lokalen Variablen var ein neues Objekt der Klasse C
zuweisen, schreibt man
Konstruktor von Point erzeugt
neues Point-Objekt
Konstruktor
var = new C(x0);
p = new Point(5,5);
erzeugt ein neues Objekt der Klasse C, auf
das var zeigt und das durch den
Konstruktoraufruf C(x0) initialisiert wird
ergibt
:C
M. Wirsing: Klassen
i
3
b
true
o
z
p
z
q
z
...
:Point
:Point
x = 5
y = 5
x = 6
y = 3
M. Wirsing: Klassen
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 04/05
23
24
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 04/05
Konstruktor
Konstruktor
ƒ Wird ein Attribut durch einen Konstruktor nicht explizit initialisiert, so wird es mit
ƒ Ein Konstruktor dient zur Initialisierung der Attribute eines neu erzeugten
dem Standardwert seines Typs implizit initialisiert.
Objekts.
ƒ Der Standardwert für
int
double
boolean
C (Klassentyp)
ƒ Ein Konstruktor hat den gleichen Namen wie seine Klasse
ƒ Er ist keine Methode, da er nicht auf ein Objekt angewendet werden
ist
ist
ist
ist
0,
0.0,
false,
null,
kann, sondern immer nach „new“ stehen muß.
wobei null das NICHT-ERZEUGTE Objekt repräsentiert.
ƒ Beispiel: p.Point(5,5) ergibt einen Syntaxfehler.
ƒ Beispiel: Deklariere Konstruktor Point(){} in Klasse Point
p = new Point(); initialisiert die Attribute x,y des neuen Objekts mit 0 .
M. Wirsing: Klassen
i
3
p
z
M. Wirsing: Klassen
:Point
x = 0
y = 0
25
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 04/05
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 04/05
Null
ƒ
26
Mehrere Konstruktoren
null bezeichnet das NICHT-ERZEUGTE Objekt ;
ƒ Mehrere Konstruktoren sind möglich
ƒ Überladene Konstruktoren müssen aber eine unterschiedliche Parameterliste
aufweisen, durch die sie eindeutig unterschieden werden können.
es ist ein Zeiger, der auf kein Objekt zeigt.
Der Aufruf null.m; einer Methode mit dem null-Zeiger ist
!
verboten und führt zu einem (Compilezeit-)Fehler.
ƒ Ebenso führt
Point p1 = null;
i
3
p1
z
Beispiel:
Ein zweiter Konstruktor in der Klasse Point ist der Standardkonstruktor
Point(){}
und dann
p1.move(1,1);
zu einem Laufzeit-Fehler, bei dem eine „NullPointerException“ erzeugt wird und
das Programm abbricht.
M. Wirsing: Klassen
M. Wirsing: Klassen
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 04/05
Implementierung einer UML-Klasse
Für jede Methode einer Klasse muß eine Implementierung (in Java)
angegeben werden. Z.B. zur Implementierung der Klasse
Point
int
int
27
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 04/05
Methodenimplementierung: Abkürzung
Innerhalb einer Methodenimplementierung ist der Name von this eindeutig
und kann weggelassen werden, wenn keine Namenskonflikte auftreten.
x
y
int getX()
int getY()
void move (int dx, int dy)
public void move(int dx, int dy)
{
x = x + dx;
y = y + dy;
}
Aber: Die folgende Implementierung von move benötigt die explizite
Verwendung von this.
müssen für alle 3 Methoden Implementierungen durch Methodenrümpfe
angegeben werden; außerdem müssen die Konstruktoren implementiert
werden.
M. Wirsing: Klassen
28
public void move(int x, int y)
{
this.x = this.x + x;
this.y = this.y + y;
}
M. Wirsing: Klassen
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 04/05
29
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 04/05
Benutzen von Klassen
Benutzen von Klassen
Eine Klasse besteht aus einer Menge von Attributen und Methodenrümpfen. Um
die Methoden ausführen zu können, braucht man eine Klasse mit einer Methode
main. Im einfachsten Fall hat diese die Gestalt einer einfachen Klasse.
Achtung:
ƒ Wenn man zwei oder mehr Klassen in einer Datei vereinbart, darf genau
eine dieser Klassen eine Methode main besitzen. Der Name der Datei
muß der Name dieser Klasse mit Suffix .java sein
Beispiel
public class PointMain
{ public static void main (Stringl[]args)
{
Point p = new Point(10,20);
Point p1 = new Point();
System.out.println(„p=Point[x = “+p.getX()+“, y = “+p.getY()+“]“);
System.out.println(„p1=Point[x = “+p1.getX()+“, y = “+p1.getY()+“]“);
ƒ Beispiel: Die Datei PointMain.java enthält eine Klasse PointMain
mit Methode main.
Mögliche andere Klassen in dieser Datei dürfen keine Methode main
enthalten.
p1.move(10,10);
System.out.println(„p1=Point[x = “+p1.getX()+“, y = “+p1.getY()+“]“);
}
}
M. Wirsing: Klassen
M. Wirsing: Klassen
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 04/05
31
Zusammenfassung
ƒ
Klassen werden graphisch durch UML-Diagramme dargestellt und in Java
implementiert.
ƒ
Jede Instanz-Methode hat einen impliziten Parameter – das Objekt mit dem die
Variable aufgerufen wird – und 0 oder mehr explizite Parameter.
ƒ
Objekte werden mit dem new-Operator erzeugt, gefolgt von einem Konstruktor.
ƒ
Zahlartige Variablen haben Zahlen als Werte, lokale Variablen vom Objekttyp
haben Zeiger (Referenzen) als Werte. Um Aliasing zu vermeiden, muß man die
betreffenden Objekte kopieren.
ƒ
Der null-Zeiger zeigt auf kein Objekt. Der Aufruf einer Methode null (als
implizitem Parameter) führt zu einem Fehler.
ƒ
Instanzvariablen (Attribute) werden in Java implizit initialisiert; dagegen müssen
lokale Variablen explizit initialisiert werden.
M. Wirsing: Klassen
30
Herunterladen