Michilee: Extend, Implement, Abstract

Beitrag lesen

Hi Richard,

Nachdem das Programm einmal beendet wurde, existieren die Objekte natürlich nicht mehr. Beim nächsten Programmstart sind die geänderten Werte also nicht mehr da. Alle Angaben bzgl. des Änderns von Variablenwerten bezogen sich auf genau _eine_ Laufzeit des Programms.

ja danke, das ist mir klar. das erübrigt sich dann auch meine frage, sobald man eine statische Variable von einem anderen Objekt ändert und wiederum ein anderes Objekt auf die statische Variable zugreift, so gilt der Wert, denn das Objekt für die Variable gesetzt hat, natürlich bis die Laufzeit beendet wird.

Bei einem Webprojekt (JSP/Servlets) gäbe es ja nur eine Laufzeit, da das Programm ja "eigentlich" permanent läuft.

Seriazible b = meineKlasse() nicht gehen.

Das wird nur gehen, wenn die Methode meineKlasse() eine konkrete Implementierung von Serializable zurückgibt. Wahrscheinlich meintest du aber den Konstruktor. Um den aufzurufen, musst du das Schlüsselwort new verwenden. Wenn die Klasse meineKlasse Serializable implementiert, ist obiges Konstrukt richtig (abgesehen vom fehlenden new natürlich).

Oh, ja habe das new vergessen. Wo macht es bzw. worin sind die Unterschiede genau, wenn meineKlasse Seriazible implementiert und ich das Objekt mal so:

a) Seriazible a = new meineKlasse()

und einmal

b) meineKlasse b = new meineKlasse() verwende?

Unterschiede dürfte es eher wenig geben?
a) und b) sind von Datentypen beide Objekt, beide meineKlasse und auch beide Seriazible, weil es wie du geschrieben hast, in der Vererbungshierarchie oben steht, auch wenn ich ein Objekt beginnend mit meineKlasse gebildet habe.

(Gelernt habe ich ja bisher, wenn man Seriazible nicht implentiere, sondern davon ableite, dass der Unterschied nur daran besteht, dass man bei der Variante implement kein Objekt von Seriazible verwenden kann)

Ein Objekt ist immer Typ von:

  1. der Klasse, von der es erzeugt wurde,
  2. allen Klassen, die in der Vererbungshierarchie über der Klasse stehen, von der das Objekt erzeugt wurde, und
  3. allen Schnittstellen, die von irgendeiner Klasse, die in der Vererbungshierarchie über der Klasse steht, von der das Objekt erzeugt wurde, inklusive der Klasse selbst, implementiert wurden.

danke, das ist schön erklärt.
Zur Verdeutlichung des Punkt 3.

Nehmen wir an Seriazible implementiert die Klasse Abc.
meineKlasse implementiert Seriazible.

Egal, ob ich das Objekt mit Seriazible a = new meineKlasse() oder meineKlasse b = meineKlasse() bilde, ist das Objekt vom Typ Seriazible, Abc, meineKlasse, Objekt und alles was drüber, bzw. Abc wiederum implementiert usw.

Das, was vor dem = steht ist der Variablenname der Variable, die eine Referenz auf das Objekt enthält.

Nein, meineKlasse ist nicht das Objekt, sondern eine Klasse.

Seriazible xyz = new meineKlasse()

Seriazible ist Klasse
xyz ist Variable bzw. eine Referenz auf das Objekt (bzw. auch der Speicherplatz)
meineKlasse ist auch eine Klasse, bzw. auch der Konstruktor :-)
Das was aus dem ganzen gebildet wird, ist das Objekt mit dem Typ, was wir oben hatten.

Seriazible a = new meineKlasse()

also
ImplementiereKlasse b = meineKlasse()

Überlege dir genau, welche Klasse hier welche Schnittstelle implementieren muss und wie die entsprechenden Passagen im Quellcode aussehen müssen.

Klasse A (A extends X und A implementiert B)
Klasse C (implementiert A)

  1. A m = new A (Typ A, B und X)

  2. B m = new A (Typ A, B und X)

  3. C m = new C (Typ C, B, A und X)

  4. A m = new C (Typ C, B, A und X)

  5. X m = new X (Typ X)

Morgen abend schreibe ich ein paar ganz simple Scripts und teste extends, implements usw. mal alles durch. Ich will ja auch testen, wenn ich ein Objekt wie in Punkt 3) erstelle und Methoden von X nutze oder von A, bzw. wenn wie sich die drüberstehenden Objektvariablen verhalten. (Bsp. wenn ich die Objektvariablen die in der Vererbungshierarchie drüber stehen, beim Erzeugen von 3) nicht gefüllt habe)

nochmals vielen dank an alle und vor allem an richard.

grüße