Softwaretechnologie, © Prof. Uwe Aßmann
5) Weitere Java-Konstrukte
Prof. Dr. rer. nat. Uwe Aßmann Institut für Software- und
Multimediatechnik
Lehrstuhl Softwaretechnologie Fakultät für Informatik
TU Dresden
Version 11-0.1, 4/16/11
1) Bemerkungen zum Selbststudium
2) Sichtbarkeiten 3) Operationen
1)Konstruktoren
4) Ausnahmen
5) super
Literatur
► Obligatorisch:
■ Balzert, verschiedene Abschnitte
■ Boles Kap. 8, 13, 14
► The Java Language Reference Manual.
► Freies Java Buch (leider nur Version 1.1, für Grundlagen):
■ http://www.computer-books.us/java_8.php
■ http://www.computer-books.us/java.php
► Kommunikationsdiagramme:
■ http://www.agilemodeling.com/essays/umlDiagrams.htm
■ http://www.agilemodeling.com/artifacts/communicationDiagram.htm
■ http://en.wikipedia.org/wiki/Communication_diagram
■ http://www.sparxsystems.com.au/resources/uml2_tutorial/
uml2_communicationdiagram.html
Hinweis: Online-Ressourcen!
► Über die Homepage der Lehrveranstaltung (bei "Vorlesungen") finden Sie die Datei
Terminv.java
► Diese Datei enthält eine vollständige Umsetzung des Beispiels
"Terminverwaltung" in lauffähigen Java-Code.
► Empfohlene Benutzung:
■ Lesen
■ Übersetzen, Starten, Verstehen
■ Modifizieren
■ Kritisieren
Laufendes Beispiel Terminverwaltung
class Teambesprechung extends Termin {
private Teammitglied[] teilnahme;
private BesprRaum veranstOrt;
...
};
Termin
# titel
# beginn
# dauer
class Termin { ...
protected String titel;
protected Hour beginn;
protected int dauer;
...
};
Teambesprechung
teilnahme
VeranstOrt Team-
mitglied Bespr.-
raum
2..*
1
Hinweis: Material zum Selbststudium
► Die folgenden Folien enthalten Material zur Java- Programmierung für das Selbststudium.
► Das Material wird in den Übungen an verschiedenen Stellen entfaltet
► Bitte stellen Sie sicher, dass Sie diese Folieninhalte beherrschen
Java im Selbststudium Ausdrücke <Exp>
► Literal
► Variable, spezielle Variable this
► Operator in Ausdruck
► Attributzugriff o.a / super.a / this.a
► Methodenaufruf o.m(...) / super.m(...) / this.m(...)
► Array-Zugriff a[i] / a[i][j] / ...
► Konstruktoraufruf new <ClassName> (<parameterList>)
► Arrayinstanziierung new <BasisTypName> [<n>]
► Konditionalausdruck <BoolExp> ? <Exp1> : <Exp2>
► Cast-Ausdruck (<TypName>) <Exp>
Java im Selbststudium
Anweisungen (1) <Statement>
► Variablendeklaration <Typ> <variable>;
■ mit Wertsemantik (für primitive Typen)
■ mit Referenzsemantik für Referenztypen (Klassen, Interfaces, Enumerations)
► Methodenaufruf mit Semikolon o.m(...);
► Konstruktoraufruf mit Semikolon
new <ClassName> (<parameterList>);
► Zuweisung <variable> = <wert>;
► Leere Anweisung ;
► Block {<StatementList> }
Java im Selbststudium
Anweisungen (2) Auswahl von Kontrollstrukturen
• if (<BoolExp>) <Statement1> else <Statement2>
• switch (<Exp>) {
case <Exp1> : <StatementList1>
...
default: <StatementList>
• while (<BoolExp>) <Statement>
• for (<InitExp>; <BoolExp>; <UpdateExp>) <Statement>
• break [<label>];
• return [<Exp>];
• try <TryBlock>
catch (<formalParam1>) <CatchBlock1>
...
finally <FinallyBlock>
Softwaretechnologie, © Prof. Uwe Aßmann
Verfeinerung von Klassen -
Datenkapselung mit Sichtbarkeit
von Merkmalen
Zugriff auf Attributwerte in Java
► Attributwerte sind „Privatangelegenheit“ eines Objekts (Geheimnisprinzip)
► Acessoren (Zugriffsmethoden) sind implizite Operationen zum Lesen und Schreiben von Attributwerten
■ Lesen („get-Methode“)
■ Setzen („set-Methode“)
► Beispiel:
■ Attribut: beginn: Date
■ Leseoperation: getBeginn(): Date
■ Schreiboperation: setBeginn(d: Date)
► In den meisten objektorientierten Programmiersprachen (auch Java) können Attribute syntaktisch wie Variablen angesprochen werden:
Für Objekt x : Teambesprechung :
■ Attribut: x.beginn (Typ ist Date)
■ Leseoperation: … x.beginn …
Die implizit definierte Variable "This"
class Teammitglied { private String name;
private String abteilung;
public Teammitglied (String name, String abteilung) { this.name = name;
this.abteilung = abteilung;
} ...
};
Teammitglied m = new Teammitglied("Max Müller", "Abt. B");
► Bezüge auf Attributwerte und Operationsaufrufe werden i.A. mit Objekt . Name angegeben.
► "this" bedeutet das Objekt, auf dem die Methode ausgeführt wird.
► "this" wird vom Übersetzer automatisch ergänzt, wenn die Objektangabe fehlt.
Datenkapselung und Sichtbarkeit
► Definition Für eine Operation OP einer Klasse K wird eine Sichtbarkeit definiert, z.B. privat (Regelfall) oder öffentlich.
■ Die Sichtbarkeit eines Attributes ist gleichbedeutend mit der Sichtbarkeit seiner impliziten Operationen.
► Private Operation OP einer Klasse K: Die Ausführung von OP für ein Objekt der Klasse K ist nur durch ein Objekt der selben Klasse K möglich.
► Öffentliche (public) Operation: Ein beliebiges Objekt darf OP ausführen.
► Geschützte (protected) Operation: Ein Objekt O darf OP genau dann ausführen, wenn die Klasse von O eine Unterklasse von K ist.
► Notation:
■ Minuszeichen (privat) – Operation – Attribut
■ Pluszeichen (öffentlich) + Operation + Attribut
■ Kreuzzeichen (geschützt) # Operation # Attribut
Beispiel: Vererbung und Sichtbarkeit in jUML
K1 – a1
# a2 – op1() + op2()
# op3()
op2 kann verwenden:
a1, a2, op1, op3
K2
op4()
• Alle Attribute und Operationen werden als Bestandteil der Objektstruktur vererbt.
• In der Unterklasse sichtbar sind nur öffentliche und geschützte Attribute und Operationen.
op4 kann verwenden:
a2, op2, op3
Sichtbarkeitssymbole:
– private
+ public
# protected K3
op5() op5 kann verwenden:
op2
Modifikatoren (Modifier) für Deklarationen in Java
C
– a1: T1
# a2: T2 + a3: T3 +a4: T4
– op1()
# op2() + op3() +op4()
class C {
private T1 a1;
protected T2 a2;
public T3 a3;
public static T4 a4;
private ... op1(...) {...}
protected ... op2(...) {...}
public ... op3(...) {...}
public static ... op4(...) {...}
}
► Java: Vor den Deklarationen von Attributen und Operationen oft längere Ketten von Schlüsselworten
■ Bsp.: public static void main(...)
► Modifikatoren für Sichtbarkeiten: Umsetzung der UML-Sichtbarkeiten
► Klassenattribute und -operationen: Schlüsselwort static
Datenkapselung mit Sichtbarkeiten (1) - Beispiel
ar12: Teambesprechung titel = "12.Abteilungsrunde"
beginn = 10.10.00 09:00 dauer = 60
Teilnahme
leitet
diverse
Teammitglied- Objekte
Ort
Besprechungsraum-Objekt
verschieben(17.10.00 09:00) 1. Alle Teammitglieder nach Konflikten mit neuem Datum fragen
2. Besprechungsraum zum neuen Termin reservieren
3. Alte Reservierung (Raum) freigeben 4. Datum ändern
Es steht nur lokale Information zur Verfügung:
Attributwerte, assoziierte Objekte
► Private Attributen für Datenkapselung (information hiding)
■ bilden die Grundlage für die Verantwortlichkeit des Objekts
Leitendes Teammitglied
Datenkapselung (2) - Beispiel im Detail
1. verschieben(17.10.00 09:00)
4. Datum ändern ar12: Teambesprechung
titel = "12.Abteilungsrunde"
beginn = 10.10.00 09:00 dauer = 60
leitet
Ort tm1: Teammitglied
tm2: Teammitglied
tm3: Teammitglied
Teilnahme
r18: Besprechungsraum
1. Alle Teammitglieder nach Konflikten mit neuem Datum fragen
1.1 terminBestätigen(neu)
1.2 terminBestätigen(neu)
1.3 terminBestätigen(neu)
2. Besprechungsraum zum neuen Termin reservieren
2. reservieren(neu)
3. Alte Reservierung (Raum) freigeben 3. freigeben(alt)
Anmerkung:
Darstellung= UML-
"Kommunikationsdiagramm"
Datenkapselung (3) – Wohin legt man Operationen?
Beispiel: raumFestlegen() in Klasse Teambesprechung
Teambesprechung titel
beginn dauer
raumFestlegen() einladen() absagen() 1. Wieviele Teilnehmer?
2. Welcher Raum?
3. Reservieren.
tb: Teambesprechung
Teilnahme
(diverse
Teammitglied- Objekte)
n=5 Besprechungsraum
freienRaumSuchen()
R15
R15: Besprechungsraum reservieren(tb)
Prof. U. Aßmann, Softwaretechnologie 18
Datenkapselung (3) – Wohin legt man Operationen?
► Weitere Zweifelsfälle:
■ freienRaumSuchen():
♦ Operation von "Besprechungsraum" oder von "Teambesprechung"?
■ genehmigen():
♦ Operation von "Termin" oder von "Teammitglied"?
► Modularisierungsprinzip der größen Kohäsion/geringen Kopplung:
■ Möglichst intensive Ausnutzung der Datenkapselung (große Kohäsion):
♦ da zuordnen, wo am besten von lokaler Information Gebrauch gemacht werden kann
■ Notwendigkeit zur Objektinteraktion möglichst minimieren (geringe Kopplung)
■ Möglichst Gebrauch von vorhandenen Operationen machen bzw.
Operationen mehrfach nutzen (geringe Redundanz)
► Mit Sichtbarkeiten verbirgt man im Modell Geheimnisse (Parnas' Prinzip des information hiding)
■ Stärkere “Geheimnisse” erlauben bessere Austauschbarkeit von Implementierungen, weil die Umgebung weniger Annahmen trifft
Sichtbarkeits-Symbol UML
Java
Mehr zur Sichtbarkeit von Klassen
Sichtbar für:
Gleiche Klasse
Andere Klasse, gleiches Paket Andere Klasse, anderes Paket Unterklasse, gleiches Paket Unterklasse, anderes Paket
+
public #
protected –
private (default)
ja ja ja ja ja
ja
ja ja
ja ja
ja
ja nein
nein nein nein nein
nein
nein nein
ja / *
* In UML und C++ “nein”, in Java “ja”.
Operationen
... auch Methoden genannt...
Klassenoperation (Statische Operation)
► Definition Eine Klassenoperation A einer Klasse K ist die
Beschreibung einer Aufgabe, die nur unter Kenntnis der aktuellen Gesamtheit der Instanzen der Klasse ausgeführt werden kann.
Gewöhnliche Operationen heißen auch Instanzoperationen.
► UML Notation: Unterstreichung analog zu Klassenattributen.
► Java: Die Methode main() ist statisch, und kann vom Betriebssystem aus aufgerufen werden
■ Klassenattribute und -operationen: Schlüsselwort static
Besprechungsraum raumNr
kapazität reservieren()
freigeben()
freienRaumSuchen()
class Steuererklaerung {
public static main (String[] args) { Steuerzahler hans =
new Steuerzahler();
...
}}
Überladung von Operationen
► Zwei Methoden heissen überladen, wenn sie gleich heissen, sich aber in ihrer Signatur (Zahl oder Typisierung der Parameter)
unterscheiden
■ Auswahl aus mehreren gleichnamigen Operationen nach Anzahl und Art der Parameter.
► Klassisches Beispiel: Arithmetik
+: (Nat,Nat)Nat, (Int,Int)Int, (Real,Real)Real
► Java-Operationen:
int f1 (int x, y) {...}
int f1 (int x) {...}
int x = f1(f1(1,2));
Arithmetic raumNr kapazität plus(Nat, Nat):Nat plus(Int, Int):Int
plus(Real, Real):Real
Überladen vs. Polymorphismus
► Überladung wird vom Java-Übersetzer statisch aufgelöst. Aus
int f1 (int x, y) {...}
int f1 (int x) {...}
int x = f1(f1(1,2));
■ macht der Übersetzer
int f1_2_int_int (int x, y) {...}
int f1_1_int (int x) {...}
int x = f1_1_int( f1_2_int_int(1,2) );
■ indem er die Stelligkeit und die Typen der Parameter bestimmt und den Funktionsnamen in der .class-Datei expandiert
► Polymorphie dagegen kann nicht zur Übersetzungszeit aufgelöst werden
■ Der Merkmalssuchalgorithmus muss dynamisch laufen, da dem
Übersetzer nicht klar ist, welchen Unterklassentyp ein Objekt besitzt (es können alle Typen unterhalb der angegebenen Klasse in Frage kommen)
Konstruktor-Operation
► Definition: Ein Konstruktor (-operation) C einer Klasse K ist eine Klassenoperation, die eine neue Instanz der Klasse erzeugt und initialisiert.
■ Ergebnistyp von C ist immer implizit die Klasse K.
► Explizite Konstruktoroperationen werden in UML mit einem Stereotyp "<<constructor>>" markiert.
► Default-Konstruktor: Eine Konstruktoroperationen ohne Parameter wird implizit für jede Klasse angenommen
Besprechungsraum
raumNr kapazität
freigeben()
freienRaumSuchen() neuerBesprechungsraum
(raumNr, kapazität) <<constructor>>
neuerBesprechungsraum (kapazität) <<constructor>>
class Teammitglied {
... // ohne Konstruktor }
Teammitglied m = new Teammitglied();
Mehr zu Konstruktoren in Java
class Teammitglied { private String name;
private String abteilung;
public Teammitglied (String n, String abt) { name = n;
abteilung = abt;
}
public Teammitglied (String n) { name = n;
abteilung = "";
} ... }
Teammitglied m = new Teammitglied("Max Müller", "Abt. B");
Teammitglied m2 = new Teammitglied("Mandy Schmitt");
► Konstruktoren werden meist überladen:
Löschen von Objekten
► In Java gibt es keine Operation zum Löschen von Objekten (keine "Destruktoren").
■ Andere objektorientierte Programmiersprachen kennen Destruktoren (z.B. C++)
► Speicherfreigabe in Java:
■ Sobald keine Referenz mehr auf ein Objekt besteht, kann es gelöscht werden.
■ Der konkrete Zeitpunkt der Löschung wird vom Java-Laufzeitsystem festgelegt ("garbage collection").
■ Aktionen, die vor dem Löschen ausgeführt werden müssen:
protected void finalize() (über)definieren
► Fortgeschrittene Technik zur Objektverwaltung (z.B. für Caches):
■ "schwache" Referenzen (verhindern Freigabe nicht)
■ Paket java.lang.ref
Beispiel Methodenrumpf (1)
class Teambesprechung {
private Teammitglied[] teilnahme; ...
private boolean abstimmen (Hour beginn, int dauer) { boolean ok = true;
for (int i=0; i<teilnahme.length; i++) ok = ok &&
teilnahme[i].terminBestaetigen(beginn, dauer);
return ok;
}}
Teambesprechung Teammitglied
– abstimmen()
teilnahme 2..*
+terminBestaetigen()
*
<<constructor>>
Teambesprechung(titel, beginn, dauer, teilnehmer)
Beispiel Methodenrumpf (2) – Konstruktor für Netzaufbau
class Teambesprechung {
private Teammitglied[] teilnahme; ...
private boolean abstimmen (Hour beginn, int dauer) ...
public Teambesprechung (String titel,
Hour beginn, int dauer, Teammitglied[] teilnehmer) { // ... titel, beginn, dauer lokal speichern
this.teilnahme = teilnehmer;
if (! abstimmen(beginn, dauer))
System.out.println("Termin bitte verschieben!");
else ...
} ...
}
Teambesprechung Teammitglied
– abstimmen()
teilnahme 2..*
+terminBestaetigen()
*
<<constructor>>
Teambesprechung(titel, beginn, dauer, teilnehmer)
Beispiel Methodenrumpf (3) – öffentl. Methode
class Teammitglied { ...
private Teambesprechung[] teilnahme;
public boolean terminBestaetigen (Hour beginn,int dauer){
boolean konflikt = false;
int i = 0;
while (i < teilnahme.length && !konflikt) { if (teilnahme[i].inKonflikt(beginn, dauer)) konflikt = true;
else i++;
};
return !konflikt;
} ...
}
Teambesprechung Teammitglied
– abstimmen()
teilnahme 2..*
+terminBestaetigen()
*
<<constructor>>
Teambesprechung(titel, beginn, dauer, teilnehmer)
Beispiel Netzaufbau im Java-Programm
► Ein Programm auf höherer Ebene muss zunächst ein Objektnetz
verdrahten, bevor die Objekte kommunizieren können (Aufbauphase).
Dies kann das Hauptprogramm sein
class Terminv {
public static void main (String argv[]) { // Aufbauphase
Besprechungsraum r1 = new Besprechungsraum("R1", 10);
Besprechungsraum r2 = new Besprechungsraum("R2", 20);
Teammitglied mm = new Teammitglied("M. Mueller", "Abt. A");
Teammitglied es = new Teammitglied("E. Schmidt", "Abt. B");
Teammitglied fm = new Teammitglied("F. Maier", "Abt. B");
Teammitglied hb = new Teammitglied("H. Bauer", "Abt. A");
Hour t1s5 = new Hour(1,5); // Tag 1, Stunde 5 Teammitglied[] tlB1 = {mm, es};
Teambesprechung tb1 =
new Teambesprechung("Bespr. 1", t1s5, 2, tlB1);
// jetzt erst Arbeitsphase tb1.raumFestlegen();
...
} }
class Terminv {
public static void main (String argv[]) { // Aufbauphase
Besprechungsraum r1 = new Besprechungsraum("R1", 10);
Besprechungsraum r2 = new Besprechungsraum("R2", 20);
Teammitglied mm = new Teammitglied("M. Mueller", "Abt. A");
Teammitglied es = new Teammitglied("E. Schmidt", "Abt. B");
Teammitglied fm = new Teammitglied("F. Maier", "Abt. B");
Teammitglied hb = new Teammitglied("H. Bauer", "Abt. A");
Hour t1s5 = new Hour(1,5); // Tag 1, Stunde 5 Teammitglied[] tlB1 = {mm, es};
Teambesprechung tb1 =
new Teambesprechung("Bespr. 1", t1s5, 2, tlB1);
// jetzt erst Arbeitsphase tb1.raumFestlegen();
...
} }
Softwaretechnologie, © Prof. Uwe Aßmann
Ausnahmen (Exceptions)
Ausnahmebehandlung in Java
► Ausnahme (Exception):
■ Objekt einer Unterklasse von java.lang.Exception
■ Vordefiniert oder und selbstdefiniert
► Ausnahme
■ auslösen (to throw an exception)
♦ Erzeugen eines Exception-Objekts
♦ Löst Suche nach Behandlung aus
■ abfangen und behandeln (to catch and handle an exception)
♦ Aktionen zur weiteren Fortsetzung des Programms bestimmen
■ deklarieren
♦ Angabe, daß eine Methode außer dem normalen Ergebnis auch eine Ausnahme auslösen kann (Java: throws)
♦ Beispiel aus java.io.InputStream:
public int read() throws IOException;
Java-Syntax für Ausnahmebehandlung
class TotalDiv {
public static int tDiv (int x, int y) throws ArithmeticException {
try {
return (x / y);
}
catch (ArithmeticException e) {
System.err.println(„Division by zero“);
throw new ArithmeticException();
} }
}
Gekapselter Block
Ausnahme- Fänger Schnittstelle
Dynamische Suche nach Ausnahmebehandlung
main m1 m2
/
Suchreihenfolge
• Bei mehreren Abfangklauseln an der gleichen Stelle der Hierarchie gilt die zuerst defi nierte Klausel:
try { }
catch (xException e) catch (yException e)
Suchreihenfolge
► Suche nach Abfangklausel (catch) entlang der (dynamischen) Aufrufhierarchie:
Definition neuer Ausnahmen
class TestException extends Exception { public TestException () {
super();
} }
class SpecialAdd {
public static int sAdd (int x, int y)
throws TestException { if (y == 0)
throw new TestException();
else
return x + y;
} }
Benutzung von benutzerdefinierten Ausnahmen möglich und empfehlenswert !
Deklaration und Propagation von Ausnahmen
► Wer eine Methode aufruft, die eine Ausnahme auslösen kann, muß
■ entweder die Ausnahme abfangen
■ oder die Ausnahme weitergeben (propagieren)
► Propagation in Java: Deklarationspflicht mittels throws (außer bei Error und RunTimeException)
public static void main (String[] argv){
System.out.println(SpecialAdd.sAdd(3,0));
}
Java-Compiler: Exception TestException must be caught, or it must be declared in the throws clause of this method.
Bruch von Verträgen und Ausnahmen
► Man kann Verträge auch mit Ausnahmetests prüfen:
class ContractViolation {..};
class ParameterContractViolation extends ContractViolation {..};
class FigureEditor{
draw (Figure figure) throws ContractViolation {
if (figure == null) throw new ParameterContractViolation();
}}
► im Aufrufer:
try {
editor.draw(fig);
} catch (ParameterContractViolation) { fig = new Figure();
editor.draw(fig);
}
► Vorteil: kontrollierte Reaktion auf Vertragsbrüche.
Regeln zum Umgang mit Ausnahmen
► Gesetz des pragmatischen Programmierers 58: Bauen Sie die Dokumentation ein
■ Ausnahmebehandlung niemals zur Behandlung normaler (d.h. häufig auftretender) Programmsituationen einsetzen
■ Ausnahmen sind Ausnahmen, regulärer Code behandelt die regulären Fälle!
► Gesetz 34: Verwenden Sie Ausnahmen nur ausnahmsweise
■ Nur die richtige Dosierung des Einsatzes von Ausnahmen ist gut lesbar
► Gesetz 35: Führen Sie zu Ende, was Sie begonnen haben
■ Auf keinen Fall Ausnahmen “abwürgen”, z.B. durch triviale Ausnahmebehandlung
■ Ausnahmen zu propagieren ist keine Schande, sondern erhöht die Flexibilität des entwickelten Codes.
► Gesetz 33 Verhindern Sie das Unmögliche mit Zusicherungen
■ Vertragsüberprüfungen, generieren Ausnahmen
Wiederholung: Dynamische Suchalgorithmen in der JVM
► Merkmalssuchalgorithmus
■ Die JVM sucht dynamisch nach Methoden und Attributen entlang der Vererbungshierarchie. Diese ist im .class-Datei abgespeichert und wird darin abgesucht
■ Verwendung für Polymorphie und Reflektion
► Ausnahmenbehandlersuche
■ Die JVM sucht dynamisch den Aufrufkeller nach oben ab, ob zur ausgelösten Ausnahme ein Behandler definiert
Feinheiten der Vererbung
Vererbung und Assoziation zusammen
class Teambesprechung extends Termin {
private Teammitglied[] teilnahme;
private BesprRaum veranstOrt;
...
};
Termin
# titel
# beginn
# dauer
class Termin { ...
protected String titel;
protected Hour beginn;
protected int dauer;
...
};
Teambesprechung
teilnahme
VeranstOrt Team-
mitglied Bespr.-
raum
2..*
1
class Teambesprechung extends Termin { ...
private Teammitglied[] teilnahme;
...
public Teambesprechung (String t, Hour b, Dauer d, Teammitglied[] tn) {
super(t, b, d);
Aufruf von Oberklassen-Konstruktoren durch super-Konstruktoraufruf
class Termin {
protected String titel;
protected Hour beginn;
protected int dauer;
...
public Termin
(String t, Hour b, Dauer d) {
titel = t; beginn = b; dauer = d; };
};
Spezielle Syntax für Konstruktoren:
"super" immer als erste Anweisung!
► "super" ermöglicht Aufruf von Methoden, die in der Oberklasse definiert und überschattet sind.
► Ein Super-Konstruktoraufruf ruft den Konstruktor der Oberklasse auf und kann damit alle Aktionen dessen übernehmen
"super" in überschriebenen Operationen
Termin
verschieben(neu: Date):Boolean ...
Teambesprechung
verschieben(neu: Date):Boolean
class Termin {
boolean verschieben (neu: Date) {
...z.B. Aufzeichnung in Log-datei
}...
}
class Teambesprechung extends Termin
boolean verschieben (neu: Date) {
...
super.verschieben(neu) }...
}
"super"
ermöglicht auch den Zugriff auf überschriebene Versionen von
Operationen, wie sie in einer Oberklasse definiert sind.
Andere Syntax als bei Konstruktoren!
Was haben wir gelernt?
► Kapselung und Modularisierung werden mit Sichtbarkeiten möglich
► Spezielle Variablen (this, super) erlauben den Zugriff auf Attribute und überschriebene Methoden/Operationen
► Ausnahmen für Ausnahmen
► Kommunikationsdiagramme ordnen die Methodenaufrufe über der Fläche an und zeigen die Zeit durch Nummerierung an
► Klassenoperationen von Objektoperationen unterscheiden