Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.

Ähnliche Präsentationen


Präsentation zum Thema: "PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object."—  Präsentation transkript:

1 PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object

2 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.

3 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

4 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; } }

5 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; } }

6 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; } }

7 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(); }

8 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) { … }

9 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

10 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!

11 PKJ 2005/11 Stefan Dissmann Allgemeine Liste Lösung: Einführung einer Klasse Vergleichbar mit der Methode boolean groesser(Vergleichbar v)

12 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

13 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; } }

14 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(); }

15 PKJ 2005/15 Stefan Dissmann Klassenhierarchie Vergleichbar ??? Object

16 PKJ 2005/16 Stefan Dissmann Klasse Vergleichbar public class Vergleichbar { public boolean groesser (Vergleichbar v) { ??? }

17 PKJ 2005/17 Stefan Dissmann Klasse Vergleichbar public class Vergleichbar { public boolean groesser (Vergleichbar v) { return true; } Unsinnig, muss von Unterklassen überschrieben werden!

18 PKJ 2005/18 Stefan Dissmann Klasse Vergleichbar abstract public class Vergleichbar { abstract public boolean groesser (Vergleichbar v); }

19 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

20 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

21 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

22 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

23 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!

24 PKJ 2005/24 Stefan Dissmann Klassenhierarchie > Vergleichbar ??? Object

25 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!

26 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

27 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

28 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

29 PKJ 2005/29 Stefan Dissmann Interface Vergleichbar public interface Vergleichbar { boolean groesser (Vergleichbar v); }

30 PKJ 2005/30 Stefan Dissmann Interface Vergleichbar public interface Vergleichbar { boolean groesser (Vergleichbar v); } Schlüsselwort interface

31 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

32 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

33 PKJ 2005/33 Stefan Dissmann Interface - Vererbung public interface Vergleichbar { boolean groesser(Vergleichbar v); } public interface BesserVergleichbar extends Vergleichbar { boolean kleiner(Vergleichbar v); }

34 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

35 PKJ 2005/35 Stefan Dissmann Interface-hierarchie > BesserVergleichbar > Vergleichbar

36 PKJ 2005/36 Stefan Dissmann Interface - Implementierung public interface Vergleichbar { boolean groesser(Vergleichbar v); } public class Element implements Vergleichbar { … public boolean groesser(Vergleichbar v) { … } … }

37 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

38 PKJ 2005/38 Stefan Dissmann Klassen-Interface-hierarchie Element Object > Vergleichbar

39 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

40 PKJ 2005/40 Stefan Dissmann Klassen-Interface-hierarchie > A > W K > V > X > Y > Z

41 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 {…

42 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();

43 PKJ 2005/43 Stefan Dissmann Klasse - Interface Warum ist mehrfaches Erben/Implementieren bei Interfaces erlaubt - und nicht bei Klassen?

44 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

45 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() ??

46 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

47 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!

48 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

49 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

50 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

51 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 ?


Herunterladen ppt "PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object."

Ähnliche Präsentationen


Google-Anzeigen