kapitel 3 implementierung kapitel 3. implementierung ... · bei eintritt in den block wird...
TRANSCRIPT
Vorlesung „Objektorientierte Softwareentwicklung“Sommersemester 2010So e se este 0 0
Kapitel 3 Implementierung Kapitel 3. Implementierung objektorientierter Sprachen
MotivationSpeicherbereiche
Umsetzung von KlassendeklarationengObjekterzeugung
Nachrichten und dynamisches Binden
ProzedurausführungProzedurausführung
Motivation
Basiskonzepte besser verstehen! Dadurch besser verstehen warum bestimmte Dadurch besser verstehen, warum bestimmte
Programmiertechniken wichtig sind!
Th Themen Was „statisch“ und „dynamisch“ praktisch bedeutet „Dynamisches Binden“ ist keine Magie und auch nicht
ineffizient! Warum man Objekte erzeugen, aber nicht „zerstören“
kann Warum man Variablen, die auf nicht mehr benötigte
Objekte zeigen null zuweisen sollte!
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-2
Warum Objekterzeugung teuer ist!
Speicherbereiche
Statischer Bereich für Klassen und Interfaces Speicher für Klassenvariablen – daher static Speicher für Klassenvariablen daher static Code von Klassenmethoden C d I t th d Code von Instanzmethoden Sprungtabelle zu Instanzmethoden (für dyn. binding)
Dynamischer Bereich für Objeke (Halde / heap) Heap-Verwaltung incl. “Garbage Collection“p g g Dynamisches Binden von Nachrichten
Dynamischer Bereich für Aufrufe (Stapel / stack) Dynamischer Bereich für Aufrufe (Stapel / stack) Stackframes für Aufrufparameter
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-3
Stackverwaltung
Verwaltung von Objekten im Speicher
Der Stapelspeicher wird gemäß der Bl k k d P i hBlockstruktur des Programms automatisch verwaltet Jeder Aufruf hat ein „Stackframe“ Stackframe = Speicher für alle Aufrufparameter
In Java liegen Objekte grundsätzlich auf dem Haldenspeicher (Heap) Sie sind über Referenzvariablen zugänglich, die auf
dem Stapel liegen und deren Referenzen auf die Halde zeigenHalde zeigen
Das Java-Laufzeitsystem organisiert die Halde mittels einer automatischen Speicherverwaltung
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-5
mittels einer automatischen Speicherverwaltung
Verwaltung von Objekten im Speicher
Der Ausdruck new K(); reserviert den S i h l t fü i Obj kt d KlSpeicherplatz für ein Objekt der Klasse K Außerdem wird das Objekt initialisiert
Der Ausdruck new K() liefert eine Referenz auf das neue geschaffene Objekt
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-6
Verwaltung von Objekten im Speicher: BeispielBeispiel Beispiel: Wir betrachten
die Speicherbilder beim Stack: Heap:die Speicherbilder beim Ausführen folgender Codesequenz: irgendwas
Stack: p
q
{
noch was
Time t;t = new Time();
}}
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-7
Verwaltung von Objekten im Speicher: BeispielBeispiel Beispiel: Wir betrachten
die Speicherbilder beim Stack: Heap:die Speicherbilder beim Ausführen folgender Codesequenz: irgendwas
Stack: p
q
{
noch was
t = nullTime t;t = new Time();
}}
Bei Eintritt in den Block wird zunächst Platz für die lokalen Variablen (hier: Time t) auf dem Stack geschaffen und mit Null vorinitialisiertdem Stack geschaffen und mit Null vorinitialisiert
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-8
Verwaltung von Objekten im Speicher: BeispielBeispiel
Beispiel: Wir Stack: Heap:
::Time0
betrachten die Speicherbilder beim Ausführen folgender
irgendwas
Stack: p
sec = 0min = 0hrs = 0
Ausführen folgender Codesequenz:{
noch was
t = null{ hrs 0Time t;t = new Time();
}
Time t;t = new Time();
}}
Danach legt new ein neues Objekt vom Typ Time mit auf default-Werte vorinitialisierten Membervariablen auf dem Heap an
}
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-9
Verwaltung von Objekten im Speicher: BeispielBeispiel
Beispiel: Wir Stack: Heap:
::Time0
betrachten die Speicherbilder beim Ausführen folgender
irgendwas
Stack: p
sec = 0min = 0hrs = 0
Ausführen folgender Codesequenz:{
noch was
t{ hrs 0Time t;t = new Time();
}
Time t;t = new Time();
}}
Als nächstes bekommt die Variable t eine Referenz auf das neu erzeugte Objekt zugewiesen
}
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-10
Verwaltung von Objekten im Speicher: BeispielBeispiel Beispiel: Wir betrachten
die Speicherbilder beim Stack: Heap:die Speicherbilder beim Ausführen folgender Codesequenz: irgendwas
Stack: p
::Time0
q
{
noch was
{
sec = 0min = 0hrs = 0
Time t;t = new Time();
}
Time t;t = new Time();
}
hrs 0
}
Zum Abschluss wird der Block verlassen, wodurch die Referenz auf das Objekt verloren geht.D Obj k i b “
}
Das Objekt „stirbt“
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-11
Verwaltung von Objekten im Speicher: ErreichbarkeitErreichbarkeit
Objekte auf der Halde leben (unabhängig von der
Stack:(unabhängig von der Blockstruktur des Programms) so lange, wie sie über R f i bl i hb
...
i Obj k
M Obj
Referenzvariable erreichbar (reachable) sind
Ein Objekt ist indirekt
meinObjekt
Heap:::MyObjectwert=1234
next
Ein Objekt ist indirekt erreichbar, wenn es über eine Referenzvariable
::MyObjectwert=0 next
erreichbar ist, die als Feld in einem anderen erreichbaren Objekt
wert 0next
erreichbaren Objekt vorkommt– Das Objekt, das den Wert 0
enthält ist direkt erreichbar
::MyObjectwert=42next=null
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-12
enthält ist direkt erreichbar, die weiteren Objekte sind indirekt erreichbar
next=null
Verwaltung von Objekten im Speicher
Tote Objekte auf der Halde bezeichnet man als Abfall (garbage)
Um den Haldenspeicher wieder verwenden zu Um den Haldenspeicher wieder verwenden zu können, kennt das Java-Laufzeitsystem eine automatische Speicherbereinigung oderautomatische Speicherbereinigung oder „Abfallsammlung“ (garbage collection) Die es z B anstößt wenn der Haldenspeicher zur Die es z.B. anstößt, wenn der Haldenspeicher zur
Neige geht
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-13
C++: Explizite Verwaltung von Objekten im Speicherim Speicher In C++ hingegen muss (bzw. darf) die
Speicherrückgabe explizit programmiert werdenSpeicherrückgabe explizit programmiert werden Der Programmierer muss für jede von ihm
entworfene Klasse eine spezielle Funktionentworfene Klasse eine spezielle Funktion schreiben, einen sogenannten Destruktor (destructor), in der die Rückgabe des Speichers ( ), g pvon einem nicht mehr benötigten Objekt beschrieben wird
f O f Dieser ruft i.A. einen Operator delete auf Dies ist in vielen Fällen effizienter als eine
automatische Speicherbereinigungautomatische Speicherbereinigung Ist aber für den Programmierer sehr viel
umständlicher und kann leicht zu Programmierfehlern
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-14
umständlicher und kann leicht zu Programmierfehlern führen
C++: Explizite Verwaltung von Objekten im Speicherim Speicher
Insbesondere können dabei in C++ (nicht in Java) folgende Programmierfehler vorkommen:
Immer mehr Speicher wird verbraucht„Speicherleck“ (memory
Speicher für ein Objekt wird irrtümlicherweise nicht zurückgegeben
leak)
nicht zurückgegeben, obwohl es tot ist
Speicher für ein Objekt i d fäl hli h i
Solche Fehler sind extrem boshaft da sie erst dannwird fälschlicherweise
zurückgegeben wird, obwohl es noch nicht totist
boshaft, da sie erst dann bemerkt werden, wenn der Speicherplatz erneut zugeteilt und überschriebenist zugeteilt und überschriebenwurde
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-15
Verwaltung von Objekten im Speicher: Garbage CollectionGarbage Collection Ein einfaches Prinzip der automatischen
Speicherbereinigung besteht aus zwei Phasen:Speicherbereinigung besteht aus zwei Phasen: markieren (mark) und (zusammen )kehren (sweep) (zusammen-)kehren (sweep)
In der Markierungsphase geht man von unten nach oben über den Stack und markiert rekursiv alle von denüber den Stack und markiert rekursiv alle von den Referenzvariablen aus erreichbaren Objekte auf dem Heap
In der Kehrphase kehrt man allen nicht markierten Speicher auf dem Heap in eine Freispeicherliste (freelist) zusammen und löscht die Markierungenlist) zusammen und löscht die Markierungen Man kann sogar die markierten Objekte in eine Ecke der Halde
kehren (verschieben), denn der Java-Programmierer bekommt
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-16
die tatsächlichen Werte der Referenzen nie zu Gesicht
Verwaltung von Objekten im Speicher: Garbage CollectionGarbage Collection Es gibt noch andere Prinzipien der Speicherbereinigung
E i t i J i ht f t h i b l h b t t d Es ist in Java nicht festgeschrieben, welche benutzt werden Mit komplizierteren Methoden kann z. B. erreicht werden,
dass Objekte, die oftmals in kurzen Abständendass Objekte, die oftmals in kurzen Abständen hintereinander benutzt werden (z. B. in einer Schleife), nach einer Speicherbereinigung in benachbarte Stellen im Speicher zu liegen kommenSpeicher zu liegen kommen Alle modernen Prozessoren sind mit einem Cache-Speicher
(cache memory) ausgestattet, auf den sehr viel schneller als auf den Hauptspeicher zugegriffen werden kannden Hauptspeicher zugegriffen werden kann– Dieser hat eine beschränkte Größe, es können aber
zusammenhängende Stücke vom Hauptspeicher sehr schnell zu ihm transferiert werden
– Somit kann evtl. die Ablaufgeschwindigkeit eines Programms erheblich gesteigert werden, wenn bei der Speicherbereinigung verkettete Objekte in benachbarte Bereiche im Heap gelegt werden
Weiteres mögliches Problem beim Garbage Collection:
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-17
Weiteres mögliches Problem beim Garbage Collection: Echtzeitanwendungen
Dynamisches Binden bei „überladenen“ und
„überschriebenen“ Methoden
Folgende Beispielszenarien:
1. Gleiche Nachrichtensignatur / Empfängerobjekte verschiedener Klassen
2. Verschiedene Nachrichtensignaturen / Gleiches Empfängerobjekt
Umsetzen von dynamischem Binden Folgendes Szenario setzen wir auf den nächsten Folien um Es geht Folgendes Szenario setzen wir auf den nächsten Folien um. Es geht
immer um die Umsetzung des Aufrufs von „berechneKosten()“:
Mi b i XYZMitarbeiter
l di A ft ()
...
XYZ
doSth()
...
erledigeAuftrag()berechneKosten()
berechneKosten()
doSth()UML
m:MitarbeiterberechneKosten()
:XYZ
class Mitarbeiter {erledigeAuftrag() {...}berechneKosten(){...}
class XYZ {doSth() {
Mitarbeiter m; (){ }}
;...; m.berechneKosten();
}
Java
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-19
}
Überblick
Zuerst: Allgemeine Grundlagen Dynamisches Binden in rein objektbasierten (d.h.
nicht klassenbasierten) und nicht streng getypten Sprachen
Objekte mit Methodentabellenverweisen
Anschliessend: Java, C++, Eiffel, und Co Anpassung an klassenbasierte strang typisierte Anpassung an klassenbasierte, strang typisierte
Sprachen
Abschluss: Anwendung in versch Szenarien Abschluss: Anwendung in versch. Szenarien Überladen versus Überschreiben
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-20
Zusammenspiel mit Vererbung
Methodentabellen (rein objektbasiert) Szenario (Ursprünglicher Code in fiktiver Objektsprache): Szenario (Ursprünglicher Code in fiktiver Objektsprache):
object Mitarbeiter = {erledigeAuftrag() {...}b h K t (){ }
object XYZ {doSth(m) {
b h K t ()berechneKosten(){...}}
m.berechneKosten(); }
}
Umsetzung der Objektdefinitionen Jedes Objekt verweist auf seine Methodentabelle! Jeder Eintrag in einer Methodentabelle verweist auf den übersetzten Code
einer Methode!
vtable ( = virtual method table)
Speicherbereich des erledigeAuftrag
Mitarbeiter::erledigeAuftrag()Speicherbereich für
V i bl
Speicherbereich des referenzierten Objektes
Übersetzte
... berechneKosten
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-21
Mitarbeiter::erledigeAuftrag()Mitarbeiter::berechneKosten()
Variable m (enthält eine ObjektID)
Übersetzte Methoden
Nachrichten (rein objektbasiert) Szenario (Ursprünglicher Code in fiktiver Objektsprache): Szenario (Ursprünglicher Code in fiktiver Objektsprache):
object Mitarbeiter = {erledigeAuftrag() {...}b h K t (){ }
object XYZ {doSth(m) {
b h K t ()berechneKosten(){...}}
m.berechneKosten(); }
}
Umsetzung von Nachrichten Jede Nachricht wird durch ein Stück Code ersetzt, das anhand der
Methodentabelle des Empfänger Objektes den auszuführendenMethodentabelle des Empfänger-Objektes den auszuführenden Methodencode bestimmt.
m.berechneKosten(..) m.vtable.getValue(berechneKosten)(..);
vtable ( = virtual method table)
Speicherbereich des erledigeAuftrag
Mitarbeiter::erledigeAuftrag()Speicherbereich für
V i bl
Speicherbereich des referenzierten Objektes
Übersetzte
... berechneKosten
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-22
Mitarbeiter::erledigeAuftrag()Mitarbeiter::berechneKosten()
Variable m (enthält eine ObjektID)
Übersetzte Methoden
Prozeduraufrufe versus Nachrichten
object.berechneKosten(...);
C, Pascal & Co C++, Java & Co
berechneKosten(obj,param1, ..., paramN);;
... // Parameterübergabe ... // Parameterübergabe jump addresseXXXXX; addresse =
object.vTable.getValue(berechneKosten);jump addresse;
addresseXXXXX: ... // Code von „berechneKosten“return;
addresseXXXXX: ... // Code von „berechneKosten“return;
Nachricht ≠ Prozeduraufruf
return; ;
Die Adresse des auszuführenden Codes ist an der Aufrufstelle nicht bekannt!
Auch in verteilten Umgebungen einsetzbar!
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-23
Eine Nachricht Verschiedene Effekte, je nach Empfänger!
Methodentabellen (Klassenbasiert, streng typisiert)
Besonderheiten klassenbasierter Sprachen Klasse definiert gemeinsame Methoden für alle Instanzen
– Klasse hat Methodentabelle die für alle Instanzen gilt – Objekte verweisen auf ihre Klasse und diese verweist auf die
Methodentabelle Menge der Methoden und Felder einer Klasse ändern sich nicht zur Menge der Methoden und Felder einer Klasse ändern sich nicht zur
Laufzeit– Methodennamen als explizite Schlüssel für jede Referenz auf
Methodencode sind nicht mehr erforderlich– Stattdessen kann der Compiler jeder Methode einen festen Index in
der Methodentabelle einer bestimmten Klasse vergeben– Beispiel: indexOf(Mitarbeiter, berechneKosten) = 2
Ref. auf Code von erledigeAuftrag()Ref auf Code von berechneKosten()
12
...vtable ( = virtual method table)
classSpeicherbereich der
Speicherbereich der Klasse „Mitarbeiter“
Ref. auf Code von berechneKosten()2
Mitarbeiter::erledigeAuftrag()
...
Speicherbereich für Variable m
referenzierten Instanz von „Mitarbeiter“
Übersetzte Methoden
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-24
Mitarbeiter::berechneKosten()(enthält eine ObjektID) Methoden
Methodentabellen (Klassenbasiert, streng typisiert)
S i (U ü li h J C d ) Szenario (Ursprünglicher Java-Code):class Mitarbeiter {
erledigeAuftrag() {...}berechneKosten(){ }
class XYZ {doSth() {
Mitarbeiter m;berechneKosten(){...}}
Mitarbeiter m; ...; m.berechneKosten(); } }
Schema der Umsetzung der Klassendefinitionen Jedes Objekt verweist auf seine Klasse! Jede Klasse verweist auf ihre Methodentabelle! Jede Klasse verweist auf ihre Methodentabelle! Jeder Eintrag in der Methodentabelle verweist auf den übersetzten Code
einer Methode!
Ref. auf Code von erledigeAuftrag()Ref auf Code von berechneKosten()
12
...vtable ( = virtual method table)
classSpeicherbereich der
Speicherbereich der Klasse „Mitarbeiter“
Ref. auf Code von berechneKosten()2
Mitarbeiter::erledigeAuftrag()
...
Speicherbereich für Variable m
referenzierten Instanz von „Mitarbeiter“
Übersetzte Methoden
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-25
Mitarbeiter::berechneKosten()(enthält eine ObjektID) Methoden
Nachrichten (Klassenbasiert, streng typisiert)
Szenario (Ursprünglicher Java Code): Szenario (Ursprünglicher Java-Code):class Mitarbeiter {
erledigeAuftrag() {...}berechneKosten(){ }
class XYZ {doSth() {
Mitarbeiter m;berechneKosten(){...}}
Mitarbeiter m; ...; m.berechneKosten(); } }
Umsetzung von Nachrichten: Schema Umsetzung von Nachrichten: Schema obj.msg(..) obj.class.vtable[indexOf(obj.class,msg)] (..); Dank statischer Indexermittlung zu jeder Methode kann für indexOf(....) schon beim
Compilieren eine feste Konstante eingesetzt werden
Umsetzung von Nachrichten: Beispiel m.berechneKosten(..) m.class.vtable[2](..);
Ref. auf Code von erledigeAuftrag()Ref auf Code von berechneKosten()
12
...vtable ( = virtual method table)
classSpeicherbereich der
Speicherbereich der Klasse „Mitarbeiter“
Ref. auf Code von berechneKosten()2
Mitarbeiter::erledigeAuftrag()
...
Speicherbereich für Variable m
referenzierten Instanz von „Mitarbeiter“
Übersetzte Methoden
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-26
Mitarbeiter::berechneKosten()(enthält eine ObjektID) Methoden
Dynamisches Binden: Effizienz
Der Zugriff obj.class.vtable[index](..) reduziert die Kosten von dynamischem Binden aufvon dynamischem Binden auf 2 lesende Speicherzugriffe (obj.class.vtable[index]) und ... 1 Sprung an die in der Methodentabelle gefundene Adresse 1 Sprung an die in der Methodentabelle gefundene Adresse Davon ist der Sprung an eine nicht vorhersehbare Adresse am teuersten!
– Er bedeutet, dass die in der Anweisungspipeline des Prozessors schon im voraus geladenen Instruktionen nicht wirklich die sind, die man als nächstes braucht. Statt sofort weiterarbeiten zu können muss der Prozessor erst mal warten bis die von der Sprungadresse geholten Instruktionen bei ihm eintreffenProzessor erst mal warten, bis die von der Sprungadresse geholten Instruktionen bei ihm eintreffen.
Auch dafür gibt es weitere Optimierungen die aber den Rahmen der Vorlesung sprengen Inlining Polymorphic inline caches (Urs Hölze) Just in time“ Compilierung (Urs Hölzle) „Just-in-time Compilierung (Urs Hölzle) Dynamische „HotSpot“ Recompilierung (Urs Hölzle) http://www.cs.ucsb.edu/~urs/oocsb/papers.shtml
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-27
Dynamic Binding und Overriding
class Super {
void m(String s) {...}class Client { ( g ) { }}Super obj;
obj = new Super(...);obj.m("bla");
overridingobj = new Sub(...);obj.m("bla");
}
obj.class.vtable[2]("bla");
class Sub extends Super {void m(String s) {...}
}
Gleiche Signatur gleicher Methodentabellen-Index
Methodentabelle der Unterklasse verweist auf der gleichen Indexposition auf die eigene Methode
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-28
gleichen Indexposition auf die eigene Methode
Dynamic Binding und Vererbung
class Super {
void m(String s) {...}class Client { ( g ) { }}Super obj;
obj = new Super(...);obj.m("bla");
geerbtobj = new Sub(...);obj.m("bla");
}
obj.class.vtable[2]("bla"); geerbt von
class Sub extends Super {void m(String s) {...}
}
Gleiche Signatur gleicher Methodentabellen-Index
Methodentabelle der Unterklasse verweist auf der gleichen Indexposition auf die geerbte Methode
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-29
gleichen Indexposition auf die geerbte Methode
Overriding versus Overloading: Szenario 1
class Super {void m(String s, int i) {...}void m(String s) {...}
Szenario 1
class Client { ( g ) { }}Super obj;
obj = new Super(...);obj.m("bla");
overridingobj = new Sub(...);obj.m("bla");
}
obj.class.vtable[2]("bla");
O idi
class Sub extends Super {void m(String s) {...}
}
Overriding Beziehung zwischen Methoden in Oberklasse und Unterklasse Gl i h Si t l i h O ti Gleiche Signatur gleiche Operation
– bekommen gleichen Methodentabellen-Index Die spezifischste Methode (= Implementierung der Operation) gilt!
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-30
p ( p g p ) g Methodentabelle der Unterklasse verweist auf Indexposition 2 auf die eigene Methode statt die
Überschriebene
Overriding versus Overloading: Szenario 1
class Super {void m(String s, int i) {...}void m(String s) {...}
Szenario 1
class Client { ( g ) { }}Super obj;
obj = new Super(...);obj.m("bla");
overridingobj = new Sub(...);obj.m("bla");
}
obj.class.vtable[2]("bla");
Unter der Lupeclass Sub extends Super {
void m(String s) {...}}
Der Empfänger „obj“ hat in beiden Nachrichten den statischen Typ „Super“ ... m(„bla“) hat die Aufrufsignatur m(String) ... die spezifischte Obersignatur von m(String) in Super ist m(String) ... der Index von m(String) ist 2 Also wird beide male der gleiche Code generiert:
obj.class.vtable[2]("bla");
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-31
Der dynamische Typ des Empfängers ist in der ersten Nachricht „Super“ und in der zweiten Nachricht „Sub“.
Overriding versus Overloading: Szenario 2
class Super {void m(String s, int i) {...}void m(String s) {...}
Szenario 2
class Client { ( g ) { }}Super obj;
obj = new Super(...);obj.m("bla", 10);
overloadingbj l t bl [2]("bl ")
obj.m("bla");} obj.class.vtable[1]("bla", 10);
obj.class.vtable[2]("bla");
O l di
class Sub extends Super {void m(String s) {...}
}
Overloading Beziehung zwischen Methoden innerhalb einer Klasse M th d h b l i h N b hi d Si t Si Methoden haben gleichen Namen aber verschiedene Signatur Sie
stellen verschiedene Operationen dar– sie bekommen verschiedene Methodentabellen-Indices
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-32
OOP: Overriding versus Overloading (Szenario 2)
class Super {void m(String s, int i) {...}void m(String s) {...}
(Szenario 2)
class Client { ( g ) { }}Super obj;
obj = new Super(...);obj.m("bla", 10);
bj l t bl [2]("bl ")overloading
obj.m("bla");}
obj.class.vtable[2]("bla");
obj.class.vtable[1]("bla", 10);
U t d L
class Sub extends Super {void m(String s) {...}
}
Unter der Lupe Hausaufgabe (5 Minuten): Lesen Sie sich die vorangegangenen Folien
dieses Abschnitts noch einmal aufmerksam durchdieses Abschnitts noch einmal aufmerksam durch. Hausaufgabe (2 Minuten): Versuchen Sie nach vorherigem Schema
(Seite 3-29) die Erklärung selbst zu rekonstruieren
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-33
OOP: Overriding versus Overloading (Szenario 2b)
class Super {void m(String s, int i) {...}void m(String s) {...}
(Szenario 2b)
class Client { ( g ) { }}Super obj;
obj = new Sub(...);obj.m("bla", 10);
obj.class.vtable[1]("bla", 10);
obj.m("bla");}
overridingobj.class.vtable[2]("bla");
O idi d O l di
class Sub extends Super {void m(String s) {...}
}
Overriding und Overloading zusammen Gleiche Signatur in Oberklasse und Unterklasse Gl i h O ti l i h I d i M th d t b ll Gleiche Operation gleicher Index in Methodentabellen Die spezifischste Methode (= Implementierung der Operation) gilt!
Methodentabelle der Unterklasse verweist auf Indexposition 2 auf die eigene Methode statt die Ü
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-34
Überschriebene
OOP: Overriding versus Overloading (Szenario 2b)
class Super {void m(String s, int i) {...}void m(String s) {...}
(Szenario 2b)
class Client { ( g ) { }}Super obj;
obj = new Sub(...);obj.m("bla", 10);
obj.class.vtable[1]("bla", 10);overriding
obj.m("bla");}
obj.class.vtable[2]("bla");
U t d L
class Sub extends Super {void m(String s) {...}
}
Unter der Lupe Hausaufgabe (3 Minuten): Versuchen Sie nach vorherigem Schema die
Erklärung selbst zu rekonstruierenErklärung selbst zu rekonstruieren
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-35
Fazit
„Dynamisches Binden“ ist nicht teuer Durch die statisch indizierten Methodentabellen sehr effizient!
Fehlende „Destruktoren“ Objekte können nicht explizit „zerstört“ werden um die
Konsistenz des Speichers zu gewährleistenKonsistenz des Speichers zu gewährleisten
Erreichbarkeit ist Kriterium für „lebendige“ Objekte Variablen die auf nicht mehr benötigte Objekte zeigen sollte Variablen, die auf nicht mehr benötigte Objekte zeigen sollte
man null zuweisen, um dem „garbage Collector die Erkennung von „Müll“ zu ermöglichen!
Objekterzeugung ist teuer Aufwand automatischer Speicherverwaltung Programmiertechnik zur Vermeidung überflüssiger
Objekterzeugenung– Objektpools Wiederverwendung von Objekten
Prof. Dr. A. Weber, Dr. G. Kniesel Vorlesung „OOSE – Objektorientierte Softwareentwicklung“, Sommersemester 2010 3-36
– StringBuffer (veränderlich) statt String (unveränderlich, immer wieder neu erzeugt "a" +"b" erzeugt neuen String "ab" statt die Parameter zu verketten!)