4. Objektorientierung I Grundlagen der Programmierung 1 (Java)

Werbung
4. Objektorientierung I
Grundlagen der
Programmierung 1 (Java)
Fachhochschule Darmstadt
Haardtring 100
D-64295 Darmstadt
Prof. Dr. Bernhard Humm
FH Darmstadt, 11. Oktober 2005
Einordnung im Kontext der Vorlesung
1. Einführung
10. Software-Qualität
2. Einfache Programme
11. Algorithmen und Datenstrukturen II
3. Kontrollstrukturen
12. Objektorientierung II
4. Objekt-Orientierung I
13. Komponenten
5. Algorithmen und Datenstrukturen I
14. Design
6. Interfaces
15. Die Java Klassenbibliothek I
7. Rekursion
16. Die Java Klassenbibliothek II
8. Pakete
17. Software-Kategorien
9. Fehler und Ausnahmen
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
11.10.2005, Seite 2
Agenda
Agenda
Klassen
Klassen und
undObjekte
Objekte
Vererbung
Eclipse
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
11.10.2005, Seite 3
Klassen und Objekte
Wiederholung: Datentypen
Datentyp =
Wertebereich + Operationen
Äpfel können nicht mit Birnen verglichen werden
Zentrales Konzept der Informatik
Bekannt aus der Mathematik: Gruppen, Körper,
Ringe, Algebren
Auch Datenstruktur, abstrakter Datentyp genannt
In Programmiersprache zusätzlich: Darstellung im Speicher
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
11.10.2005, Seite 4
Klassen und Objekte
Objektorientierung = Programmierung mit Datentypen
(Klassen und Objekte)
Beispiel: Bruchzahlenklasse
class Fraction {
f1.mult(f2);
int z; // Zähler
int n; // Nenner
void mult (Fraction f) {
this.z = this.z * f.z;
this.n = this.n * f.n;
}
void add (Fraction f) {
this.z = this.z * f.n + f.z * this.n;
this.n = this.n * f.n;
}
mult
z
add
n
abgeschlossener Baustein
}
• mult und add sind lokal zu Fraction (können auf Fraction-Objekte angewendet werden)
• this bezeichnet "dieses Objekt", auf das die Operation angewendet wird
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
11.10.2005, Seite 5
Klassen und Objekte
Klassen und Objekte
cd Fraction
Klasse = Datentyp
(wiederkehrendes
Muster einzelner
Objekte)
Fraction 3/4
Objekt = einzelnes
Exemplar (Instanz)
Objekte werden
instanziiert
Objekte haben eine
Identität (welche
Objekte sind gleich?)
Fraction
-
numerator: int
denominator: int
+
+
add(Fraction) : void
mult(Fraction) : void
Fraction 6/8
Fraction 42/42
Notation: UML (Unified
Modeling Language)
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
11.10.2005, Seite 6
Klassen und Objekte
Instanziierung von Klassen:
Konstruktoren
Spezielle Methoden, die beim Erzeugen eines Objekts automatisch aufgerufen werden
class Fraction {
int z, n;
Fraction (int z, int n) {
this.z = z; this.n = n;
}
•
•
•
•
•
dienen zur Initialisierung eines Objekts
heißen wie die Klasse
ohne Funktionstyp und ohne void
können Parameter haben
können überladen werden
Fraction () {
z = 0; n = 1;
}
void mult (Fraction f) {...}
void add (Fraction f) {...}
}
Aufruf
Fraction f = new Fraction(3, 5);
Fraction g = new Fraction();
• legt neues Fraction-Objekt an
• ruft für dieses Objekt den Konstruktor auf
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
11.10.2005, Seite 7
Klassen und Objekte
Attribute (Member Variablen):
die Daten des Datentyps
Attribute sind die Daten des
Datentyps
class Fraction {
int z; // Zähler
int n; // Nenner
Sie werden deklariert wie die
Variablen in einer Methode:
Typ Variable [= Ausdruck];
void mult (Fraction f) {
this.z = this.z * f.z;
this.n = this.n * f.n;
}
Type kann ein primitiver Datentyp
sein oder eine Klasse
void add (Fraction f) {
this.z = this.z * f.n + f.z * this.n;
this.n = this.n * f.n;
}
Sie werden verwendet mit der
Punktnotation:
Objekt.Variable
this (Schlüsselwort) referenziert
das aktuelle Objekt
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
}
11.10.2005, Seite 8
Klassen und Objekte
Weglassen von this
class Fraction {
int z, n;
void mult (Fraction f) {
z = z * f.z;
n = n * f.n;
}
z und n sind eindeutig.
Compiler fügt this automatisch ein
void add (Fraction n) {
z = z * n.n + this.n * n.z;
this.n = this.n * n.n;
}
n wäre nicht eindeutig.
Qualifikation mit this nötig
}
this kann weggelassen werden, wenn der restliche Name eindeutig ist
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
11.10.2005, Seite 9
Klassen und Objekte
Methoden:
die Operationen des Datentyps
Methoden können ausschließlich
im Kontext von Klassen deklariert
werden: alles bisher gesagte
über Methoden gilt
class Fraction {
int z; // Zähler
int n; // Nenner
Deklaration: Modifier
Rückgabetyp Name
(Parameterliste) {Anweisungen}
void mult (Fraction f) {
this.z = this.z * f.z;
this.n = this.n * f.n;
}
Aufruf mit Punktnotation:
Objekt.Methode(aktuelle
Parameter)
void add (Fraction f) {
this.z = this.z * f.n + f.z * this.n;
this.n = this.n * f.n;
}
}
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
11.10.2005, Seite 10
Klassen und Objekte
Senden von Nachrichten:
Hey object, do something!
Der Aufruf von Methoden wird
auch als „Senden von
Nachrichten“ bezeichnet
cd Account
Vorstellung: Objekte sind wie
Personen der realen Welt, die
bestimmte Fähigkeiten haben
und Befehle ausführen können
withdraw (42)
myAccount
Customer
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
11.10.2005, Seite 11
Klassen und Objekte
Objektorientierung:
Simulation der realen Welt
Objektorientes Design und
Programmierung bedeutet
Objekte der realen Welt
modellieren
Idee von Simula, der Großmutter
aller objektorientierten Sprachen:
Simulation der realen Welt
Sprachen wie UML erlauben die
Modellierung der realen Welt mit
graphischen Mitteln
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
cd Bank
Account
Customer
Inv oice
Product
11.10.2005, Seite 12
Klassen und Objekte
Geheimnisprinzip (Information Hiding): eines der
wichtigsten Konzepte des Software Engineering
Information Hiding (D.L. Parnas, 1972):
– Implementierung komplexer Datenstrukturen soll in einer Klasse (Modul) verborgen
werden
– Nutzer erhalten nur eine abstrakte Sicht auf die Daten (abstrakte Datenstrukturen)
– Datenzugriff nur über die Methoden (Encapsulation = Kapselung)
Gekapselte (abstrakte) Datenstrukturen besitzen einen Zustand ("Gedächtnis"), der
durch Zugriffsprozeduren geändert werden kann
Die Datenkapselung hat folgende Vorteile:
– Gekapselte Datenstrukturen sind einfacher nutzbar (reduzierte Komplexität)
– Sie können ohne Auswirkung auf andere Klassen geändert werden
Es bestehen jedoch auch Nachteile:
– Zugriff etwas weniger effizient
– Eingeschränkte Flexibilität des Zugriffs, da nur über Prozeduren der Schnittstelle auf
die Daten zugegriffen werden kann
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
11.10.2005, Seite 13
Klassen und Objekte
Steuerung der Sichtbarkeit:
Modifier
Modifier:
– private: nur innerhalb der
Klasse sichtbar
class Fraction {
private int z; // Zähler
private int n; // Nenner
– public: überall sichtbar
public int getZ () {
return this.z;
}
– protected, package scope:
Mischformen (später)
public int getN () {
return this.n;
}
Gilt für Variablen und Methoden
Variablen sollten in der Regel
private deklariert werden. Soll
lesender und / oder schreibender
Zugriff explizit erlaubt werden,
dann über Getter / SetterMethoden
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
…
}
11.10.2005, Seite 14
Klassen und Objekte
Identität und Referenzen
Ein Konstruktor-Aufruf stellt
Speicherplatz für die Variablen
bereit, initialisiert eventuell und
gibt stets eine Referenz auf das
Objekt zurück (Uniform
Reference Semantics)
Referenzen sind stets implizit
(keine Pointer Arithmetik wie in C
/ C++)
Zuweisung (=) von Objekten ist
Zuweisung ihrer Referenzen
Gleichheit (==) von Objekten ist
Gleichheit der Referenzen
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
class Fraction {
int z, n;
Fraction (int z, int n) {
this.z = z; this.n = n;
}
…
boolean equals (Fraction f) {
return (z == f.z)&&(n==f.n)
}
}
Fraction f1, f2, f3;
boolean b1, b2, b3;
f1 = new Fraction(3, 4);
f2 = new Fraction(3, 4);
f3 = f1;
b1 = f1 == f2; // true oder false?
b2 = f1 == f3;
b3 = f1.equals(f2);
11.10.2005, Seite 15
Klassen und Objekte
null:
Die Referenz auf kein Objekt
null (Schlüsselwort) ist die
Referenz auf kein Objekt
null kann jeder Variable vom
Referenztyp zugewiesen werden
null belegt den gleichen
Speicherplatz wie eine
Objektreferenz
Wird eine Methode auf null
aufgerufen, so erkennt das der
Compiler i. A. nicht Fehler
NullPointerException
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
class Fraction {
private int z; // Zähler
private int n; // Nenner
Fraction (int z, int n) {
this.z = z; this.n = n;
}
public int getZ () {
return this.z;
}
}
Fraction f = null; // auch implizit
f.getZ() // NullPointerException!
f = new Fraction(3, 4);
f.getZ() // 3
11.10.2005, Seite 16
Klassen und Objekte
Call-by-value und Uniform Reference Semantics
Wiederholung Methodenaufruf:
aktuelle Parameter werden an
formale Parameter gebunden
(call-by-value)
Was ist, wenn der aktuelle
Parameter ein Objekt ist?
Dann wird die Referenz an den
formalen Parameter gebunden
(ist nach wie vor call-by-value,
wirkt aber wie call-by-reference)
Unerwünschte Seiteneffekte
können nur passieren, wenn die
Objekte nicht gekapselt sind
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
class Weird {
void doSideEffect (Fraction f) {
int tmp = f.z;
f.z = f.n;
f.n = tmp;
}
}
Fraction f = null;
Weird w = null;
int z = 0;
boolean b = false;
f = new Fraction(3, 4);
z = f.z
w = new Weird();
w.doSideEffect(f);
b = (z == f.z) // true oder false?
11.10.2005, Seite 17
Klassen und Objekte
Überladen von Methoden
Signatur = Methodenname +
Parameterliste
class Fraction {
private int z; // Zähler
private int n; // Nenner
Zwei oder mehrere Methoden
können innerhalb eines
Gültigkeitsbereichs denselben
Namen besitzen,
void mult (Fraction f) {
this.z = this.z * f.z;
this.n = this.n * f.n;
}
– wenn sie eine unterschiedliche
Anzahl von Parametern
besitzen oder
– wenn sich die Parametertypen
an entsprechender Stelle
unterscheiden
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
void mult (Fraction f1, Fraction f2) {
this.z = this.z * f1.z * f2.z;
this.n = this.n * f1.n * f2.n;
}
}
11.10.2005, Seite 18
Klassen und Objekte
Klassenvariablen und -methoden
Bisher betrachtete Variablen und
Methoden beziehen sich auf die
einzelne Objekte Instanzvariablen / -methoden
class Customer {
// class variables
public static int numberOfCustomers;
// instance variables
private String name;
…
Variablen, Konstanten und
Methoden, die sich auf alle
Objekte beziehen Klassenvariablen / Methoden
// class methods
public static Customer makeCustomer
(String name, …) {…}
public static Customer findCustomer
(int number) {…}
Typische Beispiele:
Instanziierung, Suche
Keyword in Java: static
Häufig werden statt dessen auch
Managerklassen verwendet
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
// instance methods
public void changeAddress
(String newAdress) {…}
}
11.10.2005, Seite 19
Klassen und Objekte
Klassen, Objekte, Klassenvariablen, Klassenmethoden,
Instanzvariablen, Instanzmethoden – Was ist was?
Kunde
nimm Kredit auf
Kundennummer
Kredit
Konto
suche Kunden
drucke Kontoauszug
Zahlungslauf
Kontoauszugsdrucker
Mehrwertsteuersatz
Anzahl der Kunden
rechne in Fremdwährung um
führe Zahlungslauf durch
Betrag
hebe Geld ab
Währung
zahle Geld ein
Bank
lege neuen Kunden an
IP-Adresse
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
11.10.2005, Seite 20
Klassen und Objekte
Beispiel: Stack und Queue
Stack (Kellerspeicher)
push(x);
x = pop();
fügt x hinten an den Stack an
entfernt und liefert hinterstes Stackelement
push(3);
3
push(4);
3
x = pop();
3
LIFO-Datenstruktur
(last in first out)
4
// x == 4
// y == 3
y = pop();
Queue (Puffer, Schlange)
put(x);
x = get();
fügt x hinten an die Queue an
entfernt und liefert vorderstes Queueelement
put(3);
3
put(4);
3
x = get();
y = get();
FIFO-Datenstruktur
(first in first out)
4
4
// x == 3
// y == 4
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
11.10.2005, Seite 21
Klassen und Objekte
Klasse Stack
class Stack {
int[] data;
int top;
Stack (int size) {
data = new int[size]; top = -1;
}
void push (int x) {
if (top >= data.length)
Out.println("-- overflow");
else
data[++top] = x;
}
int pop () {
if (top < 0) {
Out.println("-- underflow");
return 0;
} else
return data[top--];
}
}
Deklaration eines Array
data
top
Instanziierung eines Array
Schreibender Zugriff auf ein Array
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
Lesender Zugriff auf ein Array
Benutzung
Stack s = new Stack(10);
s.push(3);
s.push(6);
int x = s.pop() + s.pop(); // x == 9
11.10.2005, Seite 22
Klassen und Objekte
Klasse Queue
class Queue {
int[] data;
int head, tail;
Queue (int size) {
data = new int[size]; head = 0; tail = 0;
}
void put (int x) {
if ((tail+1) % data.length == head)
Out.println("-- overflow");
else {
data[tail] = x;
tail = (tail+1) % data.length;
}
}
int get () {
if (head == tail) {
Out.println("-- underflow"); return 0;
} else
int x = data[head];
head = (head+1) % data.length;
return x;
}
Bernhard
Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
}
data
head
tail
data
tail
head
Benutzung
Queue q = new Queue(10);
q.put(3);
q.put(6);
int x = q.get(); // x == 3
int y = q.get(); // y == 6
11.10.2005, Seite 23
Klassen und Objekte
Ausblick zum Weiterdenken
Wie werden Objekte auf dem Runtime Stack abgelegt?
Was ist ein Heap?
Was ist Garbage Collection und wie funktioniert es?
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
11.10.2005, Seite 24
Agenda
Agenda
Klassen und Objekte
Vererbung
Vererbung
Eclipse
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
11.10.2005, Seite 25
Vererbung
Klassifikation
Dinge der realen Welt lassen sich oft klassifizieren
z.B. Artikel eines Web-Shops
Artikel
Buch
HardCover SoftCover eBook
Audio
CD
Cassette
...
Kamera
Digital
Analog
Man beachte
Vererbung
• Ein eBook hat alle Eigenschaften eines Buchs; zusätzlich hat es ...
Ein Buch hat alle Eigenschaften eines Artikels; zusätzlich hat es ...
• CD und Cassette lassen sich gleichermaßen als Audio behandeln
Buch, Audio und Kamera lassen sich gleichermaßen als Artikel behandeln
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
11.10.2005, Seite 26
Vererbung
Vererbung
class Article {
int code;
int price;
boolean available() {...}
void print() {...}
Article(int c, int p) {...}
}
Oberklasse
Basisklasse
class Book extends Article {
String author;
String title;
void print() {...}
Book(int c, int p,
String a, String t) {...}
}
Unterklasse
Article
code
price
available()
print()
Article(c, p)
erbt: code, price, available, print
ergänzt: author, title, Konstruktor
überschreibt: print
Book
author
title
print()
Book(c, p, a, t)
Wenn keine Oberklasse angegeben wird, ist sie Object
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
11.10.2005, Seite 27
Vererbung
Überschreiben von Methoden
class Article {
...
void print() {
Out.print(code + " " + price);
}
Article(int c, int p) {
code = c; price = p;
}
}
Benutzung
Book book = new Book(code, price, author, title);
⇒ erzeugt Book-Objekt
⇒ Book-Konstruktor
⇒ Article-Konstruktor (code = c; price = p;)
author = a; title = t;
book
class Book extends Article {
...
void print() {
super.print();
Out.print(" " + author + ": " + title);
}
Book(int c, int p, String a, String t) {
super(c, p);
author = a; title = t;
}
code
price
author
title
book.print();
⇒ print aus Book
⇒ print aus Article
⇒ Out.print(...);
code price
author: title
Ausgabe: code price author: title
}
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
11.10.2005, Seite 28
Vererbung
Klassenhierarchien
Article
code
price
Jedes Buch ist ein Artikel
Aber: nicht jeder Artikel ist ein Buch
available()
print()
Book
Audio
Camera
author
title
songs
supplier
print()
print()
print()
...
CD
Cassette
tracks
lengh
print()
print()
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
...
11.10.2005, Seite 29
Vererbung
Kompatibilität zwischen Klassen
Unterklassen sind Spezialisierungen ihrer Oberklassen
Book-Objekte können Article-Variablen zugewiesen werden
Article a = new Book(code, price, author, title);
a
code
price
author
title
if (a instanceof Book)
Book b = (Book) a;
b
code
price
author
title
nur Article-Felder sind über a zugreifbar
a.code
a.price
// Laufzeittyptest
// Typumwandlung mit Laufzeittypprüfung
alle Book-Felder sind über b zugreifbar
b.code
b.price
b.author
b.title
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
11.10.2005, Seite 30
Vererbung
Dynamische Bindung
Heterogene Datenstruktur
Article
Article[] a;
available()
print()
Book CD
Book
Camera
CD
Alle Varianten können als Artikel behandelt werden
void printArticles() {
for (int i = 0; i < a.length; i++) {
if (a[i].available()) {
a[i].print();
}
}
}
Book
Audio
Camera
print()
print()
print()
ruft geerbtes available() aus Article auf
ruft je nach Artikelart das print() aus
Book, CD oder Camera auf
Dynamische Bindung
obj.print() ruft die print-Methode des Objekts auf, auf das obj gerade zeigt
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
11.10.2005, Seite 31
Agenda
Agenda
Klassen und Objekte
Vererbung
Eclipse
Eclipse
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
11.10.2005, Seite 32
Eclipse
Die integrierte Enwicklungsumgebung Eclipse
http://www.eclipse.org/
Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006
11.10.2005, Seite 33
Herunterladen