Post on 06-Apr-2015
OOP mit JAVA
Objektorientierte ProgrammierungEinführung
1. Objekte und Klassen
• Java-Objekte modellieren Objekte eines Anwendungsbereichs
• Objekte können kategorisiert werden• Eine Klasse beschreibt alle Objekte einer
Kategorie bzw. eine bestimmte Art von Objekten• Objekte werden durch Klassen erzeugt
new Klassenname();• Objekte repräsentieren individuelle Instanzen
einer Klasse
1. Objekte und Klassen• Eine Klasse, viele gleichartige Instanzen (Objekte)• Objekte haben einen Zustand, der durch Werte in
Datenfeldern (Variablen, Attribute) festgehalten wird• Die Menge der momentanen Werte aller Attribute, die ein
Objekt definieren, wird auch als Zustand des Objekts bezeichnet.
• Methoden:– können den Zustand eines Objektes verändern, wenn sie
aufgerufen werden– werden in der Klasse eines Objekts definiert– Alle Instanzen einer Klasse haben die gleichen Methoden– Aber, die Methoden werden an konkreten Instanzen
aufgerufen, so dass ganz klar ist welches Objekt seinen Zustand ändern soll.
1. Objekte und Klassen• Methoden können Informationen über ein Objekt durch ein Ergebniswert
zurückliefern:Bsp.:String gibName(){…} //Liefert Ergebniswert vom Typ String zurück; vor der Methode steht der Datentyp des Rückgabewerts
void nameAendern(String neuerName){…}//Schlüsselwort void kennzeichnet eine Methode ohne Rückgabewert
void groesseAendern(int neueHoehe, int neueBreite){…}//Methode mit zwei Parametern (Übergabewerte)
1. Objekte und Klassen
• Objekte können miteinander kommunizieren, in dem sie gegenseitig ihre Methoden aufrufen.
• Objekte können als Parameter an andere Objekte übergeben werden
• Wenn eine Methode ein Objekt als Übergabeparameter erwartet, wird der Name des Objekts als Parametertyp in der Signatur angegeben:
void trageStudentEin(Student neuerStudent){…}
2. Klassendefinitionenpublic class Ticketautomat {
//Datenfelder(Instanzvariablen, Attribute, Variablen) speichern die//Daten, die das Objekt benutzt
//Konstruktoren, erlauben es, neu erzeugte Objekte in//einen vernünftigen Anfangszustand zu versetzen (Initialisierung)
//Methoden implementieren das Verhalten der Objekte
}
2.1 Variablenarten
A. Parameter innerhalb eines Konstruktors oder einer Methode
B. Datenfeld außerhalb eines Konstruktors oder einer Methode deklariert
formaler Parameter aktueller Parameter, Zustandswert
steht einem Objekt nur im Rumpf des Konstruktors oder der Methode zur Verfügung
steht in der Klasse zur Verfügung und kann von Konstruktoren und Methoden dieser Klasse benutzt werden
nach außen hin nicht sichtbar in der Klasse sichtbar und verwendbar
Lebensdauer auf Dauer der Ausführungszeit des Konstruktors oder der Methode beschränkt
Lebensdauer auf Dauer der Objektexistenz beschränkt
2.2 Zuweisungen
• Speichern den Wert auf der rechten Seite eines Zuweisungsoperators in der Variablen, die auf der linken Seite genannt ist:
preis=ticketpreis;
• Rechte Seite ist ein Ausdruck• Regel:
Typ des Ausdrucks muss zum Typ der Variablen passen.
2.3 Methoden• Sondierende Methoden: liefern Informationen über den Zustand eines Objektes
(gib-Methoden, get)
private int preis;public int gibPreis() {
return preis; }
• Verändernde Methoden: ändern den Zustand (set-Methoden)
public void setzePreis(int zahl) { preis=zahl;
}oder
public void setzePreis(int preis) { this.preis=preis; }
2.4 Entscheidungen treffen
Eine bedingte Anweisung führt eine von zwei Aktionen aus, abhängig vom Ergebnis der Prüfung
if ( führe eine Prüfung durch, die true oder false liefert) {auzuführende Anweisungen, falls die Prüfung true geliefert hat}
else {auzuführende Anweisungen, falls die Prüfung false geliefert hat}
2.5 Lokale Variablen – dritte Variablenart
• wird innerhalb einer Methode oder eines Konstruktors deklariert und benutzt, also im Rumpf
• müssen explizit initialisiert werden, d.h. sie werden nicht automatisch mit einem Standardwert initialisiert
• sind häufig temporäre Speicherplätze, die die Erfüllung der Aufgabe einer Methode/Konstruktors unterstützen.
• nur innerhalb der Methode zugreifbar, sichtbar• werden bei Methodenaufruf angelegt und sind auf Lebensdauer der
Methodenausführung beschränkt, werden nach Methodenausführung entfernt .(Garbage Collection=autom. Speicherbereinigung bei JAVA)
• Achtung: Eine lokale Variable mit dem gleichen Namen wie ein Datenfeld verhindert, dass innerhalb der definierenden Methode auf das Datenfeld zugegriffen wird. (später this)
2.5 Lokale Variablen – dritte Variablenart
public int wechselgeldAuszahlen(){
int wechselgeld;wechselgeld = bisherGezahlt;bisherGezahlt=0;return wechselgeld;
}
Zeichenkette zusammensetzen:System.out.println(''# '' + preis + '' Cent. '');
Ü: Welcher Datentyp sollte für folgende Werte verwendet werden?
0 "hallo " 101-1 true "33" 3.1415
intStringintintbooleanStringdouble
Ü: Heizungsaufgabe
3. Objektinteraktion
• Abstraktion• Modularisierung• Objekterzeugung• Objektdiagramme• Methodenaufrufe• Debugger
Abstraktion und Modularisierung
Teile und herrscheAufgaben werden in Teilaufgaben, diese wieder in
Unterteilaufgaben etc., bis die einzelnen Aufgaben klein genug für eine übersichtliche Lösung sind.
Abstraktion ist die Fähigkeit, Details von Bestandteilen zu ignorieren, um den Fokus der Betrachtung auf eine höhere Ebene lenken zu können.
Modularisierung ist der Prozess der Zerlegung eines Ganzen in wohl definierte Teile, die getrennt erstellt und untersucht werden können und die in wohl definierter Weise interagieren
Beispiel: Digitaluhr
1. Klasse für zweiziffrige Anzeigen entwickeln.2. Weitere Klasse, die gesamte Uhrenanzeige aus zwei
Objekten der Klasse aus 1. zusammensetzt.
Objektdiagramm Klassendiagramm
Implementierung der Uhrenanzeige
• Klassen definieren Typen.• Ein Klassenname kann als Typname in einer
Variablendeklaration verwendet werden.• Variablen, die als Typ eine Klasse haben,
können Objekte dieser Klasse halten.
public class Uhrenanzeige{ private Nummernanzeige stunden; private Nummernanzeige minuten;
}
Objektdiagramm vs. Klassendiagramm
• Ein Objektdiagramm zeigt die Objekte und ihre Beziehungen zu einem bestimmten Zeitpunkt während der Ausführung einer Anwendung. Es präsentiert eine dynamische Sicht auf ein Programm. Wenn eine Variable ein Objekt enthält, dann ist dieses Objekt nicht direkt in der Variablen selbst abgelegt, sondern die Variable enthält lediglich eine Referenz auf ein Objekt. Das Objekt, das referenziert wird, ist außerhalb des Objekts gespeichert, das die Referenz hält.
Klassendiagramm vs. Objektdiagramm
• Ein Klassendiagramm zeigt die Klassen einer Anwendung und die Beziehungen zwischen diesen Klassen. Es liefert Informationen über den Quelltext. Es präsentiert eine statische Sicht auf ein Programm.
Primitive Datentypen
• Primitive Datentypen haben keine Methoden.
Logische Operatoren
• Boolesche OperatorenNeben der Negation (!), können die Operatoren– UND & – ODER | – exklusives ODER ^
auch auf Ausdrücke vom Datentyp boolean angewandt werden.
Logische Operatoren• "Short-Circuit" Operatoren: && und ||
Die Operatoren && und || stellen eine Sonderform der logischen UND und ODER Operationen auf boolesche Werte dar:
Wie Sie aus der Wahrheitstabelle für die UND Operation entnehmen können, kann hier ein Ausdruck nur wahr sein, wenn beide Operanden den Wert true haben. Diesen Sachverhalt macht sich der && Operator zu Nutze. Liefert hier der erste Operand den Wert false, so kann das Ergebnis nur noch false sein. Deswegen wird der zweite Operand gar nicht erst ausgewertet, was zu einer besseren Performance führen kann. Die "Short-Circuit"-Operatoren sind vor allem dann nützlich, wenn die erste Abfrage einen Fehlerfall in der zweiten Abfrage verhindert: Im folgenden Beispiel würde beim Überprüfen von ((t != 0) && ((27 / t) < 3)) falls t = 0 ist bei der Auswertung von (27 / t) < 3 ein Fehlerfall eintreten, da ein int nicht durch 0 geteilt werden darf.
Logische Operatoren• Bedingungsoperator: ? :
Der Bedingungsoperator hat folgende Syntax:a ? y : z;
Hierbei muss der Ausdruck vor dem Fragezeichen (hier: a) immer vom Typ boolean sein. Liefert er den Wert true, so wird der Ausdruck zwischen dem Fragezeichen und dem Doppelpunkt (hier: y) ausgewertet, liefert er false, so wird der Ausdruck nach dem Doppelpunkt (hier: z) ausgewertet.
Möchte man y bzw. z einer Variablen zuweisen, so müssen sie vom gleichen Typ sein oder eine implizite Typumwandlung muss möglich sein.
Logische Operatoren• Bitweise OperatorenNeben der bitweisen Inversion (~) gibt es noch folgende bitweise Operatoren:UND & ODER | exklusives ODER ^
Bei UND Operationen ergibt nur 1 & 1 eine 1, alle anderen Kombinationen ergeben 0.
Bei ODER Operationen ergibt nur 0 | 0 eine 0, alle anderen Kombinationen ergeben 1.
Bei exklusiven ODER Operationen ergeben 1 ^ 0 und 0 ^ 1 eine 1, die anderen beiden Kombinationen ergeben 0.
Übung: Logische Operatoren
• S.98, 99• Welche der folgenden Aussagen liefern true?
! (4<5)! false(2>2) || ((4 == 4) && ( 1< 0))(2>2) || (4 == 4) && ( 1< 0)( 34 != 33) && ! false
Verkettung von Zeichenketten
• Zeichenkette zusammensetzen:
• System.out.println(''# '' + preis + '' Cent. '');
Der Modulo-Operator
• Wert = (Wert + 1) % limit;
• Berechnet den ganzzahligen Rest der Division:
7 % 3 = 1, da 7:3= 2 Rest 17 % 5 = 2, da 7:5= 1 Rest 236 % 3 = 0, da 36 : 3 = 12 Rest 0
Objekte erzeugen Objekte
• Objekterzeugung:Objekte können andere Objekte mit dem new-Operator erzeugen.
• private Nummernanzeige Stunden = new Nummernanzeige(24);• private Nummernanzeige Minuten = new Nummernanzeige(60);
• Der new-Operator macht 2 Dinge:1. Er erzeugt ein neues Objekt der angegebenen Klasse.2. Er führt den Konstruktor der Klasse aus.
Objekte erzeugen Objekte
• Eine Klasse kann mehr als einen Konstruktor oder mehr als eine Methode mit dem gleichen Namen enthalten, solange jede von ihnen einen unterschiedlichen Satz von Parametertypen definiert.
• Dies wird allgemein als Überladen eines Konstruktors oder einer Methode bezeichnet.
Methodenaufrufe
• Interner Methodenaufruf: Methoden können andere Methoden der eigenen Klasse als Teil ihrer Implementierung aufrufen. Methodenname(Parameterliste)Wenn ein Methodenaufruf erfolgt, dann wird die passende Methode ausgeführt und anschließend kehrt die Ausführung zur Aufrufstelle zurück und wird bei der nächsten Anweisung nach dem Aufruf fortgesetzt.
• Externer Methodenaufruf: Methoden können Methoden von anderen Objekten über die Punkt-Notation aufrufen.Objektname.Methodenname(Parameterliste)
Das Schlüsselwort this• Wird benutzt, wenn ein Name (Variable) überladen ist. • Wie viele Variablen existieren, während der Konstruktor ausgeführt wird?• 3 Datenfelder + 3 Parameter = 6 Variablen• In JAVA wird immer die Definition des nächsten umschließenden Blocks
verwendet.• Mit this.text können wir auf ein Datenfeld namens text im aktuellen
Objekt zugreifen, dass weiter entfernt definiert wird, als der Parameter.• Warum tun wir das, obwohl wir das Problem mit der Wahl anderer
Parameternamen leicht umgehen könnten?• Manchmal gibt es einen Namen, der die Bedeutung einer Variablen
perfekt beschreibt.• Andere Programmierer nutzen das Schlüsselwort this.
Der Debugger
1. Haltepunkte im Quelltext setzen mit BlueJ (vor die Zeile STOP-Symbol, auf Zeilennummer klicken)
2. Eine Methode aufrufen, die den Haltepunkt enthält.
4. Objektsammlungen
• S. 123 ff• Sammlungen• Schleifen• Iteratoren• Arrays
Sammlungen• Sammlungsobjekte sind Objekte, die eine beliebige
Anzahl anderer Objekte enthalten können.• Beispiel Notizbuch
(Quelltext in Tausch-Schule)ArrayList-Objekt aus einem Package importieren:
import java.util.ArrayList;oderimport java.util.*;
private ArrayList<Personen> mitglieder;
private ArrayList<Ticketautomat> meineAutomaten;
Vordefinierte Methoden: add, size, get
Schreibe eine Methode entferneNotiz, die Mithilfe der vordefinierten remove-Methode eine bestimmte Notiz anhand ihrer Nummer entfernt.
Schreibe eine Methode alleNotizenAusgeben, die alle Notizen mit ihren aktuellen Indexnummern auflistet.
Sammlungen
Schleifenkonstrukte
• Eine Schleife kann benutzt werden, um einen Block von Anweisungen wiederholt ausführen zu lassen, ohne dass die Anweisungen mahrfach in den Quelltext geschrieben werden müssen.1. for-each-Schleife2. while-Schleife3. for-Schleife
1. Die for-each-Schleife: “verbesserte“
for (Elementtyp element : sammlung) {Schleifenrumpf;
}
Für jedes element in sammlung tue, was im Schleifenrumpf steht.
Schleifenkonstrukte
2. Die while-Schleife:
while (Schleifenbedingung) {Schleifenrumpf;
}
Wenn die Auswertung der Schleifenbedingung den boolesche Wert true liefert, wird der Schleifenrumpf ausgeführt und nach dessen Durchlauf die Schleifenbedingung erneut geprüft.
Schleifenkonstrukte
3. Die for-Schleife: („alte“)
for (Initialisierung; Bedingung; Aktion nach Rumpf) {Schleifenrumpf; //Anweisungen, die wiederholt werden sollen.
}
Bsp.: for (int i=1; i<=10; i++){System.out.println(i*i);}
Schleifenkonstrukte
Übungen: Schleifenkonstrukte
• Schreiben Sie eine Schleife in einer Methode test , die alle Vielfachen von 5 zwischen 10 und 95 ausgibt.
• Schreiben Sie eine Schleife in einer Methode fibonacci , die die ersten 20 Fibonacci Zahlen ausgibt. 1 1 2 3 5 8 13 21 34 …!
• Schreiben Sie eine while-Schleife in einer Methode fak, welche die Fakultät einer übergebenen natürlichen Zahl ausgibt!
Sammlung mit fester Größe - Array
• private String[] namen;• namen = new String[24];• String[5]=''Kraus'';
Klassenvariablen-statische Variablen
• private static int mehrwertsteuer=19;Von einer Klassenvariablen existiert immer nur eine Kopie,
unabhäng von der Anzahl der erzeugten Instanzen.
• private final int GRAVITATION = 9;Konstanten sind Variablen, deren Werte sich nicht verändern sollen.
Sie werden mit GROSSBUCHSTABEN gekennzeichnet und müssen sofort bei ihrer Deklaration initialisiert werden.
• Private static final int GROESSE = 10;Klassenkonstanten sind konstante Datenfelder einer Klasse.
Klassenentwurf
• Kopplung und Kohäsion
• Der Begriff Kopplung beschreibt den Grad der Abhängigkeiten zwischen Klassen. Wir streben für ein System eine möglichst lose Kopplung an, also ein System, in dem jede Klasse weitgehend unabhängig ist und mit anderen Klassen nur über möglichst schmale, wohldefinierte Schnittstellen kommuniziert.
Klassenentwurf
• Der Begriff Kohäsion beschreibt, wie gut eine Programmiereinheit eine logische Aufgabe oder Einheit abbildet. In einem System mit hoher Kohäsion ist jede Programmeinheit(eine Methode, eine Klasse, ein Modul) verantwortlich für genau eine wohldefinierte Aufgabe oder Einheit. Eín guter Klassenentwurf weist einen hohen Grad an Kohäsion auf.
Klassenentwurf
• Kapselung reduziert Kopplungen• Die Richtlinie der Kapselung (Informationen
über die Implementierung verbergen) besagt, dass nur Informationen über das WAS einer Klasse (was sie leistet) nach außen sichtbar sein sollten, nicht aber das WIE (ihre Realisierung).
• Vorteil: Wenn keiner anderen Klasse bekannt ist, wie wir unsere Implementierung vornehmen, dann können wir die Implementierung ändern, ohne das andere Klassen beeinträchtigt werden.
Klassenentwurf
• Wir können diese Trennung zwischen dem WAS und WIE erzwingen, in dem wir Datenfelder privat deklarieren und sondierende Methoden für den Zugriff auf sie definieren (get- und set-Methoden).
• Entwurf nach Zuständigkeiten (S. 263)