Zum Abschluss der heutigen Vorlesung noch ein kniffliges Thema,
nämlich Vererbung in Konstruktoren. Konstruktoren, die Wiederholungsfrage hatte das gesagt,
haben wir eben schon kurz angeschaut, sind die Operationen,
die die Initialwerte liefern für ein neu erzeugtes Exemplar.
Diese Konstruktion, Konstruktoren beziehen sich immer nur auf eine Klasse.
Und deswegen ist es im Java so gemacht,
von den Entwicklern dieser Sprache, dass Konstruktoren in Java nicht vererbt werden.
Die Erben der Klasse hat deswegen nicht automatisch die gleichen Konstruktoren wie die Oberklasse,
aber Bei der Erzeugung eines Objekts werden die Konstrukturen sämtliche Oberklassen aufgerufen,
in der Reihenfolge von der Entferntesten bis zur direkten.
Das heißt, von ganz oben bis weiter runter. Das passiert implizit,
das wäre so, als würde man ein,
als würde der Compiler, was ja ganz unten steht,
automatisch das einfügen, und zwar bei jeder Klasse,
deswegen von oben nach unten, aber sie können das auch explizit anstoßen,
indem sie ein Konstruktor aufrufen, den Konstruktor der Oberklasse aufrufen,
insbesondere macht man das dann, wenn man Parameter übergeben möchte,
wenn man eine Konstruktur mit Parametern ausschließen wird.
Wenn man das nämlich nicht macht, würde der Compiler diesen
parameterlosen Konstruktor aufrufen. Sie wissen ja vom Ipalaten her,
ich kann den Konstruktur haben, ohne Parameter einen Konstruktor mit Parameter.
Dieser implizite Aufruf passiert immer nur für den Konstruktur ohne Parameter.
So, und deswegen sollten sie,
wenn sie Parameter in Kurzfrikum mit Parametern aus der Oberklasse brauchen,
durchaus den aktiv aufrufen.
Achso, da sollten wir uns vielleicht
eine Frage dazu anschauen
Die Frage 4 bezieht sich daraus, wenn es nicht
explizit festgelegt ist, welcher Konstruktur wird denn da aufrufen.
Und das hatten wir, die Reihenfolge, das war gerade das,
was wir hier auf der Folie stehen hatten,
von der Entferntesten zur direkten, werden die auf Hoch.
Wenn wir uns das mal anschauen, an einem weiteren Beispiel,
wir haben hier den Punkt und das Pixel.
Pixel ist eine Verfeinerung von Punkt und Hinterkonstruktur,
die haben wir den Konstruktur ohne Parameter und wir haben einen Konstruktur mit Parametern.
Einen Punkt in einem zweidimensionalen System hat X und Y
Werte und ein Pixel ist insofern ein spezieller Punkt,
weil es nicht nur die Koordinaten hat, sondern auch noch eine Farbe.
So, und wenn wir jetzt,
wenn wir jetzt diesen anderen und diesen Konstrukt aufrufen wollen,
ja, dann brauchen wir, müssen wir eine Unterscheidung machen,
ob wir den Konstruktor mit Parametern oder den Konstruktor
ohne Parameter ausrufen wollen
Schauen wir uns das mit der Klasse.
Konto an. Wir hatten vorhin schon die Klasse Konto,
die durch sie verfeindet wird, durch die Klasse im Sparbuch.
Und jetzt gibt es noch, wollen wir noch eine
weitere Verfeindung machen, eine weitere Spezialisierung durch das Bergsparbuch.
Sparbedachs ist der Aktiendeutsche Aktienindex, also ein Sparbuch,
wo man vermuten muss, dass ein Teil oder der gesamte
Investition in Aktien des Tags passiert.
Und ja, brauchen wir natürlich ein anderer Konstruktor.
Wir können das so machen,
dass wir jeweils hier absichtlich den Konstrukt an der Oberklasse aufrufen
Und zusätzlich noch den Zinssatz setzen zum Beispiel. Oder hier,
dass wir einen Konstruktor aufrufen, der nicht der Standardkonstruktor ist.
Also der Standardkonstruktor würde jetzt hier nicht diesen Parameter haben.
Wir rufen aber ausgerechnet aus wirklich den Konstruktor auf, der diesen Parameter holt.
Und wenn das immer da das Objekt erzeugen wollen mit diesen Parametern,
dann sollten wir auch hier, wenn wir das aufrufen,
wenn wir diesen Konstruktor aufrufen, nämlich Konstruktor mit einem Parameter,
dann würde automatisch auch zusätzlich hier der eine Konstruktur mit Parameter aufgerufen.
Das würde nicht passieren, wenn wir das weglassen würden.
Ohne würde, sowohl hier der parameterlose Konstruktor aufgerufen,
als auch wir der Fahrmeterloserinstruktur und,
das wäre mit dem Zinssatz, möglicherweise wäre der nicht definiert.
Das heißt, hier, es ist die Vorkehrung dieser,
ja, so. Und das führt dann dazu,
dass ich also von hier diesen Parakonstruktur aufrufe.
Und wie es Initialisierung hier passiert
So, und dann kurz das von hier übernommen,
also der Konstruktor hier, wird hier aufgerufen,
das wäre dann noch der zweite Fall.
Also hier haben das mehr Studios zuerst diesen Fall betrachtet,
irgendwie oben hilf ich dir, paralleterlosen Konstruktor öffnen konnte.
Und der wird dann hier eingeführt. Ja, soweit.
Und das setze ich nach unten fort.
Lasst uns zweitens, soweit. Wie sieht das aus mit
der Unterscheidungsfrischen Aufruf und Erbenschnittstelle
Dieser Aufruf ist für den Aufrufer, der das benutzt und der Erbende,
ich sehe bei, ich finde es hier einen Unterschied geben.
Und zwar hängt es davon ab, welche von den Modifikatoren
ich habe, habe ich hier Public protected und Brivate.
Das hatten wir vorhin schon mal. Und dann habe ich
beim nächsten Mal nochmal drauf eingehen. Wir haben Public bedeutet,
alle können das aufrufen, also auch andere Klassen,
also hier.
Wir können das in der abbegleiteten Klasse durchaus verwenden,
aber jemand anders darf es nicht zugreifen und brei wird nur in der Klasse selbst.
Ja, das ist hier, dadurch gegeben,
ob wir Pappel beidet in der Projected haben. So,
wie sieht das aus, wenn ich das so darstellen möchte,
dass ich dieses Verhältnis erreiche, ja, also wenn ich jetzt zum Beispiel möchte,
dass möchte ich das so umstrukturieren. Die Klasse Konto,
dass die jetzt nicht mehr Salde in einer Zahl Gleitkomme haben,
weil das manchmal so coole Werte gibt,
ich möchte das jetzt so umstrukturieren,
dass ich ganze Zahlen für Euro in ganze Zahlen für Cent habe,
wie das ja der Währung entspricht.
Ja, und ich bestelle das um, dass das hier ein Paar ist.
Oder was ist einzelne Werte sind, finde ich ein paar Mal Quatsch.
Es sind einzelne Werte, ganzzeitige Werte versendet.
Da muss ich die Berechnung natürlich ein bisschen anders durchführen.
Und wie sieht denn das jetzt aus,
zum Beispiel für diese Berechnung, ob ein Konto gedeckt ist.
Und ich kann das dadurch machen,
dass ich hier die Klasse Saldo als Protected deklariere,
dass ich nicht erlaube, dass ich von außen her gegriffen werden kann.
Und damit kann ich das sichern,
dass wir das Änderungen sich nicht so weit ausbreiten.
Wie sollte das deswegen in der Ungewissheit, das in der Unterklasse sei?
Und in der Unterklasse wäre es zum Beispiel so möglich,
dass wir zwar die Methode Public haben, aber float ihr als Private deklarieren.
Das heißt, ich kann es nur in der eigenen Methode
machen und protected, würde ich für die Pseudo verwenden.
Dieses Kapseln, passiert, so, dass die Oberklassen geändert
werden können, ohne dass die untergebressenen Volländerungen betroffen sind.
Wir also die Unterklasse haben wir nicht verändert,
die Oberklasse hat eine Änderung gehabt und damit haben wir uns
den Aufwand gespart mit der Unterklasse, das nochmal zu ändern.
Ich möchte noch einen weiteren kritischen Punkt hinweisen. Es gibt nämlich einen Operator Instance of,
Sie haben den vielleicht schon mal erlebt,
vielleicht gab es das SE1, dass Sie prüfen,
ob es sich um ein Exemplar einer bestimmten Klasse handelt.
Das kann man durchaus machen, Aber wir möchten darauf hinweisen,
dass das bei Implementationsvererbung nicht mehr so ganz korrekt ist.
Nämlich wird eigentlich, wird getestet, ob es diese Klasse oder eine andere,
eine weiter tiefer liegende Klasse sich dabei handelt.
Und zum Beispiel, ich könnte das machen,
ob etwas eine Instanz von der Klasse Object ist.
Und die wird immer tun liefern, weil jedes,
jede Klasse eine Unterklasse von Object ist.
Und das Handy wird uns alle erfüllen. Wenn wir also
das Gleiche jetzt mit dem Konto machen, wir prüfen,
ob das, sorry,
das sollte nicht vorkommen,
wir prüfen,
ob das
Sich um einen Infanz von Konto handelt,
dann wird er auch für DAX-Sparbuch und Sparbuch, das Tuli.
Also deswegen müssen wir das ein bisschen anders machen. So,
kleine Zusammenfassung, ach so, genau, diese Erweiterung,
hatten wir hier noch, Instance-Off liefert, dann zu, wenn das funktioniert.
So, wir möchten das noch kurz zusammenfassen,
um zum Schluss zu kommen,
bis wir bevor wir ein kleines Quiz noch machen für sie,
also Implementationsverabo,
ist,
dass ich gemeinsames Verhalten in einer Oberklasse
zusammenfasse und Spezialisierung zur Erweiterung benutze
Und dabei kann ich durch Reh definieren, das Überschreiben,
Reh definieren, überschreiben, um diese Anpassung vorzunehmen.
Wir haben darüber gesprochen, was abstrakte Klassen sind,
dass diese abstrakten Klassen etwas vorschreiben, aber keine Implementationen liefern.
Und dann zum Schluss hätten wir ja noch
die Aufrufschnittstelle und die Schnittstelle für Erben unterschieden.
Das war das mit dem Schlüssel wird protected,
wenn das notwendig ist. Und wir waren auf Object eingegangen
und die Besonderheiten der Konstruktoren
Jetzt noch als kleines Quiz, möchte ich Sie fragen,
was auf die Konsole geschrieben wird. Und zwar,
wir haben hier zwei Klassen, eine Klasse A und eine Unterklasse B.
Und die Klasse A schreibt auf die Konsole ein A.
Die Klasse B schreibt auf die Konsole ein B immer im Konstruktor.
Und jetzt rufe ich den Konstruktor auf, indem ich diese Konstruktoren auf,
und das ist jetzt der Trick dabei, ich erzeuge ein B.
Und rufe den Konstruktor von B auf und möchte gern wissen,
was erscheint auf der Konsole
Diese Zeile wartet nur auf das Endtown, dass sie sehen können,
was da steht. Und jetzt ist die kleine Frage für sie,
was wird auf die Konsole ausgegeben? Es gibt vier Optionen,
A-B-B-A- oder A-B. Sie zeigen damit mit der Antwort,
ob sie das richtig verstanden haben, wie das mit der Reihenfolge war.
Und jetzt kommt ein kleiner Stopp. Ich würde Sie bitten,
jetzt dieses Video zu stoppen,
weil ich werde gleich die Antwort sagen, also bitte stoppen,
erst mal nachschauen oder noch mal nachdenken,
wie war denn das mit der Antwort?
So, jetzt der Stopp wieder. So geht es
für alle nie weiter gemacht, haben die Auflösung,
die richtige Antwort ist
Weil zuerst aufgerufen wird, aufgerufen wird. Und also der
Superkonstruktur wird zuerst aufgerufen. Deswegen. Vielen Dank heute und
wir sehen uns in der Fragerunde bzw. in der kommenden Woche.
Vielen Dank