Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
Veröffentlicht von:Kilian Hennen Geändert vor über 10 Jahren
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 ?
Ähnliche Präsentationen
© 2024 SlidePlayer.org Inc.
All rights reserved.