Universität Stuttgart
Institut für Automatisierungstechnik und Softwaresysteme
Prof. Dr.-Ing. M. Weyrich
Theorie zu Übung 8 „Implementierung in
Java“
Klasse in Java
Die Klasse wird durch das class-Konzept realisiert
Keine Trennung von Spezifikation und Implementierung der Klasse
Klasse ist (abstrakter) Datentyp
class Zaehler{
int Zaehlerstand;
void inkrementieren()
{...}
void initialisieren()
{...}
int getZaehlerstand()
{...}
}
Objekt in Java
Klassen werden wie Datentypen verwendet
Objekte können nur dynamisch erzeugt werden
Zaehler einZaehler;
//Objektvariable
einZaehler = new Zaehler();
//einZaehler verweist auf neues
//Objekt der Klasse Zaehler
einZaehler = null;
//Referenz auf Objekt löschen,
//keine Speicherfreigabe erforderlich
Abstrakte Klasse in Java
Kennzeichnung mit abstract
Sobald eine Klasse eine abstrakte Operation besitzt muss sie als
abstract deklariert werden
Grundlagen der Softwaretechnik
Übung 8: Implementierung in Java
abstract class Abstract1{
public void operation1()
{...}
public void operation2()
{...}
}
abstract class Abstract2{
public abstract void operation1();
...
}
Attribute und Operationen in Java
Sichtbarkeit:
public – sichtbar für alle
protected – im selben Paket für alle sichtbar, außerhalb nur für
Unterklassen sichtbar
private – sichtbar innerhalb der Klasse
Voreinstellung: im Paket für alle sichtbar, außerhalb unsichtbar für
alle
Parameterkonzept bei Operationen in Java:
Primitive Typen: call by value, Ausgabe erfolgt nur über den
Ergebnistyp
Objekttypen: call by reference
Konstruktoren in Java:
Dienen zur Initialisierung von Objekten
Mehrere Konstruktoren pro Klasse möglich
o Unterschiedliche Parameterlisten => overloading
Keine Destruktoren in Java
o Speicherplatz-Freigabe durch garbage collector
52
Grundlagen der Softwaretechnik
Übung 8: Implementierung in Java
class Kreis {
protected Punkt Mittelpunkt = new Punkt(1,1);
//Initialisierung
protected int Radius;
protected static int Anzahl;
//Klassenattribut
public Kreis(){}
//Konstruktor 1
public Kreis (int x, int y){
//Konstruktor 2
Mittelpunkt.setX(x);
Mittelpunkt.setY(y);
}
public void zeichnen() {...}
public static int getAnzahl() {...}
//Klassenoperation
}
Schnittstelle in Java
Kann Konstanten und abstrakte Operationen enthalten
Wird mit dem Schlüsselwort interface deklariert
Wird von Klassen mit dem Schlüsselwort implements realisiert
interface ClassInfo {
public abstract String getClassName();
}
class MyClass implements ClassInfo{
public String getClassName(){
return "MyClass";
}
...
}
53
Grundlagen der Softwaretechnik
Übung 8: Implementierung in Java
54
Beispiel:
public class VersicherungGUI {
Versicherung eineVersicherung;
public void init() {
// Es wird die Implementierung der
// Klasse Lebensversicherung verwendet
eineVersicherung = new Lebensversicherung();
...
}
public void ermittlePraemie() {
double VSumme = ...;
double Praemie =
eineVersicherung.berechnePraemie(VSumme);
...
}
VersicherungGUI
init()
ermittlePraemie()
public interface Versicherung {
//abstrakte Operation
public abstract double berechnePraemie
(double VSumme);
}
«interface»
Versicherung
berechnePraemie (double VSumme)
Aufruf
Lebensversicherung
Unfallversicherung
berechnePraemie (double VSumme)
berechneSonderpraemie(double VSumme)
berechnePraemie (double VSumme)
class Lebensversicherung implements Versicherung
{
//Impl. der (abstrakten) Operation mit switch
public double berechnePraemie(double VSumme)
{
double praemie = 0.0;
class Unfallversicherung implements Versicherung
{
// Impl. der (abstrakten) Operation mit if
public double berechnePraemie(double VSumme)
{
double praemie = 0.0;
int Schalter = (int)((VSumme-1.0/100.0) / 5000.0);
switch (Schalter) {
case 0: praemie = VSumme * 16.8 / 1000.0;
break;
case 1: praemie = VSumme * 12.6 / 1000.0;
if(VSumme > 10000.0)
praemie = VSumme * 8.4 / 1000.0;
else if (VSumme <= 5000.0)
praemie = VSumme * 16.8 / 1000.0;
else
praemie = VSumme * 12.6 / 1000.0;
return praemie;
break;
default: ...; break;
}
return praemie;
}
}
}
}
Assoziationen in Java
Abhängig von:
Obergrenzen der Kardinalitäten (maximal 1 oder größer 1)
Navigierbarkeit (unidirektional oder bidirektional)
Beispiel: Verwaltung
Kardinalität <= 1
einer
unidirektionalen
Assoziation
mit
Grundlagen der Softwaretechnik
Übung 8: Implementierung in Java
KlasseA
KlasseB
0..1
eineRolleB: KlasseB
RolleB
setRolleB(KlasseB einObjektB)
getRolleB() : KlasseB
removeRolleB()
class KlasseA {
KlasseB eineRolleB;
//Referenz-Attribut
//Verwaltungsoperationen
public void setRolleB(KlasseB einObjektB) {
eineRolleB = einObjektB;
}
public KlasseB getRolleB() {return eineRolleB}
public removeRolleB() {eineRolleB = null}
}
Bei bidirektionalen
erforderlich!
Assoziationen
Beispiel: Verwaltung
Kardinalität >1
einer
Verwaltung
unidirektionalen
in
beiden
Klassen
Assoziation
mit
Verwendung der Java-Containerklasse Vector mit Operationen
z.B. addElement(),
removeElement() und
elementAt()
Abteilung
*
Mitarbeiter
class Abteilung {
protected Vector Mitarbeiter;
public void setMitarbeiter (Angestellter ang){
Mitarbeiter.addElement (ang);
}
Angestellter getMitarbeiter (int pos) {
ang =(Angestellter)Mitarbeiter.elementAt(pos);
return ang;
}
void removeMitarbeiter (Angestellter ang) {
Mitarbeiter.removeElement (ang);
}
}
Angestellter
55
Grundlagen der Softwaretechnik
Übung 8: Implementierung in Java
Polymorphismus
Operationen sind automatisch polymorph
Nicht-polymorphe Operation muss explizit als final deklariert
werden
Dann kann diese Operation nicht überschrieben werden
class Grafikobjekt {
public void zeichnen() { ... }
}
class Kreis extends Grafikobjekt {
public void zeichnen() { ... }
}
class Rechteck extends Grafikobjekt {
public void zeichnen() { ... }
}
Grafikobjekt eineGrafik;
eineGrafik = new Kreis();
eineGrafik.zeichnen();
//zeichnet Kreis
eineGrafik = new Rechteck();
eineGrafik.zeichnen();
//zeichnet Rechteck
Mehrfachverebung
In Java ist Mehrfachvererbung für Klassen nicht realisiert.
Statt dessen Schnittstellenkonzept
o Schnittstelle kann nur abstrakte Operationen und Konstanten
weitergeben
o Keine Attribute und Implementierungen von Operationen
Mehrfachvererbung und Schnittstellen sind nicht gleichzusetzen!
class B1 { ... }
interface B2 { ...}
interface B3 { ...}
class D extends B1 implements B2, B3
{...}
56
Grundlagen der Softwaretechnik
Übung 8: Implementierung in Java
57
Zustandsautomat in Java
Verschiedene Implementierungen möglich:
1. Implementierung mit Zustandsattribut (Aufzählungstyp)
In Java existiert kein benutzerdefinierbarer Aufzählungstyp
Lösung z.B. mit Integer Konstanten
class Schublade {
private int classState;
// Zustandsattribut speichert
// aktuellen Zustand
// mögliche Zustände
final static int OFFEN = 1;
final static int ZU_UNVERSCHLOSSEN= 2;
final static int ZU_VERSCHLOSSEN= 3;
public void oeffnen() {
// Jede Operation muss Zustandsattribut abfragen
if (classState == ZU_UNVERSCHLOSSEN
{
classState = OFFEN;
// Aktualisierung des
//Zustandsattributs, wenn mit
//der Operation ein
//Zustandswechsel verbunden ist
...
}
}
2. Überführung in Zustandsmuster => siehe Kapitel 6
3. Implementierung mit switch-case-Anweisung
Switch / While Idiom für Zustandsdiagramme
Implementierungsmuster (Idiom) für Zustandsdiagramme
Bildet Zustandsdiagramm in strukturierten Code nach einem
generischen Codemuster ab
Gleiche Struktur im Zustandsdiagramm und Code
Abbildung von entry, do und exit-Aktionen
Abbildung hierarchischer Zustände
Nachteil: Ereignisbasiert - keine Ausnutzung objektorientierter
Konzepte
Grundlagen der Softwaretechnik
Übung 8: Implementierung in Java
Zustandsdiagramm:
Time Mode
entry:
do:
display time
exit:
button
pushed
button
pushed
Date Mode
entry:
do:
display date
exit:
Strukturiertes Programm in Pseudocode:
58
Grundlagen der Softwaretechnik
Übung 8: Implementierung in Java
59
START
WHILE TRUE
SWITCH currentState
CASE time mode:
WHILE NOT button pushed
display time
ENDWHILE
currentState:= date mode
BREAK
CASE date mode:
WHILE NOT button pushed
display date
ENDWHILE
currentState:= time mode
BREAK
ENDSWITCH
ENDWHILE
END
Regeln des Idioms:
Abbildung Zustandsdiagramm in
o currentState variable
o While-Schleife mit switch-case
Grundgerüst, das alle Zustände als
einzelne Anweisungen enthält
Die Zustände, die Aktionen in einem
Zustand werden durch weitere whileSchleife implementiert.
Bei Verlassen eines Zustandes durch
einen Zustandsübergang wird die Variable
current State aktualisiert.
Realisierung hierarchischer Zustände
o Erzeugen eines switch / while
Blocks für jeden flachen Zustand
o Schachtelung
Zustandshierachie
START
WHILE TRUE
SWITCH currentState
CASE time mode:
WHILE NOT button pushed
display time
ENDWHILE
currentState := date
BREAK
CASE date mode:
WHILE NOT button pushed
display date
ENDWHILE
currentState := time
BREAK
ENDSWITCH
ENDWHILE
END
gemäß
Zusammenfassung
Statisches Modell ist direkt in Java implementierbar
Grundlagen der Softwaretechnik
Übung 8: Implementierung in Java
Bidirektionale Assoziationen benötigen Verwaltung in beiden
Klassen
Zustandsautomaten
können
mit
Implementierungsstrategien implementiert werden
o Mit Zustandsattribut
o Mit Zustandsmuster
o Mit Switch-Case Anweisungen
(Hilfsmittel: Switch/While Idiom)
verschiedenen
60