Algorithmik 1 - Friedrich-Alexander-Universität Erlangen

Werbung
Algorithmik 1
Prof. Dr. Michael Philippsen
Friedrich-Alexander-Universität
Erlangen-Nürnberg
Informatik 2 • Programmiersysteme
Martensstraße 3 • 91058 Erlangen
Kapitel 5 - Objektorientierung
5.1
5.2
5.3
5.4
5.5
Sichtbarkeit in Java
Modularität
Klassenhierarchien
Polymorphie und Typsicherheit
Beispiel
Handy aus!
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-2
M. Philippsen
5.1 Sichtbarkeit in Java
Gültigkeitsbereich eines Namens („scope“)
class Uhr {
long minuten;
long stunden;
void setzeZeit(long stunden,
long minuten) {
this.minuten = minuten;
this.stunden = stunden;
}
Uhr kopiere() {
Uhr c = new Uhr();
c.stunden = stunden;
c.minuten = minuten;
c.zeitzone = zeitzone;
return c;
}
...
}
minuten, stunden sichtbar
außerhalb und innerhalb von
Uhr
Parameter sichtbar in
setzeZeit
Attribute der Klasse Uhr
überdeckt in setzeZeit,
sichtbar über Referenz this
(=Verweis auf das Objekt selbst)
c sichtbar in kopiere
Attribute von c sichtbar in
kopiere
this nicht nötig, da Attribute
der Klasse Uhr nicht überdeckt
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-3
M. Philippsen
5.1 Sichtbarkeit in Java
Kapselungsprinzip („encapsulation“)
ƒ Dem Benutzer einer Klasse sollten die Interna der Klasse nicht
zugänglich sein:
y Geheimnisprinzip: Kenntnisse über Attribute und
Methodenimplementierungen gelangen nicht nach außen.
y Unabhängigkeit: Programmierung möglich ohne Rücksicht auf andere;
Änderung einer Implementierung hat keine Effekte auf andere.
ƒ Für die Benutzer dürfen nur Schnittstellen nach außen sichtbar sein;
das sind folglich die Methodensignaturen (Benutzersicht).
ƒ Aber: Die Klassenvereinbarungen belassen volle Einsicht in die
Implementierung. Diese dürfen daher nur einem Ersteller der Klasse
bekannt sein (Anbietersicht).
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-4
M. Philippsen
5.1 Sichtbarkeit in Java
Klasse („class“)
Schnittstelle („interface“)
Dienst
Dienst
Algorithmen und
Datenstrukturen
implements
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-5
M. Philippsen
5.1 Sichtbarkeit in Java
Schnittstelle („interface“)
ƒ Eine Schnittstelle ist an keine Methodenimplementierungen gebunden;
sie beschreibt nur deren Signaturen.
ƒ Eine Implementierung der angegebenen Methoden muss also in einer
Klasse erfolgen.
ƒ Eine Klasse kann keine, eine oder mehrere Schnittstellen
implementieren.
ƒ Bei Objektvariablen kann als Typ statt einer Klasse eine Schnittstelle
angegeben werden.
y Die Referenz kann aber nur auf ein Objekt verweisen.
y Wird ihr ein Objekt zugewiesen, so muss dessen Klasse die Schnittstelle
implementieren.
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-6
M. Philippsen
5.1 Sichtbarkeit in Java
ƒ Schnittstellen werden in Java durch das Schlüsselwort
interface eingeleitet.
ƒ Durch implements wird angegeben, dass eine Klasse
mindestens die in der Schnittstelle angegebenen Methoden
implementiert.
Schnittstelle
interface Taktgeber {
long leseZeitInSekunden();
}
class Uhr implements Taktgeber {
...
long leseZeitInSekunden() {
return (stunden*3600)+(minuten*60);
}
...
}
Taktgeber t = new Uhr();
long l = t.leseZeitInSekunden();
Klasse muss Methoden der Schnittstelle
enthalten!
Variable vom Typ
der Schnittstelle
garantiert, dass
Methoden-Code
vorhanden ist.
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-7
M. Philippsen
5.1 Sichtbarkeit in Java
Zugriffsbeschränkungen („visibility“)
ƒ Abschwächung: Der Zugriff auf Klassen, Attribute und Methoden von
außen kann durch den Klassenimplementierer mittels Modifikatoren
(„modifier“) eingeschränkt werden.
ƒ private gibt an, dass nur von innerhalb der Klasse selbst auf das
Attribut bzw. die Methode zugegriffen werden kann.
ƒ public gibt an, dass ein Zugriff von überall auf das Attribut bzw. die
... und ohne Modifikator? s.u.
Methode möglich ist.
public class Uhr {
// Zugriff auf Attribute von außen nicht möglich
private long minuten;
private long stunden;
// Zugriff von außen nur über Methoden möglich
public Uhr() { ... }
public void setzeZeit(long std, long min) { ... }
...
}
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-8
M. Philippsen
5.2 Modularität
Modul
ƒ Ein Modul ist eine Komponente mit einer gewissen Abgeschlossenheit:
Es erbringt Dienste, nimmt aber kaum welche in Anspruch.
ƒ Ein Modul ist somit ein Teilsystem mit einer klaren und schmalen
Grenze zu seiner Umgebung.
Modularisierung
ƒ Eine Modularisierung eines Systems erfolgt zum Zwecke der
Übersichtlichkeit, Arbeitsteilung, Wiederverwendung, ...
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-9
M. Philippsen
5.2 Modularität
Paket („package“)
ƒ Zusammenstellung der Vereinbarungen von als zusammengehörig
betrachteten Java-Klassen und Java-Interfaces.
ƒ Ein Paket besitzt einen Namen, der - wie von Dateiverzeichnissen her
bekannt - hierarchisch aufgebaut sein kann:
y java.lang
y uhren
y com.apple.quicktime.v2
y edu.cmu.cs.bovik.cheese
ƒ Der Paketname definiert einen Namensraum für die im Paket
vorkommenden Klassendeklarationen.
y Es wäre daher durchaus möglich innerhalb des Pakets uhren eine Klasse
String zu realisieren. Durch Verwendung qualifizierter Klassennamen
(java.lang.String bzw. uhren.String) kann Eindeutigkeit erreicht
werden.
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-10
M. Philippsen
5.2 Modularität
ƒ Bei der Klassendeklaration kann das Paket, in das die Klasse kommen soll,
mit package angegeben werden
ƒ Zugriff auf eine Klasse in einem Paket über qualifizierten Namen =
<Paketname>.<Klassename>. Alternative: Paketname wird mittels import
bekannt gemacht. Dann reicht <Klassenname>.
Schnittstelle ist im
package uhren;
selben Paket. Daher
interface Taktgeber {
ist Name bekannt.
long leseZeitInSekunden();
}
package uhren;
public class Uhr implements Taktgeber {
...
}
Zur Verwendung ohne
import: qualifizierten
Name verwenden.
uhren.Taktgeber t = new uhren.Uhr();
import uhren.*;
Taktgeber t = new Uhr();
Import macht Namen
aus Paket bekannt;
Kurzform dann nutzbar.
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-11
M. Philippsen
5.2 Modularität
Klassenbibliothek („library“)
ƒ Sammlung vordefinierter, häufig verwendeter Klassen, auf die bei der
Programmierung zugegriffen werden kann.
ƒ In Java ist dies eine Menge von Paketen.
ƒ Java selbst liefert zum Beispiel die Pakete:
y java.awt
y java.io
y java.lang
y java.net
y java.sql
y java.util
y javax.swing
Klassen für GUIs (Abstract Window Toolkit)
Ein-/Ausgabe in Dateien o.ä.
Zentrale Klasse von Java (z.B. Object)
Verwaltung von Netzwerkverbindungen
Datenbankanbindung
Nützliche Klassen (z.B. Kalender, Listen)
Graphische Oberfläche
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-12
M. Philippsen
5.2 Modularität
Zugriffsbeschränkungen (1)
global
Unterklassen
Paket
protected
Klasse
public
(ohne)
Unterklassen
Klassen-/Schnittstellenname
Der Name von
Klassen/Schnittstellen,
y … die ohne Modifikator
deklariert sind, ist nur im
selben Paket sichtbar.
y … die als public deklariert
sind, ist global sichtbar (und
kann z.B. importiert werden).
y … die als protected
deklariert sind, ist nur in
deren Unterklassen und
Unterschnittstellen sichtbar
(unabhängig davon, in
welchem Paket diese liegen).
Als final deklarierte Klassen dürfen keine Unterklassen haben.
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-13
M. Philippsen
5.2 Modularität
Zugriffsbeschränkungen (2)
Sofern die enthaltende
Klasse erreichbar ist:
global
Unterklassen
Unterklassen
Gemäß Zugreifbarkeit
d. enthaltenden Klasse
Paket
Methode
Attribut
Friedrich-Alexander-Universität Erlangen-Nürnberg
public
protected
private
(ohne)
Klassenname
Algorithmik 1, WS 2004/05, Folie 5-14
Unterklassen
protected
Klasse
public
(ohne)
Unterklassen
Attribut-/Methodenname
final : nicht überschreibbar
M. Philippsen
5.2 Modularität
Zugriffsbeschränkungen für Methoden/Attribute (textuell)
Sofern die enthaltende Klasse erreichbar ist, gilt:
ƒ public
von überall zugreifbar, am wenigsten restriktiv
ƒ private
niemand außerhalb der (enthaltenden) Klasse kann
zugreifen
ƒ protected Zugriff aus allen Klassen des selben Pakets möglich
(wenn die enthaltende Klasse da auch sichtbar ist.)
Zugriff in allen Unterklassen möglich (auch wenn diese
in anderen Paketen liegen).
ƒ (ohne)
von überall im Paket zugreifbar
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-15
M. Philippsen
5.2 Modularität
classpath
ƒ Übersetzt man eine Klasse Bsp aus dem Paket Foo.Bar, dann wird
der erzeugte Code (Bsp.class) im Verzeichnis <dir>/Foo/Bar
bzw. <dir>\Foo\Bar abgelegt.
y Mit der Option -d kann man <dir> beim Übersetzen angeben, falls
nicht das aktuelle Verzeichnis gemeint ist.
y Beispiel: javac –d ~/classes Bsp.java
//Unix
ƒ Will man die main-Routine dieser Klasse starten, so muss man den
voll qualifizierten Klassennamen angeben: java Foo.Bar.Bsp
Also nicht den Dateinamen angeben!
ƒ Damit der Übersetzer und das Java-Laufzeitsystem den erzeugten
Code findet, muss <dir> in der Umgebungsvariable CLASSPATH
eingetragen sein.
y Beispiel: setenv CLASSPATH ~/classes
//Unix
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-16
M. Philippsen
5.3 Klassenhierarchien
Vererbung zwischen Schnittstellen
ƒ Zwischen zwei Schnittstellen wird in Java sowohl Einfach- als auch
Mehrfachvererbung unterstützt, wobei extends die Schnittstelle(n)
angibt, deren Signaturen übernommen werden:
interface TaktgeberMillisekunden extends Taktgeber {
...
}
ƒ Werden zwei gleich benannte Methoden über verschiedene Pfade
ererbt,
y so wird bei identischen Signaturen eben diese Signatur übernommen und
y so werden bei unterschiedlichen Signaturen beide übernommen und dann
als überladene Methoden behandelt.
Mehr in Abschnitt 7.2
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-17
M. Philippsen
5.3 Klassenhierarchien
Überschreiben von Methoden („method overriding“)
ƒ Eine Unterklasse kann eine neue Implementierung für eine ererbte
(Objekt-/Instanz-)Methode bereit halten. (Nicht für Klassenmethoden)
ƒ Dann kann immer noch auf die Implementierung der direkten
Oberklasse über die Referenz super zugegriffen werden.
class Uhr {
...
public void anzeigen() {}
}
class AnalogUhr extends Uhr {
...
// Selbe Signatur wie in Oberklasse
public void anzeigen() {
super.anzeigen();
// führt Code von Uhr.anzeigen()aus
...
}
}
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-18
M. Philippsen
5.3 Klassenhierarchien
Überschreiben versus Überladen
Überladene Methoden
Überschriebene Methoden
ƒ haben unterschiedliche Signaturen
ƒ haben dieselben Signaturen
y Klassenmethoden können keine
Instanzmethoden überschreiben
y Umgekehrt auch nicht
ƒ haben i.A. unterschiedliche
Implementierungen
ƒ Vorkommen:
y in einer Klasse und einer ihrer
Unterklassen oder
y in einer Klasse (nebeneinander)
ƒ Statische Methoden können
überladen werden
ƒ haben i.A. unterschiedliche
Implementierungen
ƒ Vorkommen:
y In einer Klasse und einer ihrer
Unterklassen
ƒ Statische Methoden können nicht
überschrieben werden (wohl aber
verdeckt Æ nächster Abschnitt.)
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-19
M. Philippsen
5.3 Klassenhierarchien
Abstrakte Klasse in Java („abstract class“)
ƒ Zur Erinnerung:
y Oberklasse mit nur partieller Implementierung; restliche Implementierung
muss in einer Unterklasse nachgeholt werden.
y Mischung aus Klasse und Schnittstelle, daher keine Ausprägungen mögl.
abstract class Uhr {
...
abstract void anzeigen();
}
class AnalogUhr extends Uhr {
...
void anzeigen() {
...
}
}
Abstrakte Methode: legt nur
Aufrufschnittstelle ohne
Implementierung fest.
Unterklasse liefert die
Implementierung, die
zur Schnittstelle passt.
ƒ Hat eine Klasse eine Schnittstelle als Obertyp und implementiert sie
aber nicht alle Methoden der Schnittstelle, so ist sie ebenfalls abstrakt.
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-20
M. Philippsen
5.3 Klassenhierarchien
Wurzel der Hierarchie
ƒ Eine Klasse, die nicht explizit Unterklasse einer anderen Klasse ist, ist
stets implizit Unterklasse von java.lang.Object.
ƒ Die Klasse Object hat eine Reihe von Methoden, die vor allem bei der
Arbeit mit parallelen Kontrollfäden relevant werden Æ später mehr.
ƒ Wichtige Methode: String toString()
y Liefert textuelle Repräsentation des Objekts.
y System.out.println(Object) ruft toString() auf.
y Die Standardimplementierung sollte daher bei eigenen Objekten
überschrieben werden, wenn man ihren Zustand einfach ausdrucken
möchte.
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-21
M. Philippsen
5.4 Polymorphie und Typsicherheit
ƒ Polymorphie („polymorphism“) = Fähigkeit, verschiedene Gestalt
anzunehmen
ƒ Eine polymorphe Operation („polymorphic operation“) kann auf
Objekte verschiedener Klassen ausgeführt werden und jeweils ein
anderes Verhalten haben
y Entstehung polymorpher Operationen durch Überladen
à Beispiel: println(long), println(float), println(Object)
Je nachdem von welchem Typ das Argument o im Aufruf println(o) ist,
wird die „passende Version“ der Methode println aufgerufen.
y Entstehung polymorpher Operationen durch Überschreibung
à Beispiel: java.lang.Object hält eine Standardimplementierung von
toString() bereit, die (bei Bedarf) in eigenen Klassen überschrieben wird.
Je nach dem Typ eines Objekts o wird bei o.toString() unterschiedlicher
Code ausgeführt.
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-22
M. Philippsen
5.4 Polymorphie und Typsicherheit
ƒ Eine polymorphe Variable („polymorphic variable“) kann im Laufe der
Ausführung eines Programms Referenzen auf Objekte von
verschiedenen Klassen haben. Eine polymorphe Variable hat einen
y statischen Typ: Dieser wird durch Angabe der Klasse bei der Deklaration
angegeben und kann bei der Übersetzung überprüft werden
y dynamischen Typ: Dieser wird durch die Klasse des Objekts angegeben,
auf den Variable zur Laufzeit zeigt.
Object c;
//statischer Typ von c: Object
c = new Uhr(); //dynamischer Typ von c: Uhr
c.anzeigen(); //Nicht typsichere Sprachen führen zur
//Laufzeit die Methode anzeigen der Klasse
//Uhr (dynamischer Typ von o) aus.
Java ist typsicher. Der statische Typ von c (Klasse
Object) deklariert keine Methode anzeigen.
Daher Fehlermeldung des Übersetzers.
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-23
M. Philippsen
5.4 Polymorphie und Typsicherheit
Polymorphe Variablen in typsicheren Sprachen
ƒ Sei v eine Variable mit Referenzsemantik vom Typ T/der Klasse T.
Dann dürfen der Variablen v Verweise auf Objekte der Klasse T oder
einer beliebigen Unterklasse von T zugewiesen werden.
y Die Unterklasse verfügt über alle Eigenschaften der Oberklasse und
kann daher deren Platz einnehmen.
Uhr c = new Uhr();
//statischer Typ von c: Uhr
c = new AnalogUhr(); //dynamischer Typ von c: AnalogUhr
// Typsicherheit:
// Alle Methoden von Uhr können auf c aufgerufen werden
c.anzeigen()
//die anzuwendende Implementierung
//wird zur Laufzeit ausgewählt
y Typsicherheit: Es dürfen nur Methoden aufgerufen werden, die schon
beim statischen Typ von c (Oberklasse Uhr) verfügbar sind.
Diese Methoden sind durch Vererbung in jedem Fall bei allen Objekten
beliebiger Unterklassen verfügbar (ggf. überschrieben.)
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-24
M. Philippsen
5.4 Polymorphie und Typsicherheit
Dynamisches Binden („late binding“)
ƒ Die auszuführende Implementierung einer Instanzmethode wird erst
zur Laufzeit festgelegt. (Zeitbedarf!)
ƒ Oft auch als virtueller Methodenaufruf bezeichnet.
ƒ Hierzu muss dynamischer Typ des aktuellen Objektes bekannt sein.
ƒ Nach einer Implementierung wird zur Laufzeit zuerst bei dieser Klasse
und dann aufsteigend in den Oberklassen gesucht.
y Bei Mehrfachvererbung nicht eindeutig, daher in Java nicht zugelassen.
Uhr c = new Uhr();
c.setzeZeit(11, 42);
c.anzeigen();
// Implementierung in Uhr
// Implementierung in Uhr
c = new AnalogUhr();
c.setzeZeit(11, 42);
c.anzeigen();
// Implementierung in Uhr
// Implementierung in AnalogUhr
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-25
M. Philippsen
5.4 Polymorphie und Typsicherheit
Statisches Binden
ƒ Während Instanzmethoden in Java dynamisch gebunden werden,
werden Klassenmethoden (static) statisch gebunden.
class Super {
static String greeting() { return "Goodnight"; }
String name() { return "Richard"; }
}
class Sub extends Super {
static String greeting() { return "Hello"; }
String name() { return "Dick"; }
Statischer Typ: Super
}
class Test {
Dynamischer Typ: Sub
public static void main(String[] args) {
Super s = new Sub();
System.out.println(s.greeting() + ", " + s.name());
}
}
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-26
Liefert: „Goodnight, Dick“
M. Philippsen
5.4 Polymorphie und Typsicherheit
Klasse versus Typ
ƒ Typ
y Eigenschaft von Variablen und Ausdrücken
y definiert Mindestforderung bzgl. anwendbarer Operationen
y rein syntaktisch festgelegt (statisch ermittelbar)
ƒ Klasse
y
y
y
y
stellt Konstruktor(en) für Objekte bereit (- gilt nicht für abstrakte Klassen!)
definiert Signatur oder Implementation der Operationen
Ein Objekt gehört zu der Klasse mit deren Konstruktor es konstruiert wurde.
Mit der Klassendefinition wird ein gleichnamiger Typ eingeführt
ƒ Beachte:
y Variablen gleichen Typs können Objekte unterschiedlicher Klassenzugehörigkeit
referieren (benennen).
y Die werden sich i.a. unterschiedlich verhalten.
y Beispiel: Oberklasse A mit zwei Unterklassen A1 und A2.Variable kann mit Typ A
deklariert werden und kann Objekte aus A1 und A2 referieren.
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-27
M. Philippsen / H. Stoyan
5.4 Polymorphie und Typsicherheit
Typumwandlung („casting“)
ƒ Zu welcher Klasse ein konkretes Objekt gehört, lässt sich mit instanceof
überprüfen.
Uhr c;
...
if (c instanceof DigitalUhr) {
...
}
ƒ Im Inneren der if-Anweisung hat c immer noch den statischen Typ Uhr.
Methoden, die nur die Unterklasse DigitalUhr anbietet, können wegen der
geforderten Typsicherheit nicht aufgerufen werden.
Abhilfe: explizite Typwandlung
In Java wird zur Laufzeit
Uhr c;
sichergestellt, dass diese
...
Typwandlung korrekt ist.
if (c instanceof DigitalUhr) {
DigitalUhr digital = (DigitalUhr)c;
...
}
digital hat anderen
statischen Typ als c.
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-28
M. Philippsen
5.4 Polymorphie und Typsicherheit
Typumwandlung am Beispiel
public class UhrenKonfiguration {
public static Uhr konfigurieren(Uhr c) {
if (c instanceof AnalogUhr) {
AnalogUhr analog = (AnalogUhr)c;
analog.setzeZifferblattfarbe(java.awt.Color.blue);
return analog;
} else if (c instanceof DigitalUhr) {
DigitalUhr digital = (DigitalUhr)c;
digital.setzeSchriftgroesse(30);
return digital;
} else {
return c;
DigitalUhr-spezifische
}
Methoden werden aufgerufen.
}
}
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-29
M. Philippsen
5.4 Polymorphie und Typsicherheit
Überschreiben versus Verdecken
ƒ Auf verdeckte Variablen und verdeckte (statische) Methoden (der
Oberklasse) kann recht einfach zugegriffen werden
y Im Inneren der verdeckenden Klasse: super…
y Von Außen: Vorher Typwandlung auf gewünschte Klasse
ƒ Eine überschrieben Instanzmethode der Oberklasse
y kann nur im Inneren der überschreibenden Klasse per super…
aufgerufen werden.
y Ein Aufruf von außen ist nicht möglich.
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-30
M. Philippsen
5.4 Polymorphie und Typsicherheit
Überschreiben versus Verdecken am Beispiel
class Super {
String hi = „Hi";
String name() { return "Richard"; }
}
class Sub extends Super {
String hi = „Hello";
String name() { return "Dick"; }
}
Super s = new Sub();
s.hi
//Hi
((Sub)s).hi
//Hello
((Super)s).hi
//Hi
s.name();
//Dick
((Sub)s).name()
//Dick
((Super)s).name() //Dick
Auch beim Zugriff auf
Instanzvariablen wird
statisch gebunden.
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-31
M. Philippsen
5.5 Beispiel
Implementierung der Klasse Uhr (1)
package uhren;
import java.util.Date;
import uhren.Taktgeber;
import uhren.TimeZone;
public abstract class Uhr implements Taktgeber {
private static long zaehler = 0;
private long
seriennummer;
private long
minuten;
private long
stunden;
private TimeZone
zeitzone = new TimeZone("UTC");
private final Date
herstellungsdatum = new Date();
public Uhr() {
seriennummer = zaehler;
zaehler++;
}
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-32
M. Philippsen
5.5 Beispiel
Implementierung der Klasse Uhr (2)
...
public Uhr(long min) {
this();
stunden = min / 60;
minuten = min % 60;
}
public abstract void anzeigen();
public void setzeZeit(long std, long min) {
stunden = std; minuten = min;
}
public void setzeZeit(long std) {
setzeZeit(std, 0);
}
public long leseZeitInSekunden() {
return (stunden * 3600) + (minuten * 60);
}
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-33
M. Philippsen
5.5 Beispiel
Implementierung der Klasse Uhr (3)
...
public void setzeZeitZone(TimeZone tz) {
if (tz == null) {
return;
}
zeitzone = tz;
}
public TimeZone leseZeitZone() {
return zeitzone;
}
...
}
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-34
M. Philippsen
5.5 Beispiel
Abgeleitete Klasse AnalogUhr
package uhren;
import java.awt.Color;
import uhren.Uhr;
public class AnalogUhr extends Uhr {
private Color zifferblattfarbe;
public AnalogUhr(long min) {
super(min);
}
public void anzeigen() { ... }
public void setzeZifferblattfarbe(Color c) {
zifferblattfarbe = (c == null) ? Color.blue : c;
}
}
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-35
M. Philippsen
5.5 Beispiel
Abgeleitete Klasse DigitalUhr
package uhren;
import uhren.Uhr;
public class DigitalUhr extends Uhr {
private int schriftgroesse;
public DigitalUhr(long min) {
super(min);
}
public void anzeigen() { ... }
public void setzeSchriftgroesse(int groesse) {
schriftgroesse = (groesse <= 0) ? 10 : groesse;
}
}
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-36
M. Philippsen
5.5 Beispiel
Schnittstelle Taktgeber und Klasse TimeZone
package uhren;
interface Taktgeber {
long leseZeitInSekunden();
}
package uhren;
public class TimeZone {
private String identifikator;
public TimeZone(String id) {
setzeIdentifikator(id);
}
public void setzeIdentifikator(String id) {
identifikator = id;
}
}
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-37
M. Philippsen
5.5 Beispiel
Klasse zur Konfiguration einer Uhr
package uhren;
import uhren.*;
import java.awt.Color;
public class UhrenKonfiguration {
public static Uhr konfigurieren(Uhr c) {
if (c instanceof AnalogUhr) {
AnalogUhr analog = (AnalogUhr)c;
analog.setzeZifferblattfarbe(Color.blue);
return analog;
} else if (c instanceof DigitalUhr) {
DigitalUhr digital = (DigitalUhr)c;
digital.setzeSchriftgroesse(30);
return digital;
} else {
return c;
}
}
}
Friedrich-Alexander-Universität Erlangen-Nürnberg
Algorithmik 1, WS 2004/05, Folie 5-38
M. Philippsen
Herunterladen