Post on 05-Apr-2015
PRJ 2007/1Stefan Dissmann
Abstrakte Methode
Zusammenfassung:
Abstrakte Methode• definiert nur die Signatur einer Methode• besitzt keinen Methodenrumpf• ist nicht ausführbar• erzwingt eine abstrakte Klasse• muss in Unterklassen implementiert werden• kann zum Formulieren von Algorithmen eingesetzt
werden
• Schlüsselwort: abstract
PRJ 2007/2Stefan Dissmann
Abstrakte Klasse
Zusammenfassung:
Abstrakte Klasse• wird durch nur eine abstrakte Methode erzwungen• kann keine Objekte erzeugen• muss von (konkreten) Unterklassen implementiert
werden
• muss nicht unbedingt abstrakte Methoden besitzen
• Schlüsselwort: abstract
PRJ 2007/3Stefan Dissmann
Interface
Sonderfall:
Interface ähnelt einer Klasse, • die nur abstrakte Methoden enthält• dient nur der Definition einer Benutzungsschnittstelle• enthält keine Realisierung
• Schlüsselwort: interface
PRJ 2007/4Stefan Dissmann
Interface
public interface Vergleichbar {
boolean groesser(Vergleichbar v);
}
Interface
• kann zur Typisierung von Referenzen eingesetzt werden:Vergleichbar ref;
• kann geerbt werden von anderen Interfaces:interface X extends Vergleichbar …
• kann durch Klassen implementiert werden:class K implements Vergleichbar …
PRJ 2007/5Stefan Dissmann
Interface
Anmerkungen:
• Klasse kann Klasse erben undzugleich Interface implementierenBsp.: class K extends L implements I, J, K …
• Klasse besitzt höchstens eine Oberklasse, aber• Klasse kann mehrere Interfaces implementieren und• Interface kann mehrere Interfaces erben
PRJ 2007/6Stefan Dissmann
Klassen-Interface-hierarchie
<<abstract>>
A
<<interface>>
W
K
<<interface>>
V
<<interface>>
X
<<interface>>
Y
<<interface>>
Z
Object
PRJ 2007/7Stefan Dissmann
Klasse - Interface
Warum ist mehrfaches Erben/Implementieren bei Interfaces erlaubt
- und nicht bei Klassen?
PRJ 2007/8Stefan Dissmann
Klasse - Interface
Warum ist mehrfaches Erben/Implementieren bei Interfaces erlaubt
- und nicht bei Klassen?
Klasse vererbt implementierte Methoden zu gleicher Signatur eventuell mehrere Implementierungen
Object
A B
C
PRJ 2007/9Stefan Dissmann
Klasse - Interface
Warum ist mehrfaches Erben/Implementieren bei Interfaces erlaubt
- und nicht bei Klassen?
Klasse vererbt implementierte Methoden zu gleicher Signatur eventuell mehrere Implementierungen
Object
A B
C
toString()
toString()toString()
toString()??
PRJ 2007/10Stefan Dissmann
Klasse - Interface
Warum ist mehrfaches Erben/Implementieren bei Interfaces erlaubt
- und nicht bei Klassen?
Klasse vererbt implementierte Methoden zu gleicher Signatur eventuell mehrere Implementierungen JAVA verhindert das Auftreten des Problems
PRJ 2007/11Stefan Dissmann
Klasse - Interface
Warum ist mehrfaches Erben/Implementieren bei Interfaces erlaubt
- und nicht bei Klassen?
Klasse vererbt implementierte Methoden zu gleicher Signatur eventuell mehrere Implementierungen JAVA verhindert das Auftreten des Problems
Interface vererbt nur Methodenköpfe (Signaturen) gleiche Signaturen sind textuell gleich gleiche Signaturen fallen beim Erben/Implementieren
zusammen das Problem tritt nicht auf!
PRJ 2007/12Stefan Dissmann
Interfaces und abstrakte Klassen
Was soll der ganze Unfug? Klassen abstrakte Klassen Interfaces
erben und vererben
implementieren
Kompatibilität von Referenzen
PRJ 2007/13Stefan Dissmann
Design by Contract
Idee:
Klasse bietet anderen Klassen Funktionalität/Leistung an
durch Methoden
PRJ 2007/14Stefan Dissmann
Design by Contract
Idee:
Klasse bietet anderen Klassen Funktionalität/Leistung an
durch Methoden
Klasse erwartet Funktionalität/Leistung von anderen Klassen
in Form von Methoden
PRJ 2007/15Stefan Dissmann
Design by Contract
Idee:
Klasse bietet anderen Klassen Funktionalität/Leistung andurch Methoden
Klasse erwartet Funktionalität/Leistung von anderen Klassen
in Form von Methoden
Abstimmung erfolgt durch Verhandeln!
PRJ 2007/16Stefan Dissmann
Design by Contract
Idee:
Abstimmung erfolgt durch Verhandeln!
geht nur mit beiden Partnern einzelner Partner formuliert Anforderungen Interface ist Anforderungsbeschreibung
PRJ 2007/17Stefan Dissmann
PRJ 2007/18Stefan Dissmann
Klassen
Anmerkung 1:
Geerbt-werden kann Klasse nicht verhindern,aber die Redefinition ihrer Methoden in Unterklassen:
public class Liste {
final public void fuegeAn(…) { … }
Schlüsselwort final verhindert erneute Definition in Unterklassen
PRJ 2007/19Stefan Dissmann
Klassen
Anmerkung 1:
final kann auch benutzt werden, um Konstante zu definieren!
public class Liste {
final private int maxLaenge = 50;
final public void fuegeAn(…) { … }
Schlüsselwort final verhindert eine erneute Zuweisung an Attribut.
PRJ 2007/20Stefan Dissmann
Klassen
Anmerkung 2:
Objekte können explizit auf Klassenzugehörigkeit überprüft werden:
Element el = new Element();
dann ergeben folgende Ausdrücke true:el instanceof Object
el instanceof Element
el instanceof Vergleichbar (falls Element Vergleichbar implementiert)
PRJ 2007/21Stefan Dissmann
Klassen
Anmerkung 2:
Objekte können explizit auf Klassenzugehörigkeit überprüft werden:
Element el = new Element();
dann ergeben folgende Ausdrücke true:el instanceof Object
el instanceof Element
el instanceof Vergleichbar (falls Element Vergleichbar implementiert)
Operator
PRJ 2007/22Stefan Dissmann
Klassen
Anmerkung 2:
Objekte können explizit auf Klassenzugehörigkeit überprüft werden:
Element el = new Element();
dann ergeben folgende Ausdrücke true:el instanceof Object
el instanceof Element
el instanceof Vergleichbar (falls Element Vergleichbar implementiert)Anwendung aber häufig schlechter Stil
?
PRJ 2007/23Stefan Dissmann
Klassen
Statische Methoden
• bekannt (und genutzt) seit der ersten Vorlesung:
public static void main(String[] args) { … }
PRJ 2007/24Stefan Dissmann
Klassen
Statische Methoden
• bekannt (und genutzt) seit der ersten Vorlesung:
public static void main(String[] args) { … }
PRJ 2007/25Stefan Dissmann
Klassen
Statische Methoden
• bekannt (und genutzt) seit der ersten Vorlesung:
public static void main(String[] args) { … }
• Konsequenz: main kann ausgeführt werden,ohne dass ein Objekt der Klasse erzeugt werden
muss!
PRJ 2007/26Stefan Dissmann
Statische methoden
Kpublic void m() …
public static void
s() …
PRJ 2007/27Stefan Dissmann
Statische methoden
Kpublic void m() …
public static void
s() …
r = new K();m() …
PRJ 2007/28Stefan Dissmann
Statische methoden
Kpublic void m() …
public static void
s() …
r
m() …
PRJ 2007/29Stefan Dissmann
Statische methoden
Kpublic void m() …
public static void
s() …
r
m() …
möglich ist:r.m();
PRJ 2007/30Stefan Dissmann
Statische methoden
Kpublic void m() …
public static void
s() …
r
m() …
möglich ist:r.m();möglich ist auch:
K.s();
PRJ 2007/31Stefan Dissmann
Statische methoden
Kpublic void m() …
public static void
s() …
r
m() …
möglich ist:r.m();und auch:r.s();
möglich ist auch:K.s();
PRJ 2007/32Stefan Dissmann
Statische Methoden
Zusammenfassung:
Statische Methoden• können über Referenzen aufgerufen werden• können über den Klassennamen aufgerufen werden
benötigen also kein Objekt zur Ausführung können daher nicht auf Eigenschaften eines Objekts
zugreifen,können also keine normalen Methoden oder
Attribute nutzen,(die nur in Objekten verfügbar sind)
PRJ 2007/33Stefan Dissmann
Statische Methoden
Zusammenfassung:
Statische Methoden• können über Referenzen aufgerufen werden• können über den Klassennamen aufgerufen werden
benötigen also kein Objekt zur Ausführung
können daher nicht auf Eigenschaften eines Objekts zugreifen,
können also keine normalen Methoden oder Attribute nutzen,
(die nur in Objekten verfügbar sind)
statische Methoden benötigen statische Attribute
PRJ 2007/34Stefan Dissmann
Statische Attribute
Beispiel:
public class Objektzaehler {
private static int anzahl = 0;
public Objektzaehler() {
anzahl++;
}
public static int gibAnzahl() {
return anzahl;
}
}
PRJ 2007/35Stefan Dissmann
Statische Attribute
Beispiel:
public class Objektzaehler {
private static int anzahl = 0;
public Objektzaehler() {
anzahl++;
}
public static int gibAnzahl() {
return anzahl;
}
}
PRJ 2007/36Stefan Dissmann
Statische Attribute
Beispiel:
public class Objektzaehler {
private static int anzahl = 0;
public Objektzaehler() {
anzahl++;
}
public static int gibAnzahl() {
return anzahl;
}
}
PRJ 2007/37Stefan Dissmann
Statische Attribute
Beispiel (Fortsetzung):
Objektzaehler oz;
oz = new Objektzaehler();
oz = new Objektzaehler();
oz = new Objektzaehler();
System.out.println(oz.gibAnzahl());
System.out.println(Objektzaehler.gibAnzahl());
PRJ 2007/38Stefan Dissmann
Statische Attribute
Beispiel (Fortsetzung):
Objektzaehler oz;
oz = new Objektzaehler();
oz = new Objektzaehler();
oz = new Objektzaehler();
System.out.println(oz.gibAnzahl());
System.out.println(Objektzaehler.gibAnzahl());
Liefert: 3
3
PRJ 2007/39Stefan Dissmann
Statische Attribute
Anmerkung:
System ist eine Klasse
out ist ein statisches Attribut in System, und zwareine Referenz auf ein Objekt (OutputStream)
println ist eine Methode der Klasse OutputStream
System.out.println(…)