Objektorientierte Programmierung OOP

Transcription

Objektorientierte Programmierung OOP
10 Wiederholung der Grundelemente in Java
10.1 Java allgemein
– 10.1.1 Grundkonzept von Java
–
–
–
–
–
–
Objektorientierte Programmierung OOP
Objektorientierte Programmierung (OOP) mit Java
10.4 Implementierung objektorientierter Konzepte in Java
– 10.4.1 Klassen
10.1.2 Sprachelemente, Datentypen und Variablen
10.1.3 Operatoren
10.1.4 Datenfelder
10.1.5 Zeichenketten
10.1.6 main-Teil und Parameterübergabe
10.1.7 Bedingungen und Schleifen
– 10.4.2 Objekte
– 10.4.3 Mehrere Objekte von einer Klasse
– 10.4.4 Schrittweises Vorgehen zur Implementierung
objektorientierter Konzepte in Java
10.5 Arrays von Objekten
– 10.5.1 Anlegen von Arrays von Objekten
– 10.5.2 Default-Werte von Objekten
– 10.5.3 Schrittweises Vorgehen zum Anlegen von Arrays
von Objekten
10.2 Wiederholung der grundlegenden
Programmstrukturen
– 10.2.1 Anweisungen
10 Wiederholung der Grundelemente in Java
– 10.2.2 Verzweigungen aufgrund von Bedingungen
– 10.2.3 Wiederholungen mit Schleifen
10.6 Methoden
– 10.2.4 Blöcke, Funktionen, Objekte
10.7 Vererbung
10.3 Konzepte objektorientierter Programmiersprachen
– 10.3.1 Klassen, Objekte
– 10.3.2 Attribute, Methoden, Kapselung
– 10.3.3 Beziehungen, Vererbung, Assoziation,
Komposition, Aggregation
– 10.3.4 Polymorphismus, Überladen und
Wiederverwendung
10.8 Konstruktoren
– 10.8.1 Definition von Konstruktoren
– 10.8.2 Anwendung von Konstruktoren
10.9 Pakete
10.10 Java-Dokumentation
10.11 Modifiers für Zugriffsspezifizierung
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
2
10.1 Java allgemein
10.1 Java allgemein
– 10.1.1 Grundkonzept von Java
– 10.1.2 Sprachelemente, Datentypen und Variablen
– 10.1.3 Operatoren
– 10.1.4 Datenfelder
– 10.1.5 Zeichenketten
– 10.1.6 main-Teil und Parameterübergabe
– 10.1.7 Bedingungen und Schleifen
10.1.1 Grundkonzept von Java
Java wurde in den 90er Jahren von Sun Microsystems entwickelt. Und Java wird von Sun
sowie anderen Anbietern ständig weiterentwickelt.
Java wird in verschiedenen Versionen als JDK bzw. SDK (Java bzw. Software Development
Kit) gratis zur Verfügung gestellt (für Linux, Windows, Solaris...). D.h. die notwendigen
Komponenten von Java sind frei verfügbar (Klassen, javac, java, javadoc, appletviewer...).
10.2 Wiederholung der grundlegenden Programmstrukturen
Java läuft plattformunabhängig und architekturneutral auf verschiedensten Systemen und
über verteilte Systeme hinweg. In Java wurde die Plattformunabhängigkeit durch das
Konzept der virtuellen Maschine (VM; Java virtual machine = JVM) realisiert.
10.3 Konzepte objektorientierter Programmiersprachen
10.4 Implementierung objektorientierter Konzepte in Java
Der Java-Quelltext (gespeichert als Javafile.java) wird mittels des Java-Compilers javac in
Java-Bytecode (gespeichert als Javafile.class) übersetzt.
10.5 Arrays von Objekten
10.6 Methoden
Der Bytecode wird auf jedem Computer, auf dem die Java Virtual Machine läuft, mittels des
Java-Interpreters java zur Laufzeit interpretiert und ausgeführt.
10.7 Vererbung
10.8 Konstruktoren
10.9 Pakete
Editor
10.10 Java-Dokumentation
Java
Sourcecode
(.java)
Java
Compiler
Java
Bytecode
(.class)
JVM
10.11 Modifiers für Zugriffsspezifizierung
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
3
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
4
10.1.1 Grundkonzept von Java
10.1.2 Sprachelemente, Datentypen und Variablen
Java ist vollständig und konsequent objektorientiert; d.h. außerhalb von Klassen gibt es
weder Funktionen noch Daten.
Java verwendet den Unicode-Zeichensatz und kann somit Umlaute und zusätzliche
Buchstaben anderer Alphabete darstellen und verwenden (solange vom Editor unterstützt).
Java unterscheidet Gross- und Kleinschreibung.
Java ist sicher. Durch ein mehrstufiges Sicherheitskonzept werden Operationen verhindert,
die unberechtigte Aktionen aufführen könnten.
Java ist keine zeilengebundene Programmiersprache, d.h. es darf eine beliebige
Zeilenformatierung im Programmtext stehen (solange Zeilenumbrüche und Leerzeichen
zulässig platziert sind).
Java ist stabil, indem einerseits die JVM stabil konzipiert wurde, andererseits alle Objekte
und Variablen entsprechend definiert werden müssen und alle Ausnahmen sowie Fehler im
Java-Programm abgefangen und behandelt werden können.
Java kennt die Kommentare /* und */, das Zeilenkommentar // und das javadoc-Kommentar /**
und */.
Java unterstützt Multithreading, d.h. die gleichzeitige Ausführung von parallelen Aufgaben
(Tasks) in einem Prozess bzw. Programm.
Java kennt die primitiven Datentypen byte, short, int, long, float, double, boolean und char.
Java-Programme können in HTML-Seiten eingebunden werden (Applets).
Zeichen (char) werden in einfachen Anführungszeichen geschrieben '', Zeichenketten
(Referenztyp String) in den doppelten Anführungszeichen "".
Mit Java Server Pages (JSP) und Servlets können serverseitige Web-Applikationen realisiert
werden.
Jede Variable muss definiert und einem Typ zugewiesen werden:
Typname Variablenname;
Weitere Java-Entwicklungswerkzeuge (javadoc, jdb, ...) und IDEs (Integrated Development
Environment) und CASE-Tools (Computer-aided Software Engineering) unterstützen die
Entwicklung von Java-Programmen.
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
Zusätzlich kann der Variablen dabei auch ein Wert zugewiesen werden:
Typname Variablenname = Wert;
5
10.1.3 Operatoren
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
6
10.1.4 Datenfelder
Es existieren die arithmetischen Operatoren:
+, -, *, /, %, ++, --
Datenfelder sind ein- oder mehrdimensionale Arrays und werden wie folgt definiert:
int[][] Matrix;
Matrix = new int[IntZeile][IntSpalte];
oder zusammengefasst in einem Ausdruck
int[][] Matrix = new int[IntZeile][IntSpalte];
oder beispielsweise mit direkt vorbelegten Werten
int[][] Matrix = {{1, 2}, {3, 4}, {5, 6}};
Es existieren die arithmetischen Zuweisungsoperatoren:
=, +=, -=, *=, /=, %=
Es existieren die Vergleichsoperatoren:
==, !=, <, <=, >, >=
Es existieren die logischen Vergleichsoperatoren:
!, &&, ||, &, |, ^
Der Zugriff auf Array-Elemente erfolgt mittels direkter Indizierung, z.B.:
Matrix[2][1]
Es existieren die bitweise Operatoren:
~, &, |, ^ , >>, >>>, <<, &=, |=, ^= , >>=, >>>=, <<=
Die Nummerierung der Datenfelder beginnt immer mit 0, also z.B.:
Matrix[0][0] Matrix[0][1] Matrix[1][0] ...
Explizite Konvertierung von einem primitiven Datentyp in einen anderen erfolgen mittels des
Type-Cast-Operators:
(byte), (short), (int), (long), (float), (double) und (char)
Die Anzahl der Array-Elemente wird mit .length abgefragt:
Anzahl Zeilen:
Matrix.length
Anzahl Spalten in 1.Zeile:
Matrix[0].length
Anzahl Spalten in 2.Zeile:
Matrix[1].length
...
Für die bedingte Zuweisung gibt es in Java den Fragezeichen-Operator ? : also Wert =
BoolescherAusdruck ? Wert1 : Wert2;
© Prof. Dr. Rolf Dornberger
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
7
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
8
10.1.6 main-Teil und Parameterübergabe
Das Grundgerüst eines Java-Programms mit der main-Methode sieht wie folgt aus:
10.1.5 Zeichenketten
public class JavaProgramm {
public static void main(String[] args) {
Zeichenketten werden wie folgt definiert:
String a = new String("Hello World");
oder
String a = "Hello World";
// hier Programmcode
}
}
Parameterübergabe beim Aufruf des Java-Programms erfolgt mittels:
java JavaProgramm Parameter1 Parameter2 ...
Die Länge einer Zeichenkette wird mit .length() abgefragt:
a.length()
Zugriff auf die einzelnen Parameter (die als Strings vorliegen) erfolgt mittels:
args[0]
args[1]
...
Zeichenketten werden mit dem Operator + verknüpft, z.B:
a = "Hello " + "World";
Das File, in dem das Java-Programm gespeichert wird, sollte so heissen wie die Klasse
und muss auf .java enden: JavaProgramm.java
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
9
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
10
22.09.2010
12
10.2 Wiederholung der grundlegenden Programmstrukturen
10.1 Java allgemein
10.1.7 Bedingungen und Schleifen
10.2 Wiederholung der grundlegenden Programmstrukturen
– 10.2.1 Anweisungen
– 10.2.2 Verzweigungen aufgrund von Bedingungen
– 10.2.3 Wiederholungen mit Schleifen
– 10.2.4 Blöcke, Funktionen, Objekte
Verzweigungen werden durch Bedingungen verursacht. Dafür gibt es in Java die if-, if-elseund switch-Anweisung.
Die do-Schleife (auch do-while-Schleife genannt) führt zunächst einmal die dazugehörige
Anweisung aus und prüft dann den dazugehörigen Booleschen Ausdruck. Solange dieser
Ausdruck true ist, wird die Anweisung erneut ausgeführt.
10.3 Konzepte objektorientierter Programmiersprachen
Die while-Schleife prüft zunächst den dazugehörigen Booleschen Ausdruck. Solange dieser
Ausdruck true ist, wird die dazugehörige Anweisung ausgeführt.
10.4 Implementierung objektorientierter Konzepte in Java
10.5 Arrays von Objekten
Die for-Schleife dient in der Regel dazu, die dazugehörige Anweisung mit einer bestimmten
Anzahl an Durchläufen auszuführen.
10.6 Methoden
In Java gibt es zwei Sprunganweisungen, die es erlauben, die Auswertungsreihenfolge einer
laufenden Schleife zu verändern:
– break-Anweisung beendet Schleife
– continue-Anweisung springt zum nächsten Schleifendurchgang
10.7 Vererbung
10.8 Konstruktoren
10.9 Pakete
Durch Angabe eines Labels LabelX: springen die break- und die continue-Anweisung direkt
zu diesem Label.
10.10 Java-Dokumentation
10.11 Modifiers für Zugriffsspezifizierung
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
11
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
Anweisung 1
Anweisung 2
Anweisung 3
Anweisung 4
10.2 Wiederholung der grundlegenden Programmstrukturen
10.2.1 Anweisungen
Setzt man Algorithmen in eine computerverständliche Form um, so
tauchen drei (bzw. vier) grundlegende Programmstrukturen unabhängig
von einer Programmiersprache immer wieder auf. Dies sind:
In Computerprogrammen werden
im Allgemeinen schrittweise die
Anweisungen im Quelltext
abgearbeitet.
– Anweisungen
– Verzweigungen bzw. Alternativen aufgrund von Bedingungen
Sie gewinnen im
Lotto und kassieren
10000 Franken
Sie
kaufen
ein neues
Auto für
20000
Franken.
Vielleicht lässt sich dies am besten
mit einem Brettspiel vergleichen.
Allerdings würfelt der Computer
nicht, sondern geht Feld für Feld
vor.
– Wiederholungen mit Schleifen
– (Aufruf anderer Algorithmen bzw. Blöcke mit Programmstrukturen)
Fasst man mehrere einzelne solche Programmstrukturen zusammen, so
ergibt sich eine weitere grundlegende Programmstruktur, die je nach
Programmiersprache respektive Programmiertyp umschrieben wird als:
Sie schliessen
eine Feuerversicherung
für 1000
Franken ab.
– Block (Modul, Funktion, Unterroutine, Klasse, Objekt oder wie auch immer)
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
13
Sie haben sich das
Bein verstaucht,
einmal aussetzen
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
14
Anweisung 1
Anweisung 0
Anweisung 2
Anweisung 1
Anweisung 3
Bedingung
wahr
Anweisung 4
Anweisung 2
10.2.1 Anweisungen
10.2.2 Verzweigungen aufgrund von Bedingungen
Das Software-Engineering
kennt dafür verschiedene
Darstellungsmöglichkeiten:
z.B. Struktogramm oder
Flussdiagramm
Sie gewinnen im
Lotto und kassieren
10000 Franken
Sie haben sich das
Bein verstaucht,
einmal aussetzen
Sie
kaufen
ein neues
Auto für
20000
Franken.
In Computerprogrammen werden
Verzweigungen bzw. Alternativen mit
Bedingungen bzw. Entscheidungen
bewirkt. An Verzweigungen können
zwei oder mehrere Alternativen
weitergehen.
Anweisung 2
Sie schliessen
eine Feuerversicherung
für 1000
Franken ab.
Anweisung 3
Anweisung 4
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
Sie schliessen
eine Feuerversicherung
für 1000
Franken ab.
Sie stehen an einer
Weggabelung. Würfeln Sie 1, 3
oder 5, geht es nach links,
ansonsten nach rechts weiter.
Anweisung 1
© Prof. Dr. Rolf Dornberger
falsch
Anweisung 3
Sie kaufen
einen
Fernseher
für 500 Sfr.
15
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
Sie
überweisen
2000 Sfr.
von Konto A
auf Konto B.
22.09.2010
16
Anweisung 0
Anweisung 0
Schleife
Anweisung 1
Anweisung 1
Bedingung
wahr
falsch
Anweisung 2
Anweisung 2
Anweisung 3
Anweisung 3
10.2.2 Verzweigungen aufgrund von Bedingungen
10.2.3 Wiederholungen mit Schleifen
Dies lässt sich z.B. auch
mit einem z.B.
Struktogramm oder
Flussdiagramm
verdeutlichen.
In Computerprogrammen
werden Wiederholungen mit
Schleifen bewirkt.
Anweisung 0
Sie schliessen
eine Feuerversicherung
für 1000
Franken ab.
Bedingung
Entscheidung
true
false
Anweisung 1
Anweisung 3
Anweisung 2
Anweisung 4
Anweisung 0
Bedingung
Entscheidung
wahr
falsch
Anweisung 1
Anweisung 3
Anweisung 2
Anweisung 4
Anweisung 5
Anweisung 5
© Prof. Dr. Rolf Dornberger
Sie stehen an einer
Weggabelung. Würfeln Sie 1, 3
oder 5, geht es nach links,
ansonsten nach rechts weiter.
Sie
überweisen
2000 Sfr.
von Konto A
auf Konto B.
Sie kaufen
einen
Fernseher
für 500 Sfr.
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
17
Schleifen können mit einer fest
vorgegebenen Anzahl an
Durchläufen erfolgen oder
solange, bis eine bestimmte
Bedingung erfüllt ist.
© Prof. Dr. Rolf Dornberger
Anweisung 4
Jemand Anweisung 5
überweist
Ihnen
Anweisung
6
2000 Sfr.
Sie
kaufen
ein neues
Auto für
20000
Franken.
Durchlaufen Sie nebenstehende Schleife
solange, bis Sie
insgesamt 50000 Sfr.
besitzen.
OOP: 10 Wiederholung der Grundelemente in Java
Sie gewinnen
3000 Sfr.
22.09.2010
18
22.09.2010
20
Anweisung 0
Schleife
Anweisung 1
Anweisung 2
Anweisung 3
Anweisung 4
10.2.3 Wiederholungen mit Schleifen
Dies lässt sich z.B.
auch mit einem z.B.
Struktogramm oder
Flussdiagramm
verdeutlichen.
Anweisung 0
JemandAnweisung 5
überweist
Ihnen
Anweisung
6
2000 Sfr.
Sie
kaufen
ein neues
Auto für
20000
Franken.
Durchlaufen Sie nebenstehende Schleife
solange, bis Sie
insgesamt 50000 Sfr.
besitzen.
Schleife
Anweisung 1
Anweisung 2
Sie gewinnen
3000 Sfr.
Anweisung 3
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
19
10.2.4 Blöcke, Funktionen, Objekte
In Computerprogrammen
werden gewisse
Programmteile, die immer
wieder vorkommen, in Blöcke
(Module, Funktionen,
Unterroutinen, Klassen,
Objekte oder wie auch immer
genannt) gepackt.
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
10.3 Konzepte objektorientierter Programmiersprachen
10.1 Java allgemein
10.2.4 Blöcke, Funktionen, Objekte
10.2 Wiederholung der grundlegenden Programmstrukturen
Diese „Blöcke“ stehen
nur über spezielle
Schnittstellen mit der
Umgebung in
Kontakt.
10.3 Konzepte objektorientierter Programmiersprachen
– 10.3.1 Klassen, Objekte
– 10.3.2 Attribute, Methoden, Kapselung
– 10.3.3 Beziehungen, Vererbung, Assoziation, Komposition, Aggregation
– 10.3.4 Polymorphismus, Überladen und Wiederverwendung
10.4 Implementierung objektorientierter Konzepte in Java
10.5 Arrays von Objekten
Anweisung 1
10.6 Methoden
Aufruf des Blocks XY
10.7 Vererbung
Anweisung 2
10.8 Konstruktoren
Anweisung 3
10.9 Pakete
10.10 Java-Dokumentation
10.11 Modifiers für Zugriffsspezifizierung
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
21
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
22
10.3.1 Klassen, Objekte
10.3.1 Klassen, Objekte
Ein Objekt in einer objektorientierten Programmiersprache bildet ein real existierendes
Objekt („Ding“) aus bestimmten Anwendungsbereichen in der Software nach. Dabei kann das
Objekt ein Modell eines konkret existierenden Gegenstandes oder auch ein abstraktes
Konzept sein.
von einer Klasse erzeugte Objekte
in beliebiger Anzahl
(Objekt = Instanz einer Klasse)
Eine Klasse beschreibt quasi die Zusammengehörigkeit eines oder mehrerer ähnlicher
Objekte eines bestimmten Typs. Diese Objekte müssen nicht in allen, aber zumindest in
vielen Details identisch sein, damit eine gemeinsame Beschreibung über eine Klasse sinnvoll
ist.
Eine Klasse ermöglicht das Erzeugen einer prinzipiell beliebigen Anzahl von Objekten. Man
spricht dann davon, dass ein Objekt eine Instanz einer Klasse ist. Wird ein Objekt aus einer
Klasse erzeugt, sagt man, dass die Klasse instanziert wird.
Die Unterscheidung zwischen Objekten und Klassen ist eine Abstraktion, die hilft, Details zu
ignorieren und damit die Komplexität des Problems zu reduzieren. Die Klasse ist die Form
bzw. der Stempel (oder auch der Zylinder), der festlegt, wie die Objekte im Einzelnen
aussehen.
Klasse, die festlegt, wie die
Objekte aussehen werden
(Klasse = Zylinder, Stempel, Form)
(Alle Begriffe werden in später mit Beispielen genauer erklärt. Hier geht es zunächst darum,
die Begriffe aus der objektorientierten Sichtweise einmal vorzustellen.)
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
23
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
24
10.3.2 Attribute, Methoden, Kapselung
In objektorientierten Programmiersprachen wird eine Klasse durch die
Zusammenfassung aller ihrer Daten und Operationen definiert.
von einer Klasse
erzeugte Objekte in
beliebiger Anzahl
(Objekt = Instanz einer
Klasse)
Die Operationen werden durch Methoden ausgeführt, die von der Klasse für alle
Objekte individuell bereitgestellt werden.
Die Daten werden durch Attribute repräsentiert, die für jedes neue Objekt auch
neu angelegt werden und mit neuen Werten gefüllt werden.
Klassen kapseln bestimmte Methoden und Attribute ein. Diese Kapselung erlaubt
ein einfacheres Implementieren der Objekte und einen vereinfachten Umgang mit
den Objekten im Programm.
Klasse, die festlegt,
wie die Objekte aussehen
werden
(Klasse = Zylinder,
Stempel, Form)
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
Nur über bestimmte Operationen kann mittels Botschaften auf die Daten der
Objekte zugegriffen werden.
(Methoden werden auch als Operationen oder Funktionen bezeichnet. Attribute
werden auch als Variablen, Membervariablen, Instanzvariablen oder
Instanzmerkmale bezeichnet).
22.09.2010
25
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
26
10.3.3 Beziehungen, Vererbung , Assoziation, Komposition, Aggregation
In objektorientierten Programmiersprachen können folgende Beziehungen zwischen
verschiedenen Klassen und damit auch Objekten existieren:
10.3.2 Attribute, Methoden, Kapselung
Objekt
Generalisierung und Spezialisierung (is-a-Beziehungen) werden mittels Vererbung
ausgeführt, wobei eine Klasse (abgeleitete Klasse) nicht vollständig neu definiert,
sondern von einer anderen Klasse (Basisklasse) abgeleitet wird.
Objekt, erzeugt als Instanz einer
Klasse.
Attribute
(Daten)
2
de 2)
ho n
et tio
M era
p
(O
e1
Method 1)
n
o
ti
ra
(Ope
3 )
e
od on 3
h
e t ti
M er a
p
O
(
Objekt umfasst Methoden
(Operationen) und Attribute (Daten).
Daten können quasi gekapselt werden
und sind damit nicht von außen
zugreifbar.
Assoziationen (Verwendungs- oder Aufrufbeziehungen) verwenden Objekte als
lokale Variablen oder Methodenargumente.
Zusammengehörigkeiten (part-of-Beziehungen) beschreiben die Zusammensetzung
eines Objekts aus anderen Objekten (Komposition) und das einfache Einschließen
anderer Objekte (Aggregation).
Nur über bestimmte Methoden
(Operationen) kann auf die Daten
zugegriffen werden. Hier erlaubt die
Methode 3 den Zugriff auf bestimmte
Attribute. Diese Operation ist quasi die
Botschaft, um auf die Attribute
zuzugreifen.
Generalisierung und Spezialisierung
Zusammengehörigkeiten
Lebewesen
Tier
Vogel
Säugetier
Pflanze
Auto
Mensch
Motor
Karosserie
Räder
Reifen
Fisch
Felgen
Affe
Schimpanse
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
27
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
28
Lebewesen
Tier
Vogel
Säugetier
Pflanze
Auto
Mensch
Motor
Lebewesen
Karosserie
Fisch
Rad
Felge
Tier
Reifen
Vogel
Säugetier
Affe
Affe
Schimpanse
Schimpanse
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
29
10.3.3 Beziehungen, Vererbung , Assoziation, Komposition, Aggregation
In objektorientierten Programmiersprachen können folgende Beziehungen
zwischen verschiedenen Klassen (und damit auch Objekten) existieren:
– "is-a“-Beziehungen (Generalisierung und Spezialisierung) werden mittels
Vererbung ausgeführt, wobei eine Klasse (abgeleitete Klasse) nicht vollständig neu
definiert, sondern von einer anderen Klasse (Basisklasse) abgeleitet wird. Erbt eine
Klasse von einer anderen muss das Schlüsselwort extends bei der
Klassendefinition verwendet werden:
Pflanze
Mensch
Fisch
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
30
10.3.3 Beziehungen, Vererbung , Assoziation, Komposition, Aggregation
– Verwendungs- oder Aufrufbeziehungen (Assoziationen) verwenden Objekte als
lokale Variablen oder Methodenargumente.
– "part-of"-Beziehungen beschreiben einerseits die Zusammensetzung eines Objekts
aus anderen Objekten (Komposition) oder andererseits den allgemeineren Fall des
einfachen Aufnehmens anderer Objekte (Aggregation).
– In allen diesen Fällen kann die Implementierung wie folgt aussehen. (Die genaue
Unterscheidung wird später behandelt.):
public class Einfamilienhaus extends Immobilie {…}
Lebewesen
Tier
Vogel
Säugetier
Pflanze
Mensch
Fisch
public class Auto {
Motor meinMotor = new Motor();
...
}
Auto
public class Motor { ... }
Affe
Motor
Karosserie
Reifen
Schimpanse
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
Räder
22.09.2010
31
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
Felgen
32
10.3.4 Polymorphismus, Überladen und Wiederverwendung
10.3.4 Polymorphismus, Überladen und Wiederverwendung
Polymorphismus („Vielgestaltigkeit“; in Zusammenhang mit Late Binding „späte
Bindung“) bezeichnet die Fähigkeit von Objektvariablen, Objekte
unterschiedlicher Klassen aufzunehmen. In Java folgt daraus, dass verschiedene
Methoden gleichen Namens in verschiedenen Klassen existieren können, die
verschiedene Operationen ausführen.
Das Überladen von Methoden erlaubt, dass in einer Klasse mehrere Methoden
den gleichen Namen haben. Diese müssen sich aber in der Anzahl der Parameter,
ihrer Reihenfolge und/oder in den Typen der Parameter unterscheiden.
Zusätzlich können sich die Rückgabewerte unterscheiden.
Polymorphismus („Vielgestaltigkeit“; „späte Bindung“) bezeichnet die
Fähigkeit von Objektvariablen, Objekte unterschiedlicher Klassen
aufzunehmen.
public class MyFrame extends Frame{
Container c;
}
Die Klasse Container kann viele Ausprägungen haben.
Container
Die Wiederverwendung von Komponenten (quasi in sich geschlossenen
Programmteilen) wird durch die Abstraktion und Kapselung unterstützt. Die
Wiederverwendung ist damit sehr wichtig für Steigerung der Effizienz und
Fehlerfreiheit beim Programmieren.
Panel
(Alle Begriffe werden in späteren Kapiteln mit Beispielen genauer erklärt. Hier
geht es zunächst darum, die Begriffe aus der objektorientierten Sichtweise
einmal vorzustellen.)
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
Applet
33
© Prof. Dr. Rolf Dornberger
Window
Frame
Dialog
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
34
10.3.4 Polymorphismus, Überladen und Wiederverwendung
10.3.4 Polymorphismus, Überladen und Wiederverwendung
Das Überladen von Methoden erlaubt, dass in einer Klasse mehrere
Methoden den gleichen Namen haben. Diese müssen sich aber in der
Anzahl der Parameter, ihrer Reihenfolge und/oder in den Typen der
Parameter unterscheiden. Zusätzlich können sich die Rückgabewerte
unterscheiden.
Die Wiederverwendung von Programmteilen, sogenannten Komponenten,
wird durch die Abstraktion und Kapselung unterstützt. Die Wiederverwendung
ist damit sehr wichtig für Steigerung der Effizienz und Fehlerfreiheit beim
Programmieren.
public class MeinHaus{
–
public void zeigeMeinHaus(){
– ...}
–
public int zeigeMeinHaus(int HausNummer){
– ...}
–
public String zeigeMeinHaus(int HausNummer, String Strasse){
–
...}
}
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
35
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
36
10.4 Implementierung objektorientierter Konzepte in Java
10.4.1 Klassen
10.1 Java allgemein
Definition der Klasse Einfamilienhaus, welche im File
Einfamilienhaus.java gespeichert wird:
10.2 Wiederholung der grundlegenden Programmstrukturen
10.3 Konzepte objektorientierter Programmiersprachen
Das Schlüsselwort class leitet die Klasse ein. In den nachfolgenden
geschweiften Klammern stehen die Definitionen von Attributen und Methoden.
10.4 Implementierung objektorientierter Konzepte in Java
– 10.4.1 Klassen
– 10.4.2 Objekte
– 10.4.3 Mehrere Objekte von einer Klasse
– 10.4.4 Schrittweises Vorgehen zur Implementierung objektorientierter Konzepte in Java
// Definition der Klasse Einfamilienhaus
public class Einfamilienhaus {
// Definition der Attribute
public String Besitzer;
public String Adresse;
public int
Baujahr;
public double Verkaufspreis;
public String Haustyp;
public double Wohnflaeche;
public double AnzahlZimmer;
public double Gartenflaeche;
public boolean HatGarage;
10.5 Arrays von Objekten
10.6 Methoden
10.7 Vererbung
10.8 Konstruktoren
Attribute
Methoden
// Definition der Methode anfragenVerkaufspreis für die Klasse Einfamilienhaus
public double anfragenVerkaufspreis() {
System.out.println("Verkaufspreis: " + Verkaufspreis + " Euro");
return Verkaufspreis;
}
}
10.9 Pakete
10.10 Java-Dokumentation
10.11 Modifiers für Zugriffsspezifizierung
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
37
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
38
10.4.1 Klassen
10.4.1 Klassen
Grafische Darstellung der Klasse in UML
(Unified Modeling Language) und ihre
Implementierung im Quelltext:
Wird in Java eine Klasse in einem File abgespeichert, so muss das File (falls
die Klasse public ist) den gleichen Namen haben. Ist die Klasse nicht public,
kann dem File ein beliebiger Name gegeben werden. In einem File können
mehrere Klassen definiert werden. Es dürfen jedoch nicht 2 Klassen in ein
und demselben File public sein.
// Definition der Klasse Einfamilienhaus
public class Einfamilienhaus {
Ein Klasse in der UML-Klassendarstellung enthält den Namen der Klasse,
keine bis beliebig viele Attribute in der Notation Variablenname:Datentyp und
keine bis beliebig viele Operationen (Methoden) in der Notation
Methodenname:DatentypRückgabewert. Das Pluszeichen (+) bedeutet, dass
alle Attribute und Operationen public sind.
// Definition der Attribute
public String Besitzer;
public String Adresse;
public int
Baujahr;
public double Verkaufspreis;
public String Haustyp;
public double Wohnflaeche;
public double AnzahlZimmer;
public double Gartenflaeche;
public boolean HatGarage;
Besitzt eine Klasse eine main-Methode, kann diese Klasse als ein
Einstiegspunkt eines Java-Programms genommen werden, d.h. die Klasse
kann von der Java-Konsole aufgerufen werden.
// Definition der Methode anfragenVerkaufspreis für die Klasse Einfamilienhaus
public double anfragenVerkaufspreis() {
System.out.println("Verkaufspreis: " + Verkaufspreis + " Euro");
return Verkaufspreis;
}
}
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
(Was public bedeutet, wird in einem späteren Kapitel erläutert. Wie UML
genau definiert ist und angewendet wird, wird in den Kursen zu SoftwareEngineering erklärt.)
39
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
40
10.4.2 Objekte
10.4.2 Objekte
Wird die Klasse Einfamilienhaus instanziert, also von der Klasse
Einfamilienhaus das Objekt einEinfamilienhaus angelegt, muss
dazu eine Variable (auch Objektvariable genannt) vom Typ der Klasse
deklariert und ihr dann mit Hilfe des new-Operators das neu erzeugte Objekt
Objekt
zugewiesen werden:
Von der Klasse Einfamilienhaus wird das Objekt einEinfamilienhaus
abgeleitet. In der UML-Darstellung ist ein Objekt dadurch gekennzeichnet, dass vor
dem Klassennamen ein Doppelpunkt (:) steht und meist ein Objektname, hier
einEinfamilienhaus.
einEinfamilienhaus
// Deklarieren des Objektes einEinfamilienhaus
Einfamilienhaus einEinfamilienhaus;
(Zur grafischen Unterscheidung wird oftmals der Namensbereich von Objekten blau
unterlegt. Die UML-Konvention besagt auch, dass Klassen große und Objekte kleine
Anfangsbuchstaben erhalten.)
// Anlegen des Objekts (Reservieren des Speicherplatzes)
einEinfamilienhaus = new Einfamilienhaus();
Dies kann auch in einem Schritt erfolgen:
Klasse
Einfamilienhaus
einEinfamilienhaus
:Einfamilienhaus
Klasse
Einfamilienhaus
// Deklarieren des Objektes einEinfamilienhaus und
// Anlegen des Objekt in einem Schritt
Einfamilienhaus einEinfamilienhaus = new Einfamilienhaus();
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
Objekt
einEinfamilienhaus
41
© Prof. Dr. Rolf Dornberger
Besitzer
Adresse
Baujahr
Verkaufspreis
Haustyp
Wohnflaeche
AnzahlZimmer
Gartenflaeche
HatGarage
=
=
=
=
=
=
=
=
=
"Meier"
"Augsburg"
1920
7500000.0
"Bauernhaus"
250
8
10000
true
anfragenVerkaufspreis
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
10.4.2 Objekte
10.4.2 Objekte
Der Zugriff auf die Attribute des Objekts einEinfamilienhaus erfolgt
mittels des Aufrufs Objektname.Attributname
Schreibt man alle diese Teile (Klasse, Methoden, main-Teil...) in das Programm
Immobilienverwaltung1.java (das ja auch eine Klasse ist), so sieht dies wie
folgt aus:
42
public class Immobilienverwaltung1 {
Im Fall des Objektes einEinfamilienhaus könnten beispielsweise den
bereits in der Klasse Einfamilienhaus definierten Attributen folgenden
Werte zugewiesen werden:
// Füllen des Objektes mit Werten
einEinfamilienhaus.Besitzer
einEinfamilienhaus.Adresse
einEinfamilienhaus.Baujahr
einEinfamilienhaus.Verkaufspreis
einEinfamilienhaus.Haustyp
einEinfamilienhaus.Wohnflaeche
einEinfamilienhaus.AnzahlZimmer
einEinfamilienhaus.Gartenflaeche
einEinfamilienhaus.HatGarage
=
=
=
=
=
=
=
=
=
public static class Einfamilienhaus {
// Definition der Attribute
public String Besitzer;
public String Adresse;
public int
Baujahr;
public double Verkaufspreis;
public String Haustyp;
public double Wohnflaeche;
public double AnzahlZimmer;
public double Gartenflaeche;
public boolean HatGarage;
"Meier";
"Augsburg";
1920;
7500000.0;
"Bauernhaus";
250;
8;
10000;
true;
(Nur wenn alles in das einzige File
Immobilienverwaltung1.java
geschrieben wird, muss vor der Klasse
class das Schlüsselwort static
stehen; bei getrennten Files nicht.)
// Definition der Methode anfragenVerkaufspreis für die Klasse Einfamilienhaus
public double anfragenVerkaufspreis() {
System.out.println("Verkaufspreis: " + Verkaufspreis + " Euro");
return Verkaufspreis;
}
}
public static void main(String args[]) {
System.out.println("Programm Immobilienverwaltung v1");
Die Ausgabe der Werte dieser Attribute erfolgt dann beispielsweise über:
// Ausgabe des Objektes
System.out.println("Haustyp
System.out.println("Besitzer
© Prof. Dr. Rolf Dornberger
// Deklarieren des Objektes einEinfamilienhaus
Einfamilienhaus einEinfamilienhaus;
// Reservieren des Speicherplatzes für dieses Objekt
einEinfamilienhaus = new Einfamilienhaus();
: " + einEinfamilienhaus.Haustyp);
: " + einEinfamilienhaus.Besitzer);
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
...
43
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
44
10.4.2 Objekte
Man kann daraus auch Immobilienverwaltung2.java machen, wenn
man zusätzlich das File Einfamilienhaus.java im selben Verzeichnis wie
Immobilienverwaltung2.java stehen hat.
10.4.2 Objekte
...
// Füllen des Objektes mit Werten
einEinfamilienhaus.Besitzer
einEinfamilienhaus.Adresse
einEinfamilienhaus.Baujahr
einEinfamilienhaus.Verkaufspreis
einEinfamilienhaus.Haustyp
einEinfamilienhaus.Wohnflaeche
einEinfamilienhaus.AnzahlZimmer
einEinfamilienhaus.Gartenflaeche
einEinfamilienhaus.HatGarage
// Ausgabe des Objektes
System.out.println("Haustyp
System.out.println("Besitzer
=
=
=
=
=
=
=
=
=
"Meier";
"Augsburg";
1920;
7500000.0;
"Bauernhaus";
250;
8;
10000;
true;
public class Immobilienverwaltung2 {
public static void main(String args[]) {
System.out.println("Programm Immobilienverwaltung v2");
// Deklarieren des Objektes einEinfamilienhaus
Einfamilienhaus einEinfamilienhaus;
// Reservieren des Speicherplatzes für dieses Objekt
einEinfamilienhaus = new Einfamilienhaus();
// Füllen des Objektes mit Werten
einEinfamilienhaus.Besitzer
einEinfamilienhaus.Adresse
einEinfamilienhaus.Baujahr
einEinfamilienhaus.Verkaufspreis
einEinfamilienhaus.Haustyp
einEinfamilienhaus.Wohnflaeche
einEinfamilienhaus.AnzahlZimmer
einEinfamilienhaus.Gartenflaeche
einEinfamilienhaus.HatGarage
: " + einEinfamilienhaus.Haustyp);
: " + einEinfamilienhaus.Besitzer);
// Aufruf der Methode anfragenVerkaufspreis()
einEinfamilienhaus.anfragenVerkaufspreis();
}
}
Als Ausgabe erhält man dann folgendes:
// Ausgabe des Objektes
System.out.println("Haustyp
System.out.println("Besitzer
=
=
=
=
=
=
=
=
=
"Meier";
"Augsburg";
1920;
7500000.0;
"Bauernhaus";
250;
8;
10000;
true;
: " + einEinfamilienhaus.Haustyp);
: " + einEinfamilienhaus.Besitzer);
// Aufruf der Methode anfragenVerkaufspreis()
einEinfamilienhaus.anfragenVerkaufspreis();
}
}
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
45
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
46
10.4.3 Mehrere Objekte von einer Klasse
10.4.2 Objekte
Von der Klasse Einfamilienhaus werden die beiden Objekte
einEinfamilienhaus und zweitesEinfamilienhaus abgeleitet.
public class Einfamilienhaus steht nun ohne das Schlüsselwort
static.
// Definition der Klasse Einfamilienhaus
public class Einfamilienhaus {
// Definition der Attribute
public String Besitzer;
public String Adresse;
public int
Baujahr;
public double Verkaufspreis;
public String Haustyp;
public double Wohnflaeche;
public double AnzahlZimmer;
public double Gartenflaeche;
public boolean HatGarage;
(public class Einfamilienhaus
steht nun ohne das Schlüsselwort
static, da es in dem extra File
Einfamilienhaus.java
abgespeichert ist.)
// Definition der Methode anfragenVerkaufspreis für die Klasse Einfamilienhaus
public double anfragenVerkaufspreis() {
System.out.println("Verkaufspreis: " + Verkaufspreis + " Euro");
return Verkaufspreis;
}
}
einEinfamilienhaus
:Einfamilienhaus
Klasse
Einfamilienhaus
Objekte
einEinfamilienhaus
zweitesEinfamilienhaus
© Prof. Dr. Rolf Dornberger
22.09.2010
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
47
© Prof. Dr. Rolf Dornberger
Besitzer
Adresse
Baujahr
Verkaufspreis
Haustyp
Wohnflaeche
AnzahlZimmer
Gartenflaeche
HatGarage
=
=
=
=
=
=
=
=
=
"Meier"
"Augsburg"
1920
7500000.0
"Bauernhaus"
250
8
10000
true
anfragenVerkaufspreis
OOP: 10 Wiederholung der Grundelemente in Java
zweitesEinfamilienhaus
:Einfamilienhaus
Besitzer
Adresse
Baujahr
Verkaufspreis
Haustyp
Wohnflaeche
AnzahlZimmer
Gartenflaeche
HatGarage
=
=
=
=
=
=
=
=
=
"Schulz"
"Stuttgart"
1980
1000000.0
"Stadthaus"
120
5
0
false
anfragenVerkaufspreis
22.09.2010
48
10.4.3 Mehrere Objekte von einer Klasse
10.4.3 Mehrere Objekte von einer Klasse
Die zwei Objekte einEinfamilienhaus und zweitesEinfamilienhaus
sind jeweils eine Instanz der Klasse Einfamilienhaus und beinhalten
jeweils verschiedene Daten.
In Immobilienverwaltung3.java werden nun zwei Objekte von der
Klasse Einfamilienhaus angelegt:
public class Immobilienverwaltung3 {
...
public static void main(String args[]) {
System.out.println("Programm Immobilienverwaltung v3");
// Identische Behandlung des 2.Objektes
Einfamilienhaus zweitesEinfamilienhaus;
zweitesEinfamilienhaus = new Einfamilienhaus();
// Deklarieren des Objektes einEinfamilienhaus
Einfamilienhaus einEinfamilienhaus;
zweitesEinfamilienhaus.Besitzer
zweitesEinfamilienhaus.Adresse
zweitesEinfamilienhaus.Baujahr
zweitesEinfamilienhaus.Verkaufspreis
zweitesEinfamilienhaus.Haustyp
zweitesEinfamilienhaus.Wohnflaeche
zweitesEinfamilienhaus.AnzahlZimmer
zweitesEinfamilienhaus.Gartenflaeche
zweitesEinfamilienhaus.HatGarage
// Reservieren des Speicherplatzes für dieses Objekt
einEinfamilienhaus = new Einfamilienhaus();
// Füllen des Objektes mit Werten
einEinfamilienhaus.Besitzer
einEinfamilienhaus.Adresse
einEinfamilienhaus.Baujahr
einEinfamilienhaus.Verkaufspreis
einEinfamilienhaus.Haustyp
einEinfamilienhaus.Wohnflaeche
einEinfamilienhaus.AnzahlZimmer
einEinfamilienhaus.Gartenflaeche
einEinfamilienhaus.HatGarage
=
=
=
=
=
=
=
=
=
"Meier";
"Augsburg";
1920;
7500000.0;
"Bauernhaus";
250;
8;
10000;
true;
=
=
=
=
=
=
=
=
=
"Schulz";
"Stuttgart";
1980;
1000000.0;
"Stadthaus";
120;
5;
0;
false;
System.out.println("\n2. Einfamilienhaus:");
System.out.println("Haustyp
: " + zweitesEinfamilienhaus.Haustyp);
System.out.println("Besitzer : " + zweitesEinfamilienhaus.Besitzer);
zweitesEinfamilienhaus.anfragenVerkaufspreis();
// Ausgabe des Objektes
System.out.println("Haustyp
System.out.println("Besitzer
}
}
: " + einEinfamilienhaus.Haustyp);
: " + einEinfamilienhaus.Besitzer);
// Aufruf der Methode anfragenVerkaufspreis()
einEinfamilienhaus.anfragenVerkaufspreis();
...
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
49
© Prof. Dr. Rolf Dornberger
Schrittweises Vorgehen für die Implementierung von Klassen und Objekten:
– Überlegen, welche Attribute und Methoden eine Klasse hat und wie diese Klasse heißt:
Name
Attribute
Attribute
Methoden
Methoden
– File anlegen, das so heißt wie Klasse (Einfamilienhaus.java), und Attribute und Methoden
eintragen:
einEinfamilienhaus
:Einfamilienhaus
Name
50
Besitzer
Adresse
Baujahr
Verkaufspreis
Haustyp
Wohnflaeche
AnzahlZimmer
Gartenflaeche
HatGarage
=
=
=
=
=
=
=
=
=
"Meier"
"Augsburg"
1920
7500000.0
"Bauernhaus"
250
8
10000
true
anfragenVerkaufspreis
zweitesEinfamilienhaus
:Einfamilienhaus
Besitzer
Adresse
Baujahr
Verkaufspreis
Haustyp
Wohnflaeche
AnzahlZimmer
Gartenflaeche
HatGarage
=
=
=
=
=
=
=
=
=
"Schulz"
"Stuttgart"
1980
1000000.0
"Stadthaus"
120
5
0
false
anfragenVerkaufspreis
– Im Programm (hier Immobilienverwaltung3.java) werden die Objekte
einEinfamilienhaus und zweitesEinfamilienhaus erzeugt und die Werte
eingetragen:
public class Immobilienverwaltung3 {
public static void main(String args[]) {
System.out.println("Programm Immobilienverwaltung v3");
// Definition der Klasse Einfamilienhaus
public class Einfamilienhaus {
// Deklarieren des Objektes einEinfamilienhaus
Einfamilienhaus einEinfamilienhaus;
// Definition der Attribute
public String Besitzer;
public String Adresse;
public int
Baujahr;
public double Verkaufspreis;
public String Haustyp;
public double Wohnflaeche;
public double AnzahlZimmer;
public double Gartenflaeche;
public boolean HatGarage;
// Reservieren des Speicherplatzes für dieses Objekt
einEinfamilienhaus = new Einfamilienhaus();
// Füllen des Objektes mit Werten
einEinfamilienhaus.Haustyp
...
22.09.2010
= "Bauernhaus";
// Identische Behandlung des 2.Objektes
Einfamilienhaus zweitesEinfamilienhaus;
zweitesEinfamilienhaus = new Einfamilienhaus();
// Definition der Methode anfragenVerkaufspreis für die Klasse Einfamilienhaus mit Rückgabewert
public double anfragenVerkaufspreis() {
System.out.println("Verkaufspreis: " + Verkaufspreis + " Euro");
return Verkaufspreis;
}
}
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
10.4.4 Schrittweises Vorgehen zur Implementierung objektorientierter Konzepte
in Java
– In Gedanken Objekte aus Klassen ableiten und mit Werten füllen:
10.4.4 Schrittweises Vorgehen zur Implementierung objektorientierter Konzepte
in Java
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
zweitesEinfamilienhaus.Haustyp
...
= "Stadthaus";
}
}
51
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
52
10.5 Arrays von Objekten
10.5.1 Anlegen von Arrays von Objekten
10.1 Java allgemein
Da es unpraktikabel ist, für jedes neue Objekt auch einen neuen Variablennamen
anzugeben, wird in Immobilienverwaltung4.java ein Array von Objekten der
Klasse Einfamilienhaus angelegt:
10.2 Wiederholung der grundlegenden Programmstrukturen
10.3 Konzepte objektorientierter Programmiersprachen
public class Immobilienverwaltung4 {
public static void main(String args[]) {
System.out.println("Programm Immobilienverwaltung v4");
10.4 Implementierung objektorientierter Konzepte in Java
10.5 Arrays von Objekten
– 10.5.1 Anlegen von Arrays von Objekten
– 10.5.2 Default-Werte von Objekten
– 10.5.3 Schrittweises Vorgehen zum Anlegen von Arrays von Objekten
Anlegen des Arrays von
Objekten
10.6 Methoden
Anlegen des ersten Objekts
einEinfamilienhaus[0]
// Füllen des 1.Objektes mit Werten
einEinfamilienhaus[0].Besitzer
einEinfamilienhaus[0].Adresse
einEinfamilienhaus[0].Baujahr
einEinfamilienhaus[0].Verkaufspreis
einEinfamilienhaus[0].Haustyp
einEinfamilienhaus[0].Wohnflaeche
einEinfamilienhaus[0].AnzahlZimmer
einEinfamilienhaus[0].Gartenflaeche
einEinfamilienhaus[0].HatGarage
Anlegen des zweiten Objekts
einEinfamilienhaus[1]
// Anlegen des 2.Objektes
einEinfamilienhaus[1] = new Einfamilienhaus();
...
// Deklarieren eines Arrays von Objekten einEinfamilienhaus
Einfamilienhaus[] einEinfamilienhaus;
// Reservieren des Speicherplatzes für 10 solche Objekte
einEinfamilienhaus = new Einfamilienhaus[10];
// Anlegen des 1.Objektes
einEinfamilienhaus[0] = new Einfamilienhaus();
10.7 Vererbung
10.8 Konstruktoren
10.9 Pakete
10.10 Java-Dokumentation
=
=
=
=
=
=
=
=
=
"Meier";
"Augsburg";
1920;
7500000.0;
"Bauernhaus";
250;
8;
10000;
true;
10.11 Modifiers für Zugriffsspezifizierung
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
53
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
54
10.5.1 Anlegen von Arrays von Objekten
10.5.1 Anlegen von Arrays von Objekten
Dies kann auch vereinfacht, wie in Immobilienverwaltung5.java
angegeben, durchgeführt werden:
Fortsetzung Immobilienverwaltung4.java :
...
// Füllen des 2.Objektes mit Werten
einEinfamilienhaus[1].Besitzer
einEinfamilienhaus[1].Adresse
einEinfamilienhaus[1].Baujahr
einEinfamilienhaus[1].Verkaufspreis
einEinfamilienhaus[1].Haustyp
einEinfamilienhaus[1].Wohnflaeche
einEinfamilienhaus[1].AnzahlZimmer
einEinfamilienhaus[1].Gartenflaeche
einEinfamilienhaus[1].HatGarage
© Prof. Dr. Rolf Dornberger
public class Immobilienverwaltung5 {
=
=
=
=
=
=
=
=
=
"Schulz";
"Stuttgart";
1980;
1000000.0;
"Stadthaus";
120;
5;
0;
false;
public static void main(String args[]) {
System.out.println("Programm Immobilienverwaltung v5");
Anlegen des Arrays
von Objekten
// Ausgabe des 1.Objektes
System.out.println("\n1. Einfamilienhaus:");
System.out.println("Haustyp
: " + einEinfamilienhaus[0].Haustyp);
System.out.println("Besitzer : " + einEinfamilienhaus[0].Besitzer);
Anlegen der Objekte
// Deklarieren der maximalen Anzahl an Objekten
int MAX_OBJ = 10;
// Anlegen des Arrays von Objekten einEinfamilienhaus
Einfamilienhaus[] einEinfamilienhaus = new Einfamilienhaus[MAX_OBJ];
// Anlegen der Objekte
for (int i=0; i<MAX_OBJ; i++)
einEinfamilienhaus[i] = new Einfamilienhaus();
// Füllen des 1.Objektes mit Werten
...
// Füllen des 2.Objektes mit Werten
...
// Aufruf der Methode anfragenVerkaufspreis()
einEinfamilienhaus[0].anfragenVerkaufspreis();
// Ausgabe des 2.Objektes
System.out.println("\n2. Einfamilienhaus:");
System.out.println("Haustyp
: " + einEinfamilienhaus[1].Haustyp);
System.out.println("Besitzer : " + einEinfamilienhaus[1].Besitzer);
// Ausgabe der Objekte
for (int i=0; i<MAX_OBJ; i++)
{
System.out.println("\n" + i + ". Einfamilienhaus:");
System.out.println("Haustyp
: " + einEinfamilienhaus[i].Haustyp);
System.out.println("Besitzer : " + einEinfamilienhaus[i].Besitzer);
// Aufruf der Methode anfragenVerkaufspreis()
einEinfamilienhaus[1].anfragenVerkaufspreis();
}
einEinfamilienhaus[i].anfragenVerkaufspreis();
}
}
}
}
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
55
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
56
10.5.3 Schrittweises Vorgehen zum Anlegen von Arrays von Objekten
Schrittweises Vorgehen für die Implementierung von Klassen und Objekten:
– Da es oft unpraktikabel ist, für jedes Objekt einen neuen Namen zu vergeben, kann
auch ein Array von Objekten angelegt werden:
10.5.2 Default-Werte von Objekten
Wird auf Daten von Objekten zugegriffen, die
noch nicht angelegt wurden (noch keine Werte
den Attributen zugewiesen), werden die
entsprechenden Default-Werte (Standardwerte)
je nach Typ des Attributs ausgegeben (z.B. null
für String und 0.0 für double).
Name
Attribute
Methoden
einEinfamilienhaus
:Einfamilienhaus
Besitzer
Adresse
Baujahr
Verkaufspreis
Haustyp
Wohnflaeche
AnzahlZimmer
Gartenflaeche
HatGarage
=
=
=
=
=
=
=
=
=
"Meier"
"Augsburg"
1920
7500000.0
"Bauernhaus"
250
8
10000
true
einEinfamilienhaus[0]
:Einfamilienhaus
anfragenVerkaufspreis
Besitzer
Adresse
Baujahr
Verkaufspreis
Haustyp
Wohnflaeche
AnzahlZimmer
Gartenflaeche
HatGarage
=
=
=
=
=
=
=
=
=
"Meier"
"Augsburg"
1920
7500000.0
"Bauernhaus"
250
8
10000
true
anfragenVerkaufspreis
einEinfamilienhaus[1]
:Einfamilienhaus
Besitzer
Adresse
Baujahr
Verkaufspreis
Haustyp
Wohnflaeche
AnzahlZimmer
Gartenflaeche
HatGarage
=
=
=
=
=
=
=
=
=
"Schulz"
"Stuttgart"
1980
1000000.0
"Stadthaus"
120
5
0
false
anfragenVerkaufspreis
– Im Programm (hier Immobilienverwaltung5.java) werden die Objekte
einEinfamilienhaus[0], einEinfamilienhaus[1] usw. erzeugt und
Werte eintragen:
Beispielsweise die Bildschirmausgabe von
Immobilienverwaltung5.java.
public class Immobilienverwaltung5 {
Hier sind nur die ersten beiden Objekte (0. und 1.
Einfamilienhaus) mit Werten belegt. Die anderen
Objekte geben die Default-Werte aus.
public static void main(String args[]) {
System.out.println("Programm Immobilienverwaltung v5");
// Deklarieren der maximalen Anzahl an Objekten
int MAX_OBJ = 10;
// Anlegen des Arrays von Objekten einEinfamilienhaus
Einfamilienhaus[] einEinfamilienhaus = new Einfamilienhaus[MAX_OBJ];
// Anlegen der Objekte
for (int i=0; i<MAX_OBJ; i++)
einEinfamilienhaus[i] = new Einfamilienhaus();
// Füllen des 1.Objektes mit Werten
...
// Füllen des 2.Objektes mit Werten
...
}}
(Die Ausgabe von Default-Werten von Objekten
ist unabhängig davon, ob es sich um Arrays von
Objekten oder einfache Objekte handelt.)
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
57
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
10.6 Methoden
10.6 Methoden
10.1 Java allgemein
Methoden definieren die Funktionalität von Objekten. Sie werden innerhalb einer
Klassendefinition angelegt und haben vollen Zugriff auf die Attribute des Objekts.
10.2 Wiederholung der grundlegenden Programmstrukturen
58
Methoden können eine gewisse Funktionalität ausüben:
10.3 Konzepte objektorientierter Programmiersprachen
// Definition der Methode anfragenVerkaufspreis für die Klasse Einfamilienhaus
public void anfragenVerkaufspreis() {
System.out.println("Verkaufspreis: " + Verkaufspreis + " Euro"); }
10.4 Implementierung objektorientierter Konzepte in Java
10.5 Arrays von Objekten
An Methoden können ein oder mehrere Werte übergeben werden:
10.6 Methoden
// Definition der Methode schreibeVerkaufspreis mit Wertübergabe
public void schreibeVerkaufspreis(double Wert) {
System.out.println("Verkaufspreis: " + Wert + " Euro"); }
10.7 Vererbung
10.8 Konstruktoren
Methoden können einen Rückgabewert liefern. Dies geschieht dann mittels der
Anweisung return Rueckgabewert. Das Schlüsselwort void wird dann durch den
entsprechenden Typ des Rückgabewertes ersetzt (hier ein double):
10.9 Pakete
10.10 Java-Dokumentation
// Definition der Methode anfragenVerkaufspreis mit Rückgabewert
public double anfragenVerkaufspreis() {
System.out.println("Verkaufspreis: " + Verkaufspreis + " Euro");
return Verkaufspreis; }
10.11 Modifiers für Zugriffsspezifizierung
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
59
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
60
10.6 Methoden
Dies kann wie in Immobilienverwaltung6.java und Einfamilienhaus.java
angegeben umgesetzt werden
10.6 Methoden
public class Immobilienverwaltung6 {
public static void main(String args[]) {
System.out.println("Programm Immobilienverwaltung v6");
double Preis;
...
Aufrufen der Methode,
um Rückgabewert zu erhalten
// Ausgabe der Objekte
for (int i=0; i<MAX_OBJ; i++)
{
...
Preis = einEinfamilienhaus[i].anfragenVerkaufspreis();
System.out.println("\nDer Preis ist " + Preis);
}
}
}
In der Bildschirmausgabe von
Immobilienverwaltung6.java
erscheinen nun zusätzliche
Ausgabezeilen
Verkaufspreis: x.x Euro ,
die die entsprechenden Rückgabewerte
der Methode
anfragenVerkaufspreis()
ausgeben.
public class Einfamilienhaus {
// Definition der Attribute
...
Definition der Methode mit
Rückgabewert
// Definition der Methode anfragenVerkaufspreis mit Rückgabewert
public double anfragenVerkaufspreis() {
System.out.println("Verkaufspreis: " + Verkaufspreis + " Euro");
return Verkaufspreis;
}
}
Rückgabe des Wertes
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
61
Hier sind ebenso wieder ab dem
2.Einfamilienhaus die Default-Werte
eingetragen.
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
10.7 Vererbung
10.7 Vererbung
10.1 Java allgemein
Generalisierung und Spezialisierung werden mittels Vererbung ausgeführt, wobei
eine Klasse (abgeleitete Klasse) nicht vollständig neu definiert, sondern von einer
anderen Klasse (Basisklasse) abgeleitet wird.
10.2 Wiederholung der grundlegenden Programmstrukturen
62
In UML wird die Vererbung durch einen Pfeil mit umrandeter Spitze, der von
abgeleiteter Klasse auf Basisklasse zeigt, ausgedrückt.
10.3 Konzepte objektorientierter Programmiersprachen
10.4 Implementierung objektorientierter Konzepte in Java
Die abgeleiteten Klassen Einfamilienhaus und Geschäftshaus erben alle
Attribute und Methoden der Basisklasse Immobilie. D.h. die abgeleiteten Klassen
kennen diese Attribute und können die entsprechenden Methoden ausführen.
Zusätzlich können die abgeleiteten Klassen individuell weitere Attribute und
Methoden definieren.
10.5 Arrays von Objekten
10.6 Methoden
10.7 Vererbung
10.8 Konstruktoren
Basisklasse
abgeleitete Klassen
10.9 Pakete
10.10 Java-Dokumentation
10.11 Modifiers für Zugriffsspezifizierung
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
63
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
64
10.7 Vererbung
10.7 Vererbung
// Definition der Klasse Immobilie
public class Immobilie {
public String Besitzer;
public String Adresse;
public int
Baujahr;
public double Verkaufspreis;
public class Immobilienverwaltung7 {
// Definition der Methode anfragenVerkaufspreis
public double anfragenVerkaufspreis() {
System.out.println("Verkaufspreis: " + Verkaufspreis + " Euro");
return Verkaufspreis;
}
}
// Deklarieren der maximalen Anzahl an Objekten
int MAX_OBJ = 3;
public static void main(String args[]) {
System.out.println("Programm Immobilienverwaltung v7");
double Preis;
// Reservieren des Speicherplatzes für diese Objekte
einEinfamilienhaus = new EinfamilienhausNeu[MAX_OBJ];
// Definition der abgeleiteten Klasse Einfamilienhaus
public class Einfamilienhaus extends Immobilie {
public String Haustyp;
public double Wohnflaeche;
public double AnzahlZimmer;
public double Gartenflaeche;
public boolean HatGarage;
}
// Anlegen der Objekte
for (int i=0; i<MAX_OBJ; i++)
einEinfamilienhaus[i] = new EinfamilienhausNeu();
// Füllen des 1.Objektes mit Werten
einEinfamilienhaus[0].Besitzer
einEinfamilienhaus[0].Adresse
einEinfamilienhaus[0].Baujahr
einEinfamilienhaus[0].Verkaufspreis
einEinfamilienhaus[0].Haustyp
einEinfamilienhaus[0].Wohnflaeche
einEinfamilienhaus[0].AnzahlZimmer
einEinfamilienhaus[0].Gartenflaeche
einEinfamilienhaus[0].HatGarage
// Definition der abgeleiteten Klasse Geschaeftshaus
public class Geschaeftshaus extends Immobilie {
public double AnzahlStockwerke;
public double AnzahlRaeume;
public boolean HatAufzug;
public boolean HatTiefgarage;
22.09.2010
65
© Prof. Dr. Rolf Dornberger
10.7 Vererbung
10.8 Konstruktoren
// Anlegen der Objekte
for (int i=0; i<MAX_OBJ; i++)
einGeschaeftshaus[i] = new Geschaeftshaus();
10.1 Java allgemein
// Füllen des 1.Objektes einGeschaeftshaus
einGeschaeftshaus[0].Besitzer
einGeschaeftshaus[0].Adresse
einGeschaeftshaus[0].Baujahr
einGeschaeftshaus[0].Verkaufspreis
einGeschaeftshaus[0].AnzahlStockwerke
einGeschaeftshaus[0].AnzahlRaeume
einGeschaeftshaus[0].HatAufzug
einGeschaeftshaus[0].HatTiefgarage
"Meier";
"Augsburg";
1920;
7500000.0;
"Bauernhaus";
250;
8;
10000;
true;
// Reservieren des Speicherplatzes für diese Objekte
einGeschaeftshaus = new Geschaeftshaus[MAX_OBJ];
}
OOP: 10 Wiederholung der Grundelemente in Java
=
=
=
=
=
=
=
=
=
// Deklarieren eines Arrays von Objekten einGeschaeftshaus der Klasse Geschaeftshaus
Geschaeftshaus[] einGeschaeftshaus;
public double anfragenAnzahlRaeume() {
return AnzahlRaeume;
}
© Prof. Dr. Rolf Dornberger
// Deklarieren eines Arrays von Objekten einEinfamilienhaus der Klasse EinfamilienhausNeu
// Aufgrund von Namenskonflikten heisst die Klasse Einfamilienhaus nun EinfamilienhausNeu !!
EinfamilienhausNeu[] einEinfamilienhaus;
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
66
22.09.2010
68
10.2 Wiederholung der grundlegenden Programmstrukturen
mit Werten
= "Meyer";
= "Olten";
= 2001;
= 2.5e7;
= 15;
= 50;
= true;
= true;
10.3 Konzepte objektorientierter Programmiersprachen
10.4 Implementierung objektorientierter Konzepte in Java
10.5 Arrays von Objekten
// Ausgabe der Objekte einEinfamilienhaus
for (int i=0; i<MAX_OBJ; i++)
{
System.out.println("\n" + i + ". Einfamilienhaus:");
System.out.println("Besitzer : " + einEinfamilienhaus[i].Besitzer);
System.out.println("Haustyp
: " + einEinfamilienhaus[i].Haustyp);
System.out.println("Schwimmbad: " + einEinfamilienhaus[i].HatGarage);
10.6 Methoden
10.7 Vererbung
Preis = einEinfamilienhaus[i].anfragenVerkaufspreis();
System.out.println("\nDer Preis ist " + Preis);
10.8 Konstruktoren
– 10.8.1 Definition von Konstruktoren
– 10.8.2 Anwendung von Konstruktoren
}
// Ausgabe der Objekte einGeschaeftshaus
for (int i=0; i<MAX_OBJ; i++)
{
System.out.println("\n" + i + ". Geschaeftshaus:");
System.out.println("Besitzer : " + einGeschaeftshaus[i].Besitzer);
System.out.println("Aufzug
: " + einGeschaeftshaus[i].HatAufzug);
10.9 Pakete
10.10 Java-Dokumentation
Preis = einGeschaeftshaus[i].anfragenVerkaufspreis();
System.out.println("\nDer Preis ist " + Preis);
}
10.11 Modifiers für Zugriffsspezifizierung
}
}
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
67
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
10.8.1 Definition von Konstruktoren
10.8.1 Definition von Konstruktoren
Beispielsweise kann die Klasse EinfamilienhausNeu mittels drei Konstruktoren wie folgt zu
EinfamilienhausKonstruktor erweitert werden.
// Definition der abgeleiteten Klasse Einfamilienhaus mit Konstruktoren
public class EinfamilienhausKonstruktor extends Immobilie {
public String Haustyp;
public double Wohnflaeche;
public double AnzahlZimmer;
public double Gartenflaeche;
public boolean HatGarage;
In Java (wie in anderen objektorientierten Programmiersprache auch) lassen sich
spezielle Methoden definieren, Konstruktoren genannt, die bei der Initialisierung
eines Objekts aufgerufen werden. Sie erlauben das Setzen bestimmter Attribute
mittels Übergabeparametern und das Ausführen bestimmter Operationen schon
bei Erzeugung des Objekts.
// Konstruktor mit einem Übergabeparamter String
public EinfamilienhausKonstruktor (String haustyp) {
this.Haustyp = haustyp;
}
In Java sind Konstruktoren als Methoden ohne Rückgabewert definiert. Sie erhalten
den Namen der Klasse, zu der sie gehören.
// Konstruktor mit einem Übergabeparamter boolean
public EinfamilienhausKonstruktor (boolean hatGarage) {
this.HatGarage = hatGarage;
}
Konstruktoren können beliebig viele Übergabeparameter haben, die im Allgemeinen
dann an die Attribute der erzeugten Objekte übergeben werden. Die
Übergabeparameter werden mittels des Schlüsselwortes this den entsprechenden
Attributen des Objektes zugewiesen.
// Konstruktor mit zwei Übergabeparamtern String und boolean
public EinfamilienhausKonstruktor (String haustyp, boolean hatGarage) {
this.Haustyp = haustyp;
this.HatGarage = hatGarage;
}
// weitere Konstruktoren
}
Konstruktoren können überladen werden, d.h. es können mehrmals die gleichen
Konstruktoren in einer Klasse auftreten, die sich aber in ihren Übergabeparametern
(Anzahl und Typ) unterscheiden müssen.
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
Der Konstruktor ist überladen, da er dreimal mit verschiedenen Übergabeparametern (Anzahl und
Typ) vorkommt. Diese Konstruktoren EinfamilienhausKonstruktor heißen jeweils wie die
Klasse. Das Schlüsselwort this weist die Übergabeparameter den entsprechenden Attributen zu.
69
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
70
10.8.1 Definition von Konstruktoren
Das entsprechende Programm Immobilienverwaltung8 sieht damit wie folgt aus.
10.8.1 Definition von Konstruktoren
Wird das Objekt einEinfamilienhaus[0] der Klasse
EinfamilienhausKonstruktor erzeugt und ein String-Übergabeparameter (hier
der String "Bauernhaus") mit übergeben, wird automatisch das Attribut Haustyp
gesetzt. Das explizite Setzen von einEinfamilienhaus[0].Haustyp entfällt damit.
public class Immobilienverwaltung8 {
public static void main(String args[]) {
System.out.println("Programm Immobilienverwaltung v8");
// Deklarieren der maximalen Anzahl an Objekten
int MAX_OBJ = 3;
// Deklarieren und Initialisieren eines Arrays
// von Objekten einEinfamilienhaus der Klasse EinfamilienhausNeu
EinfamilienhausKonstruktor[] einEinfamilienhaus =
new EinfamilienhausKonstruktor[MAX_OBJ];
Wird das Objekt einEinfamilienhaus[1] der Klasse
EinfamilienhausKonstruktor erzeugt und ein Boolescher Übergabeparameter
(hier der Boolesche Wert true) mit übergeben, wird automatisch das Attribut
HatGarage gesetzt. Das explizite Setzen von
einEinfamilienhaus[1].HatGarage entfällt damit.
// Anlegen der Objekte
einEinfamilienhaus[0] = new EinfamilienhausKonstruktor("Bauernhaus");
einEinfamilienhaus[1] = new EinfamilienhausKonstruktor(true);
einEinfamilienhaus[2] = new EinfamilienhausKonstruktor("Stadthaus", true);
// Ausgabe der Objekte einEinfamilienhaus
for (int i=0; i<MAX_OBJ; i++)
{
System.out.println("\n" + i + ". Einfamilienhaus:");
System.out.println("Besitzer : " + einEinfamilienhaus[i].Besitzer);
System.out.println("Haustyp
: " + einEinfamilienhaus[i].Haustyp);
System.out.println("Garage
: " + einEinfamilienhaus[i].HatGarage);
}
}
}
Wird das Objekt einEinfamilienhaus[2] der Klasse
EinfamilienhausKonstruktor erzeugt und zwei Übergabeparameter (hier der
String "Stadthaus" und der Boolesche Wert true) mit übergeben, werden
automatisch die Attribute Haustyp und HatGarage gesetzt. Das explizite Setzen von
einEinfamilienhaus[2].Haustyp und einEinfamilienhaus[2].HatGarage
entfällt damit.
Alle anderen Werte, die nicht vom Konstruktor gesetzt werden, enthalten ihre DefaultWerte (null und false).
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
71
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
72
10.8.2 Anwendung von Konstruktoren
10.8.2 Anwendung von Konstruktoren
Was muss bei der Anwendung von Konstruktoren unbedingt beachtet werden?
Wird in einem Konstruktor auf die Attribute dieser Klasse zugegriffen, wird dies
normalerweise durch das Schlüsselwort this gekennzeichnet. Sind die
Variablennamen unterschiedlich, kann this entfallen.
Wird eine Klasse (Basisklasse) angelegt, von der andere Klassen abgeleitet werden,
und besitzen diese Klassen Konstruktoren, so muss in der Basisklasse ein leerer
Konstruktor definiert werden.
Von der Klasse ImmobilienNeu wird später
eine andere Klasse abgeleitet. Beide Klassen
sollen Konstruktoren besitzen.
Damit muss in ImmobilienNeu
ein leerer Konstruktor stehen.
Im Beispiel ImmobilieNeu ist Baujahr das Attribut der Klasse ImmobilieNeu
und baujahr die lokale Variable im Konstruktor. this kann hier entfallen.
// Definition der Klasse ImmobilieNeu
public class ImmobilieNeu {
public String Besitzer;
public String Adresse;
public int
Baujahr;
public double Verkaufspreis;
Besitzen das Attribut der Klasse und die
lokale Variable im Konstruktor denselben
Variablennamen, gibt es zwar keinen Fehler
beim Kompilieren, aber einen logischen
Fehler, der nur sehr schwer zu finden ist!
// Leerer Konstruktor
public ImmobilieNeu() {
}
// Konstruktor zum Setzen von Baujahr
public ImmobilieNeu(int baujahr) {
Baujahr = baujahr;
}
// Konstruktor zum Setzen von Verkaufspreis
public ImmobilieNeu(double Verkaufspreis) {
this.Verkaufspreis = Verkaufspreis;
}
}
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
73
Hier ist Verkaufspreis das Attribut der
Klasse ImmobilieNeu und ebenso ist
Verkaufspreis die lokale Variable im
Konstruktor. this darf hier nicht entfallen.
© Prof. Dr. Rolf Dornberger
// Definition der Klasse ImmobilieNeu
public class ImmobilieNeu {
public String Besitzer;
public String Adresse;
public int
Baujahr;
public double Verkaufspreis;
// Konstruktor zum Setzen von Baujahr
public ImmobilieNeu() {
}
// Konstruktor zum Setzen von Baujahr
public ImmobilieNeu(int baujahr) {
Baujahr = baujahr;
}
// Konstruktor zum Setzen von Verkaufspreis
public ImmobilieNeu(double Verkaufspreis) {
this.Verkaufspreis = Verkaufspreis;
}
}
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
74
22.09.2010
76
10.8.2 Anwendung von Konstruktoren
Konstruktoren müssen sich in ihrer
Anzahl und/oder ihrem Datentyp
der übergebenen Parameter
unterscheiden.
– String, boolean, String
und boolean, String und
String, double, int
// Definition der abgeleiteten Klasse EinfamilienhausKonstruktorNeu
public class EinfamilienhausKonstruktorNeu extends ImmobilieNeu {
public String Haustyp;
public double Wohnflaeche;
public double AnzahlZimmer;
public double Gartenflaeche;
public boolean HatGarage;
Wird in der abgeleiteten Klasse auf
Attribute der Basisklasse
zugegriffen, geschieht dies mit
dem Schlüsselwort super.
– super.Besitzer
– super(baujahr)
© Prof. Dr. Rolf Dornberger
// Deklarieren der maximalen Anzahl an Objekten
int MAX_OBJ = 5;
// Konstruktor mit einem Übergabeparamter boolean
public EinfamilienhausKonstruktorNeu (boolean HatGarage) {
this.HatGarage = HatGarage;
}
// Deklarieren und Initialisieren eines Arrays
// von Objekten einEinfamilienhaus der Klasse EinfamilienhausNeu
EinfamilienhausKonstruktorNeu[] einEinfamilienhaus =
new EinfamilienhausKonstruktorNeu[MAX_OBJ];
// Konstruktor mit zwei Übergabeparamter String
public EinfamilienhausKonstruktorNeu (String haustyp, String besitzer) {
this.Haustyp = haustyp;
super.Besitzer = besitzer;
}
// Konstruktor mit einem Übergabeparamter double
public EinfamilienhausKonstruktorNeu (double verkaufspreis) {
super.Verkaufspreis = verkaufspreis;
}
Soll ein Konstruktor der
übergeordneten Klasse
aufgerufen werden, geschieht dies
mit super(Parametern).
public static void main(String args[]) {
System.out.println("Programm Immobilienverwaltung v8.1");
// Konstruktor mit einem Übergabeparamter String
public EinfamilienhausKonstruktorNeu (String haustyp) {
Haustyp = haustyp;
}
// Konstruktor mit zwei Übergabeparamtern String und boolean
public EinfamilienhausKonstruktorNeu (String Haustyp, boolean HatGarage) {
this.Haustyp = Haustyp;
this.HatGarage = HatGarage;
}
– super.Verkaufspreis
10.8.2 Anwendung von Konstruktoren
public class Immobilienverwaltung81 {
// Konstruktor mit einem Übergabeparamter int
public EinfamilienhausKonstruktorNeu (int baujahr) {
super(baujahr);
}
}
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
75
// Anlegen der Objekte
einEinfamilienhaus[0]
einEinfamilienhaus[1]
einEinfamilienhaus[2]
einEinfamilienhaus[3]
einEinfamilienhaus[4]
=
=
=
=
=
new
new
new
new
new
EinfamilienhausKonstruktorNeu("Bauernhaus");
EinfamilienhausKonstruktorNeu(true);
EinfamilienhausKonstruktorNeu("Stadthaus", true);
EinfamilienhausKonstruktorNeu(1983);
EinfamilienhausKonstruktorNeu(1000000.0);
// Ausgabe der Objekte einEinfamilienhaus
for (int i=0; i<MAX_OBJ; i++)
{
System.out.println("\n" + i + ". Einfamilienhaus:");
System.out.println("Besitzer : " + einEinfamilienhaus[i].Besitzer);
System.out.println("Haustyp
: " + einEinfamilienhaus[i].Haustyp);
System.out.println("Garage
: " + einEinfamilienhaus[i].HatGarage);
System.out.println("Baujahr
: " + einEinfamilienhaus[i].Baujahr);
System.out.println("Preis
: " + einEinfamilienhaus[i].Verkaufspreis);
}
}
}
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
10.9 Pakete
10.1 Java allgemein
10.9 Pakete
10.2 Wiederholung der grundlegenden Programmstrukturen
Jede Klasse in Java wird in einem Paket abgelegt. Zum Auffinden der Klasse wird der Name des
Pakets gefolgt von einem Punkt und dem anschliessenden Klassennamen angegeben.
10.3 Konzepte objektorientierter Programmiersprachen
Ein Paket kann dabei ebenfalls selbst wiederum in einem anderen Paket liegen, womit der gesamte
Name mehrere Punkte beinhalten kann. Z.B. beinhaltet java.util.Date die Klasse Date im
Paket util, das wiederum im Paket java liegt.
10.4 Implementierung objektorientierter Konzepte in Java
10.5 Arrays von Objekten
Damit nun eine Klasse verwendet werden kann, muss mittels einer der beiden Möglichkeiten
spezifiziert werden, wo genau sie liegt:
– Die Klasse wird über ihren vollständigen Namen angesprochen:
java.util.Date d = new java.util.Date();
10.6 Methoden
10.7 Vererbung
– Am Anfang jedes Java-Files werden noch vor den eigentlichen Klassendefinitionen die
benötigten Klassen mittels der import Anweisung angegeben:
import java.util.*;
public class xyz {
...
Date d = new Date();
... }
10.8 Konstruktoren
10.9 Pakete
10.10 Java-Dokumentation
10.11 Modifiers für Zugriffsspezifizierung
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
77
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
78
10.9 Pakete
10.9 Pakete
Die import-Anweisung gibt es in zwei unterschiedlichen Varianten:
– Mit
import paket.Klasse;
wird nur genau die Klasse Klasse des Pakets paket importiert.
– Mit
import paket.*;
können alle Klassen des Pakets paket auf einmal importiert werden.
Fazit: Die Verwendung vollständiger Namen hat den Nachteil, dass die Klassennamen sehr lang
werden. Bequemer ist die Anwendung mit der import-Anweisung, womit sogleich alle Klassen
eines Pakets mittels eines * importiert werden können, z.B. java.util.*
Die Bedeutung der Punkte zur Trennung von Paketnamen liegt im strukturierten Ablegen der
Klassen in einer entsprechenden Verzeichnisstruktur. Beispielsweise sind die Klassen vom Paket
java.util.* im Verzeichnis java/util/ abgelegt.
Das "Home-Verzeichnis" für die Java-Pakete ist dabei das File src.zip für alle java-Quellcodes
und das File jre/lib/rt.jar für alle class-Files im entsprechenden Installationsverzeichnis des
JDK.
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
79
Wichtige Pakete
java.applet
java.awt
java.beans
java.io
java.lang
java.lang.ref
java.lang.reflect
java.math
java.net
java.nio
java.rmi
java.security
java.sql
java.text
java.util
javax.accessibility
javax.crypto
javax.imageio
javax.naming
javax.print
javax.security.auth
javax.sound
javax.swing
javax.xml
© Prof. Dr. Rolf Dornberger
Bedeutung
Applets
Abstract Windowing Toolkit inkl. diverser Unterpakete
Java Beans
Bildschirm- und Datei-I/O
Elementare Sprachunterstützung
Referenz-Objekte
Reflection-API (Application Programming Interface)
Fließkomma-Arithmetik
Netzwerkunterstützung
New I/O Package (seit JDK 1.4)
Remote Method Invocation (RMI)
Security-Dienste
Datenbankzugriff (JDBC)
Internationalisierung
Diverse Utilities, Collection-Klassen und Datenstrukturen
Unterstützung für Braille-Zeilen und ähnliche Ein-/Ausgabegeräte
Kryptographische Erweiterungen
Lesen und Schreiben von Bilddateien
Zugriff auf Namens-Services
Unterstützung zum Drucken
Authentifizierung und Autorisierung
Sound-API
SWING-Toolkit
Zugriff auf XML-Dateien
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
80
10.10 Java-Dokumentation
10.1 Java allgemein
10.9 Pakete
Um selber Klassen zu erstellen und einem bestimmten Paket zuzuordnen,
muss ganz am Anfang des Quelltextes (noch vor den import-Anweisungen)
in dem File, in dem die Klasse abgespeichert ist, eine geeignete packageAnweisung verwendet werden.
Diese besteht aus dem Schlüsselwort package und dem Namen des Pakets,
in dem die nachfolgende Klasse abgelegt werden soll, also ganz analog zur
import-Anweisung.
10.2 Wiederholung der grundlegenden Programmstrukturen
10.3 Konzepte objektorientierter Programmiersprachen
10.4 Implementierung objektorientierter Konzepte in Java
10.5 Arrays von Objekten
10.6 Methoden
10.7 Vererbung
Der Aufbau und die Bedeutung der Paketnamen in der package-Anweisung
ist identisch zur import-Anweisung.
Damit legt der Compiler entsprechende Unterverzeichnisse gemäss den
Angaben der package-Anweisung an und speichert in diesen
Unterverzeichnissen die kompilierten Java-Klassen ab. Diese Pakete können
dann quasi als Komponenten wiederverwendet werden.
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
81
10.10 Java-Dokumentation
10.8 Konstruktoren
10.9 Pakete
10.10 Java-Dokumentation
10.11 Modifiers für Zugriffsspezifizierung
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
82
22.09.2010
84
10.10 Java-Dokumentation
Java-Dokumentation (z.B. JavaDoc 1.5)
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
83
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
10.10 Java-Dokumentation
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
10.10 Java-Dokumentation
22.09.2010
85
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
86
10.11 Modifiers für Zugriffsspezifizierung
10.1 Java allgemein
10.11 Modifiers für Zugriffsspezifizierung
10.2 Wiederholung der grundlegenden Programmstrukturen
Modifiers sind Schlüsselwörter in Java, welche dem Compiler Zusatzinformationen über
die Zugriffsspezifizierung von Klassen, Variablen und Methoden geben.
10.3 Konzepte objektorientierter Programmiersprachen
10.4 Implementierung objektorientierter Konzepte in Java
Die Access Modifier in Java sind:
– public
10.5 Arrays von Objekten
– protected
10.6 Methoden
– private
– friendly
10.7 Vererbung
10.8 Konstruktoren
Pro Ausdruck kann höchstens ein Access Modifier vergeben werden.
10.9 Pakete
Die Modifier für statische und konstante Ausdrücke sind:
– static
10.10 Java-Dokumentation
– final
10.11 Modifiers für Zugriffsspezifizierung
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
87
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
88
10.11 Modifiers für Zugriffsspezifizierung
10.11 Modifiers für Zugriffsspezifizierung
friendly
private
Die Access Modifier (public, protected, private, -) regeln die
Zugriffserlaubnis (Sichtbarkeit) auf Klassen, Methoden und Attribute innerhalb
des gesamten Java-Programms:
– Elemente mit der Eigenschaft public sind in der Klasse, in den Methoden dieser
Klasse, in den Methoden abgeleiteter Klassen und für den Aufrufer von Instanzen
dieser Klasse sichtbar. (in UML: +)
– Elemente mit der Eigenschaft protected sind in der Klasse, in den Methoden
dieser Klasse und in den Methoden abgeleiteter Klassen sichtbar. Zusätzlich
können Klassen desselben Pakets sie aufrufen. (in UML: #)
– Elemente mit der Eigenschaft private sind lediglich in der Klasse und in den
Methoden dieser Klasse sichtbar. Abgeleitete Klassen und Aufrufer von Instanzen
der Klasse haben auf private Elemente keinen Zugriff. (in UML: -)
– Elemente, die ohne einen der drei genannten Modifier deklariert werden, werden als
package scoped oder als Elemente mit Standard-Sichtbarkeit oder einfach als
friendly bezeichnet. Sie sind nur innerhalb des Pakets sichtbar, zu dem diese
Klasse gehört. In anderen Paketen sind sie dagegen unsichtbar. (in UML keine
Kennzeichnung)
protected
public
Restriktion nimmt ab!!!
private ist der restriktivste Access Modifier.
Klassen können nicht als private deklariert werden. Eine private Variable oder
Methode kann nur von einer Klasseninstanz gebraucht werden.
private ist so restriktiv, dass nicht einmal die Sub-Klassen auf private-Variablen
oder Methoden der Oberklasse zugreifen dürfen.
public ist der grosszügigste Access Modifier. Eine public Klasse, Variable oder
Methode kann überall in einem Java-Programm verwendet werden. Beispielsweise ist
als public class Applet deklariert, damit sie von einem Browser instanziert
werden kann.
In jeder Applikation hat es zudem eine main-Methode, welche public ist. Sie kann
von einer JVM aufgerufen werden.
Klassen selber können eigentlich nur public oder friendly als Access Modifier haben.
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
89
10.11 Modifiers für Zugriffsspezifizierung
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
90
22.09.2010
92
10.11 Modifiers für Zugriffsspezifizierung*
Die zwei weiteren Modifiers static und final regeln zwar nicht direkt die
Zugriffsspezifizierung auf Klassen, Variablen und Methoden, definieren aber zusätzliche
Eigenschaften für deren Zugriff. Sie dürfen miteinander und mit den anderen Modifiers kombiniert
werden.
static kann auf Attribute und Methoden angewendet werden, um diese als statisch zu
beschreiben. Diese static-Eigenschaft ist eine Klasseneigenschaft und führt zu Klassenattributen
und Klassenmethoden. Um auf eine static-Eigenschaft zuzugreifen, ist kein Objekt notwendig.
(Wird in späteren Kapiteln noch genauer erklärt.)
final ist ein Modifier, der Klassen, Attribute und Methoden als konstant bzw. nicht mehr
veränderbar charakterisiert. D.h. deren Eigenschaften können nicht mehr geändert werden:
– Eine Klasse, die final ist, kann nicht vererbt werden.
– Einer Variablen, die final ist, kann kein neuer Wert zugewiesen werden.
– Eine Methode, die final ist, kann nicht überschrieben werden.
Anwendbarkeit der Modifiers:
© Prof. Dr. Rolf Dornberger
Modifier anwendbar auf
public
protected
friendly
private
final
static
Klasse
Ja
Nein
Ja
Nein
Ja
Nein
OOP: 10 Wiederholung der Grundelemente in Java
Attribut
Ja
Ja
Ja
Ja
Ja
Ja
Methode
Ja
Ja
Ja
Ja
Ja
Ja
22.09.2010
* http://www.teialehrbuch.de/Kostenlose-Kurse/JAVA/6630-Die-Zugriffsrechte-in-Java.html
91
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
Lernziele
Die Konzepte objektorientierter Programmiersprachen verstehen und umsetzen können.
Folgende Begrifffelder einordnen können:
– Klassen, Objekte, Instanz
– Attribute, Methoden, Kapselung
– Beziehungen, Vererbung, Assoziation
– Polymorphismus, Überladen und Wiederverwendung
In Java implementieren können:
– Klassen
– Generierung von Objekten einer Klasse
– Generierung von Arrays von Objekten
– Methoden
– Vererbung, Konstruktoren
Die wichtigsten Pakete kennen und einsetzen können.
Java-Dokumentation kennen und einsetzen können.
Modifiers kennen und einsetzen können.
© Prof. Dr. Rolf Dornberger
OOP: 10 Wiederholung der Grundelemente in Java
22.09.2010
93