PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object
PKJ 2005/2 Stefan 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 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/3 Stefan Dissmann Erinnerung Ziel war: Liste, in der beliebige Objekte abgelegt werden können Lösung mit Object klar: Elemente enthalten Referenzen auf Object Methoden der Liste arbeiten auf Object
PKJ 2005/4 Stefan 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/5 Stefan 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/6 Stefan 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/7 Stefan 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/8 Stefan Dissmann Allgemeine Liste Probleme bereiten: public int zähleWert(Object w) { … } public void sortiereEin(Object w) { … } public void lösche(Object w) { … }
PKJ 2005/9 Stefan 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/10 Stefan 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 equals und keinen Größenvergleich!
PKJ 2005/11 Stefan Dissmann Allgemeine Liste Lösung: Einführung einer Klasse Vergleichbar mit der Methode boolean groesser(Vergleichbar v)
PKJ 2005/12 Stefan Dissmann Allgemeine Liste Lösung: Einführung einer Klasse Vergleichbar mit der Methode boolean groesser(Vergleichbar v) und Ersetzen von Object in Liste und Element durch Vergleichbar
PKJ 2005/13 Stefan 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/14 Stefan 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/15 Stefan Dissmann Klassenhierarchie Vergleichbar ??? Object
PKJ 2005/16 Stefan Dissmann Klasse Vergleichbar public class Vergleichbar { public boolean groesser (Vergleichbar v) { ??? }
PKJ 2005/17 Stefan Dissmann Klasse Vergleichbar public class Vergleichbar { public boolean groesser (Vergleichbar v) { return true; } Unsinnig, muss von Unterklassen überschrieben werden!
PKJ 2005/18 Stefan Dissmann Klasse Vergleichbar abstract public class Vergleichbar { abstract public boolean groesser (Vergleichbar v); }
PKJ 2005/19 Stefan Dissmann Klasse Vergleichbar abstract public class Vergleichbar { abstract public boolean groesser (Vergleichbar v); } groesser ist jetzt abstrakte Methode = Signatur ohne Methodenrumpf
PKJ 2005/20 Stefan 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/21 Stefan 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/22 Stefan 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/23 Stefan 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/24 Stefan Dissmann Klassenhierarchie > Vergleichbar ??? Object
PKJ 2005/25 Stefan 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/26 Stefan 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/27 Stefan 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 besitzen bekanntes Beispiel: Klasse Konto
PKJ 2005/28 Stefan 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/29 Stefan Dissmann Interface Vergleichbar public interface Vergleichbar { boolean groesser (Vergleichbar v); }
PKJ 2005/30 Stefan Dissmann Interface Vergleichbar public interface Vergleichbar { boolean groesser (Vergleichbar v); } Schlüsselwort interface
PKJ 2005/31 Stefan 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/32 Stefan 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/33 Stefan Dissmann Interface - Vererbung public interface Vergleichbar { boolean groesser(Vergleichbar v); } public interface BesserVergleichbar extends Vergleichbar { boolean kleiner(Vergleichbar v); }
PKJ 2005/34 Stefan 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/35 Stefan Dissmann Interface-hierarchie > BesserVergleichbar > Vergleichbar
PKJ 2005/36 Stefan Dissmann Interface - Implementierung public interface Vergleichbar { boolean groesser(Vergleichbar v); } public class Element implements Vergleichbar { … public boolean groesser(Vergleichbar v) { … } … }
PKJ 2005/37 Stefan 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/38 Stefan Dissmann Klassen-Interface-hierarchie Element Object > Vergleichbar
PKJ 2005/39 Stefan Dissmann Interfaces Anmerkungen: Klasse kann von Klasse erben und zugleich Interface implementieren Bsp.: 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/40 Stefan Dissmann Klassen-Interface-hierarchie > A > W K > V > X > Y > Z
PKJ 2005/41 Stefan Dissmann > A > W K > V > X > Y > 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/42 Stefan Dissmann > A > W K > V > X > Y > 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/43 Stefan Dissmann Klasse - Interface Warum ist mehrfaches Erben/Implementieren bei Interfaces erlaubt - und nicht bei Klassen?
PKJ 2005/44 Stefan 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 AB C
PKJ 2005/45 Stefan 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 AB C toString() toString() ??
PKJ 2005/46 Stefan 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/47 Stefan 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/48 Stefan 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/49 Stefan 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/50 Stefan 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/51 Stefan 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 ?