OOP mit JAVA Objektorientierte Programmierung Einführung

Preview:

Citation preview

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)

Recommended