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

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

Embed Size (px)

Citation preview

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

PKJ 2005/1Stefan Dissmann

Klassenhierarchie

Person

Kunde

Goldkunde

Lieferant

Object

Page 2: PKJ 2005/1 Stefan 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. 

Page 3: PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant 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

Page 4: PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant 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; }

}

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

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

}

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

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

}

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

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

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

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

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

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

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

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!

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

PKJ 2005/11Stefan Dissmann

Allgemeine Liste

Lösung:

Einführung einer Klasse Vergleichbarmit der Methode boolean groesser(Vergleichbar v)

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

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

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

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

}

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

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

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

PKJ 2005/15Stefan Dissmann

Klassenhierarchie

Vergleichbar

???

Object

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

PKJ 2005/16Stefan Dissmann

Klasse Vergleichbar

public class Vergleichbar {

public boolean groesser (Vergleichbar v) {

???

}

}

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

PKJ 2005/17Stefan Dissmann

Klasse Vergleichbar

public class Vergleichbar {

public boolean groesser (Vergleichbar v) {

return true;

}

}

Unsinnig, muss von Unterklassen überschrieben werden!

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

PKJ 2005/18Stefan Dissmann

Klasse Vergleichbar

abstract public class Vergleichbar {

abstract public boolean groesser (Vergleichbar v);

}

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

PKJ 2005/19Stefan Dissmann

Klasse Vergleichbar

abstract public class Vergleichbar {

abstract public boolean groesser (Vergleichbar v);

}

groesser ist jetzt abstrakte Methode= Signatur ohne Methodenrumpf

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

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

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

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

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

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

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

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!

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

PKJ 2005/24Stefan Dissmann

Klassenhierarchie

<<abstract>>

Vergleichbar

???

Object

Page 25: PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant 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!

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

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

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

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

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

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

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

PKJ 2005/29Stefan Dissmann

Interface Vergleichbar

public interface Vergleichbar {

boolean groesser (Vergleichbar v);

}

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

PKJ 2005/30Stefan Dissmann

Interface Vergleichbar

public interface Vergleichbar {

boolean groesser (Vergleichbar v);

}

• Schlüsselwort interface

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

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

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

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

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

PKJ 2005/33Stefan Dissmann

Interface - Vererbung

public interface Vergleichbar {

boolean groesser(Vergleichbar v);

}

public interface BesserVergleichbar

extends Vergleichbar {

boolean kleiner(Vergleichbar v);

}

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

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

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

PKJ 2005/35Stefan Dissmann

Interface-hierarchie

<<interface>>

BesserVergleichbar

<<interface>>

Vergleichbar

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

PKJ 2005/36Stefan Dissmann

Interface - Implementierung

public interface Vergleichbar {

boolean groesser(Vergleichbar v);

}

public class Element implements Vergleichbar {

public boolean groesser(Vergleichbar v) { … }

}

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

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

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

PKJ 2005/38Stefan Dissmann

Klassen-Interface-hierarchie

Element

Object <<interface>>

Vergleichbar

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

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

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

PKJ 2005/40Stefan Dissmann

Klassen-Interface-hierarchie

<<abstract>>

A

<<interface>>

W

K

<<interface>>

V

<<interface>>

X

<<interface>>

Y

<<interface>>

Z

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

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

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

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

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

PKJ 2005/43Stefan Dissmann

Klasse - Interface

Warum ist mehrfaches Erben/Implementieren bei Interfaces erlaubt

- und nicht bei Klassen?

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

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

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

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

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

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

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

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!

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

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

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

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

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

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

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

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

?