PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
-
Upload
kilian-hennen -
Category
Documents
-
view
107 -
download
0
Transcript of PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
PKJ 2005/1Stefan Dissmann
Klassenhierarchie
Person
Kunde
Goldkunde
Lieferant
Object
PKJ 2005/2Stefan Dissmann
Klasse Object
public Object()
protected Object clone() // Creates and returns a copy of this object.
public Boolean equals(Object obj) // Indicates whether some other object is "equal to" this one.
public Class<? extends Object> getClass() // Returns the runtime class of an object.
public int hashCode() // Returns a hash code value for the object.
public String toString() // Returns a string representation of the object.
PKJ 2005/3Stefan Dissmann
Erinnerung
Ziel war:Liste,in der beliebige Objekte abgelegt werden können
Lösung mit Object klar:Elemente enthalten Referenzen auf ObjectMethoden der Liste arbeiten auf Object
PKJ 2005/4Stefan Dissmann
Allgemeine Elemente
public class IntElement {
private int wert;
private IntElement nachfolger;
public IntElement(int w) {
wert = w; nachfolger = null;
}
public void verkette(IntElement n) { nachfolger = n; }
public IntElement gibNachfolger() { return nachfolger; }
public int gibWert() { return wert; }
}
PKJ 2005/5Stefan Dissmann
Allgemeine Elemente
public class IntElement {
private int wert;
private IntElement nachfolger;
public IntElement(int w) {
wert = w; nachfolger = null;
}
public void verkette(IntElement n) { nachfolger = n; }
public IntElement gibNachfolger() { return nachfolger; }
public int gibWert() { return wert; }
}
PKJ 2005/6Stefan Dissmann
Allgemeine Elemente
public class Element {
private Object wert;
private Element nachfolger;
public Element(Object w) {
wert = w; nachfolger = null;
}
public void verkette(Element n) { nachfolger = n; }
public Element gibNachfolger() { return nachfolger; }
public Object gibWert() { return wert; }
}
PKJ 2005/7Stefan Dissmann
Allgemeine Liste
public class Liste { private Element anfang, ende; public Liste() { anfang = ende = null; }; public Liste(Object w) { anfang = ende = new Element(w); }
public Object gibErstes() { if (anfang != null) return anfang.gibWert(); else return null; } public boolean leer() { return anfang == null; } public void zeigeAlle() { Element lauf = anfang; while(lauf != null) { System.out.print(lauf.gibWert().toString() + " "); lauf = lauf.gibNachfolger(); } System.out.println(); }
PKJ 2005/8Stefan Dissmann
Allgemeine Liste
Probleme bereiten: public int zähleWert(Object w) { … }
public void sortiereEin(Object w) { … }
public void lösche(Object w) { … }
PKJ 2005/9Stefan Dissmann
Allgemeine Liste
Probleme bereiten: public int zähleWert(Object w) { … }
public void sortiereEin(Object w) { … }
public void lösche(Object w) { … }
Diese Methoden benötigen einen Vergleich der abgelegten Objekte:
• Gleichheit bei zähleWert und lösche• Größenvergleich bei sortiereEin
PKJ 2005/10Stefan Dissmann
Allgemeine Liste
Probleme bereiten: public int zähleWert(Object w) { … }
public void sortiereEin(Object w) { … }
public void lösche(Object w) { … }
Diese Methoden benötigen einen Vergleich der abgelegten Objekte:
• Gleichheit bei zähleWert und lösche• Größenvergleich bei sortiereEin
Klasse Object besitzt unbrauchbares equalsund keinen Größenvergleich!
PKJ 2005/11Stefan Dissmann
Allgemeine Liste
Lösung:
Einführung einer Klasse Vergleichbarmit der Methode boolean groesser(Vergleichbar v)
PKJ 2005/12Stefan Dissmann
Allgemeine Liste
Lösung:
Einführung einer Klasse Vergleichbarmit der Methode boolean groesser(Vergleichbar v)
und Ersetzen von Object in Liste und Element durchVergleichbar
PKJ 2005/13Stefan Dissmann
Allgemeine Elemente
public class Element {
private Vergleichbar wert;
private Element nachfolger;
public Element(Vergleichbar w) {
wert = w; nachfolger = null;
}
public void verkette(Element n) { nachfolger = n; }
public Element gibNachfolger() { return nachfolger; }
public Vergleichbar gibWert() { return wert; }
}
PKJ 2005/14Stefan Dissmann
Allgemeine Liste
public class Liste { private Element anfang, ende; public Liste() { anfang = ende = null; }; public Liste(Vergleichbar w){anfang=ende=new Element(w);} public Vergleichbar gibErstes() { if (anfang != null) return anfang.gibWert(); else return null; } public boolean leer() { return anfang == null; } public void zeigeAlle() { Element lauf = anfang; while(lauf != null) { System.out.print(lauf.gibWert().toString() + " "); lauf = lauf.gibNachfolger(); } System.out.println(); }
PKJ 2005/15Stefan Dissmann
Klassenhierarchie
Vergleichbar
???
Object
PKJ 2005/16Stefan Dissmann
Klasse Vergleichbar
public class Vergleichbar {
public boolean groesser (Vergleichbar v) {
???
}
}
PKJ 2005/17Stefan Dissmann
Klasse Vergleichbar
public class Vergleichbar {
public boolean groesser (Vergleichbar v) {
return true;
}
}
Unsinnig, muss von Unterklassen überschrieben werden!
PKJ 2005/18Stefan Dissmann
Klasse Vergleichbar
abstract public class Vergleichbar {
abstract public boolean groesser (Vergleichbar v);
}
PKJ 2005/19Stefan Dissmann
Klasse Vergleichbar
abstract public class Vergleichbar {
abstract public boolean groesser (Vergleichbar v);
}
groesser ist jetzt abstrakte Methode= Signatur ohne Methodenrumpf
PKJ 2005/20Stefan Dissmann
Klasse Vergleichbar
abstract public class Vergleichbar {
abstract public boolean groesser (Vergleichbar v);
}
groesser ist jetzt abstrakte Methode= Signatur ohne Methodenrumpf
groesser kann nicht ausgeführt werden
PKJ 2005/21Stefan Dissmann
Klasse Vergleichbar
abstract public class Vergleichbar {
abstract public boolean groesser (Vergleichbar v);
}
groesser ist jetzt abstrakte Methode= Signatur ohne Methodenrumpf
groesser kann nicht ausgeführt werden Vergleichbar kann nicht sinnvoll erzeugt werden
PKJ 2005/22Stefan Dissmann
Klasse Vergleichbar
abstract public class Vergleichbar {
abstract public boolean groesser (Vergleichbar v);
}
groesser ist jetzt abstrakte Methode= Signatur ohne Methodenrumpf
groesser kann nicht ausgeführt werden Vergleichbar kann nicht sinnvoll erzeugt werden Vergleichbar ist abstrakte Klasse
PKJ 2005/23Stefan Dissmann
Klasse Vergleichbar
abstract public class Vergleichbar {
abstract public boolean groesser (Vergleichbar v);
}
groesser ist jetzt abstrakte Methode= Signatur ohne Methodenrumpf
groesser kann nicht ausgeführt werden Vergleichbar kann nicht sinnvoll erzeugt werden Vergleichbar ist abstrakte Klasse Erzeugbare Unterklassen von Vergleichbar müssen
groesser implementieren!
PKJ 2005/24Stefan Dissmann
Klassenhierarchie
<<abstract>>
Vergleichbar
???
Object
PKJ 2005/25Stefan Dissmann
Klasse VergleichbarMitEquals
abstract public class VergleichbarMitEquals {
abstract public boolean groesser (Vergleichbar v);
public boolean equals (Object o) {
return !groesser((Vergleichbar)o) &&
!((Vergleichbar)o).groesser(this);
}
}
Nur wenn totale Ordnung vorliegt!
PKJ 2005/26Stefan Dissmann
Abstrakte Methoden
Zusammenfassung:
Abstrakte Methoden• definieren nur die Signatur einer Methode• besitzen keinen Methodenrumpf• sind nicht ausführbar• erzwingen eine abstrakte Klasse• müssen in Unterklassen implementiert werden• können zum Formulieren von Algorithmen eingesetzt
werden
PKJ 2005/27Stefan Dissmann
Abstrakte Klassen
Zusammenfassung:
Abstrakte Klassen• werden durch nur eine abstrakte Methode erzwungen• können keine Objekte erzeugen• müssen von (konkreten) Unterklassen implementiert
werden
• müssen nicht unbedingt abstrakte Methoden besitzenbekanntes Beispiel: Klasse Konto
PKJ 2005/28Stefan Dissmann
Abstrakte Klassen
Sonderfall:
Klassen, • die nur abstrakte Methoden enthalten• dienen nur der Definition einer Benutzungsschnittstelle• enthalten keine Realisierung• Beispiel: class Vergleichbar
In JAVA eigenes Konstrukt:interface
PKJ 2005/29Stefan Dissmann
Interface Vergleichbar
public interface Vergleichbar {
boolean groesser (Vergleichbar v);
}
PKJ 2005/30Stefan Dissmann
Interface Vergleichbar
public interface Vergleichbar {
boolean groesser (Vergleichbar v);
}
• Schlüsselwort interface
PKJ 2005/31Stefan Dissmann
Interface Vergleichbar
public interface Vergleichbar {
boolean groesser (Vergleichbar v);
}
• Schlüsselwort interface• kein abstract angegeben, trotzdem abstrakt• keine Zugriffsrechte angegeben, trotzdem öffentlich
PKJ 2005/32Stefan Dissmann
Interface Vergleichbar
public interface Vergleichbar {
boolean groesser(Vergleichbar v);
}
Interface • kann wie eine Klasse
zur Typisierung von Referenzen eingesetzt werden• kann geerbt werden von anderen Interfaces• kann durch Klassen implementiert werden
PKJ 2005/33Stefan Dissmann
Interface - Vererbung
public interface Vergleichbar {
boolean groesser(Vergleichbar v);
}
public interface BesserVergleichbar
extends Vergleichbar {
boolean kleiner(Vergleichbar v);
}
PKJ 2005/34Stefan Dissmann
Interface - Vererbung
public interface Vergleichbar {
boolean groesser(Vergleichbar v);
}
public interface BesserVergleichbar
extends Vergleichbar {
boolean kleiner(Vergleichbar v);
}
• Schlüsselwort extends wie bei Klassen
PKJ 2005/35Stefan Dissmann
Interface-hierarchie
<<interface>>
BesserVergleichbar
<<interface>>
Vergleichbar
PKJ 2005/36Stefan Dissmann
Interface - Implementierung
public interface Vergleichbar {
boolean groesser(Vergleichbar v);
}
public class Element implements Vergleichbar {
…
public boolean groesser(Vergleichbar v) { … }
…
}
PKJ 2005/37Stefan Dissmann
Interface - Implementierung
public interface Vergleichbar {
boolean groesser(Vergleichbar v);
}
public class Element implements Vergleichbar {
…
public boolean groesser(Vergleichbar v) { … }
…
}• Schlüsselwort implements• erzwingt Implementierung von groesser oder• abstrakte Klasse
PKJ 2005/38Stefan Dissmann
Klassen-Interface-hierarchie
Element
Object <<interface>>
Vergleichbar
PKJ 2005/39Stefan Dissmann
Interfaces
Anmerkungen:
• Klasse kann von Klasse erben undzugleich Interface implementierenBsp.: class Studierende extends Element implements BesserVergleichbar …
• Klasse besitzt höchstens eine Oberklasse, aber• Klasse kann mehrere Interfaces implementieren und• Interface kann mehrere Interfaces erben
PKJ 2005/40Stefan Dissmann
Klassen-Interface-hierarchie
<<abstract>>
A
<<interface>>
W
K
<<interface>>
V
<<interface>>
X
<<interface>>
Y
<<interface>>
Z
PKJ 2005/41Stefan Dissmann
<<abstract>>
A
<<interface>>
W
K
<<interface>>
V
<<interface>>
X
<<interface>>
Y
<<interface>>
Z
Klassen-Interface-hierarchie
Vereinbarungen:
abstract public class A implements V, W {…
public interface Z extends Y {…
public class K extends A implements X,Z {…
PKJ 2005/42Stefan Dissmann
<<abstract>>
A
<<interface>>
W
K
<<interface>>
V
<<interface>>
X
<<interface>>
Y
<<interface>>
Z
Klassen-Interface-hierarchie
Mögliche Zuweisungen:
V ref1 = new K();
W ref2 = new K();
X ref3 = new K();
Y ref4 = new K();
Z ref5 = new K();
A ref6 = new K();
K ref7 = new K();
Object ref8 = new K();
PKJ 2005/43Stefan Dissmann
Klasse - Interface
Warum ist mehrfaches Erben/Implementieren bei Interfaces erlaubt
- und nicht bei Klassen?
PKJ 2005/44Stefan 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
PKJ 2005/45Stefan 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()??
PKJ 2005/46Stefan 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
PKJ 2005/47Stefan 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!
PKJ 2005/48Stefan 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
PKJ 2005/49Stefan 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
PKJ 2005/50Stefan 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
Operator
PKJ 2005/51Stefan 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
Anwendung aber häufig schlechter Stil
?