Objektorientierte Datenbanken
Beim vorigen Mal:
Objektorientierte Modellierung auf Entwurfsebene am Beispiel UML
Heute:
Umsetzung in objektorientierte Modellierung auf Implementierungsebene am Beispiel Java
Lernziele:
Java aus UML-Sicht verstehen
Kurzeinführung in OOP am Beispiel Java
In Übungen noch vertieft
Ralf Möller, FH-Wedel
Wiederholung UML
Klassen und Instanzen
Attribute
Operationen
Klassenbeziehungen
Generalisierung, Spezialisierung
Auf Klassenebene beschriebene Instanzenbeziehungen
Relationen: Assoziationen, Komposition, Aggregation,
Sichtbarkeit, Namensraumverwaltung
In UML Moduln in Java Packages genannt
Import-Mechanismus in Java:
import java.util.*;
Export-Mechanismus in Java:
Kennzeichnung des Exports von Namen in einem
speziellen Package durch Sichtbarkeitsattribute bei den Namen
public
protected
private
Beispiele siehe unten
Variablen und Typen
Variablen in Programmen speichern Werte und Objektreferenzen
Wertebereich durch Angabe von Typen eingeschränkt
Initialisierung möglich (optional)
Beispiele:
int port;
int port = 1234;
Basis-Datentypen: sog. Werte in Java
Beschreibung immutabler einfacher Objekte
Beschreibung des Wertebereichs von Attributen, Variablen usw.
Zahlen: int, float, ...
Vordefinierte Verknüpfungsoperationen (==, +, -, ...)
Wahrheitswerte: boolean
Vordefinierte Verknüpfungsoperationen (==, and, or, not, ...)
Zeichen (Unicode): char
Vordefinierte Verknüpfungsoperationen (==, ...)
Klassen und Typen
Jede Klasse definiert auch einen Typ
(mit gleichem Namen)
public class Rechnung { int preis;
public void drucken () { ...
} public void stornieren() { ...
}}
Attribute (Felder, Instanzvariablen)
In Java
Objektspezifische Attribute
zusätzlich: sog. statische Attribute
Durch static markiert
Beispiel (Erweiterung der vorher definierten Klasse um mwst):
public class Rechnung {
public static int mwst = 16;
pubic int preis;
...
}
Statische Attribute sind der Klasse zugeordnet
Wertebereich von Attributen durch Typangabe beschrieben
Operationen (in Java Methoden genannt)
Statische vs. objektspezifische Methoden
Methodenarten: Prozeduren vs. Funktionen
Methodenkopf und Methodenrumpf
Methodenrumpf besteht aus Java-Programmcode
Java ist eine klassische Programmiersprache
mit entsprechenden Kontrollstrukturen, Anweisungen und Ausdrücken
Direkter Zugriff auf Attribute der Klasse (zu der die Methode gehört) nur im Rumpf einer objektspezifischen Methode
Attributreferenzen wie Variablenreferenzen notiert
Java-Anweisungen im Methodenrumpf
Zuweisungen: i = 42;
Fallunterscheidungen:
if (i == 42) { ...
} else { ...
}
Schleife:
while (i < 42) { ... }
Methoden
[Sichtbarkeit] [static] [Ergebnistyp] Name
([Typ Name {, Typ Name}])
Prozeduren
Ergebnistyp: void
Prozedurenaufrufe (s.u.) nur als Anweisungen
Funktionen
Ergebnis bestimmt mit:
return Ausdruck
im Rumpf einer Methode
Funktionsaufrufe (s.u.) nur in Ausdrücken verwendbar
Objekterzeugung
Syntax: new Klassenname
Beispiel
Rechnung r1 = new Rechnung;
Initialisierungsprozeduren (Creators)
Methodenname = Klassenname
Klassenname([Typ Parameter {, Typ Parameter}])
Zugriff auf Attribute der neuen Instanz im Rumpf
Aufruf: new Klassenname([Audruck {, Ausdruck}])
Erzeugung einer Instanz einer Klasse unter Verwendung einer neuer OID
Ausführung der „passenden“ Initialisierungsprozedur
In Java keine Destruktoren notwendig, da automatische Speicherrückgewinnung bzgl. nicht mehr referenzierter Objekte in Java-Laufzeitsystem integriert (garbage
collector).
Beispiel
public class Rechnung {
public static int mwst = 16;
pubic int preis;
public Rechnung (int init) { preis = init } ...
}
Rechnung r1 = new Rechnung(100);
Rechnung r2 = new Rechnung(200);
Erzeugung zweier Rechnungsinstanzen mit jeweils unterschiedlichem Wert für das Attribut preis
Die Rechnungsinstanzen sind hier an Variablen r1 und r2 gebunden
Rumpf der Methoden für Rechnungen
public class Rechnung {
public static int mwst = 16;
pubic int preis;
public Rechnung (int init) { preis = init } public void drucken () {
System.out.println(“Der Preis beträgt:“);
System.out.println(preis * (1 + mwst/100));
} ...
}
Zugriff auf Attribute
Im Rumpf von Methoden der definierenden Klasse direkt über Namen:
Beispiel: preis = 88;
Im Rumpf von Methoden außerhalb der definierenden Klasse:
Instanzenspezifische Attribute: r1.preis = 333;
Statische Attribute: Rechnung.mwst = 17;
Operationsaufruf
Statisch
Angabe der Klasse und des Methodennamens
Klassenname . Methodenname ([Ausdruck {, Ausdruck}])
Objektspezifisch
Ausdruck . Methodenname ([Ausdruck {, Ausdruck}])
Metapher des Sendens von Nachrichten
Zugriff auf Methoden: Beispiel
r1.drucken()
Der Preis beträgt: 116
r2.drucken()
Der Preis beträgt: 232