Tom: Constructor in einer Methode der Klasse erneut aufrufen?

Beitrag lesen

Hello,

das scheint ja langsam ein philosophisches oder archäoligisches Problem zu werden. Graben wir doch mal in den Bits.

Zu tief graben ist für das allgemeine Verständnis zunächst nicht notwendig. Für den Anfang reicht zu wissen, dass 1 + 1 eine 2 als Ergebnis hat und nicht was der Prozessor dabei in seinen Registern anstellt. Das ist nicht komplett uninteressant, nur eben nicht jetzt.

Hier geht es nicht um oberflächliches "allgemeines Verständnis in der Anwendug" sondern um das eigentliche Problem: wie funktieriert das überhaupt im Hintergrund.

Eine Klasse ist nur ein Baumuster. Das liegt statisch vor, wenn das Programm läuft.

Das Wort statisch würde ich an dieser Stelle meiden. Nahezu jeder Programmcode liegt statisch vor. Es ist also keine Besonderheit des Baumusters.

Genau! es ist eine kennzeichnende Eigenschaft. Das Baumuster (zumindest der Masterklasse) ist schon bei Programmstart im Speicher nachlesbar.

Nun wird eine neue Instanz angefordert. Das geschieht durch

newinstance = new(baumuster);

Die PHP-Syntax ist zwar eine andere, aber egal.

Von PHP sprach ich eben auch noch nicht. Da lautet die Syntax aber ziemlich ähnlich:

$newinstance = new Baumuster();

Was passiert hier?
Ich sag mal so: es kommt darauf an, nämlich ob es ein generisches Klassensystem (C++), ein typisierendes Klassensystem (Delphi) oder ein Interpretersystem (z.B. PHP) ist. Was in allen aber gleich ist:

Du deutest zwar hier eine Trennung nach Systemen an, aber führst in den nachfolgenden Teilen nicht aus, was dabei die Unterschiede sind/sein sollen.

Das würde auch zu weit führen, es auszuführen. Es muss reichen, das hier anzudeuten.

es wird Speicherplatz für die Klassenvariable allokiert, egal, wieviel daws jetzt ist.

"Klassenvariable"?

Korrektur: Für die Instanzvariable der Klasse. Nun zufrieden? :-)

Darüberhinaus wird i.a. auch Speicherplatz für die statischen Teile der Klasse allokiert
   und diese werden dort hineinkopiert. Das sind einfache Variablen und z.B. die Adressen zu
   den Methoden.

Statische Teile einer Klasse werden sinnvollerweise zum Programmstart oder bei nachgeladenen Code-Bibliotheken direkt nach dem Laden initialisiert, ansonsten wären die statischen Teile aus der Sicht des Programms ähnlich wie Schrödingers Katze, vielleicht schon initialisert, vielleicht aber auch nicht.

Diese Aussage verstehe ich jetzt überhaupt nicht

Damit ist die (Kern-)Instanz gebildet, noch bevor irgendwelche Initialisierungen stattgefunden haben, mit Ausnahem der statischen Werte. Die stehen jetzt bereits hardcoded im Speicher.

Was wie im Speicher steht, ist für unsere Betrachtungen nicht relevant.

Nur das ist hier relevant: Was ist hart und was ist weich?

Hartkodiert sind eher Konstanten in kompilierten Programmen.

Oder sogenannte "variable Konstenten"? Was es da alles gibt, würde ein eigenes Buch füllen.

Alles andere wird vermutlich zur Laufzeit im Datenteil des Speichers angelegt.

Genau darum geht es. Zur Laufzeit wird alles, außer dem Baumuster, veranlasst. Aber was wird jetzt bereits von außen bei der Bildung der Instanz und was wird erst aus der Instanz heraus nach Bildung dieser veranlasst. DAS ist hier die Kernfrage gewesen.

Aber um diese Feinheiten brauchen sich PHP- und Programmierer anderer Systeme üblicherweise keine Sorgen zu machen, wenn sie darauf keinen Einfluss nehmen können. (Vielleicht ist C hier die Ausnahme - das kenne ich kaum.)

**********
Und darum ging es auch gar nicht. Also lenke bitte nicht ab. Es ging einzig und alleine darum, ob die Instanz durch "new" gebildet wird, oder aber durch den Konstruktor einer Klasse!
**********

Damit ist aber klar, der Konstruktor war noch gar nicht tätig. Dieser kann nämlich erst ins Spiel kommen, wenn er selber abgebildet worden ist, entweder durch Codekopie, oder durch Referenz auf den Standardkonstruktor.

Welches System kopiert denn Code in die Instanzen eines Objekts? Gängiges Vorgehen bei der OOP ist, dass für die Klasse eine Tabelle existiert, die zu jeder Methode auf den jeweiligen Code verweist (virtual method table). Durch Vererbung können ja Teile des Codes den Elternklassen "gehören".

Dazu muss dieser Code aber für die Klasse angepasst vorliegen. Also entweder als Kopie oder als Verweis auf den vorbereiteten Code. Nix anderes habe ich gesagt.

Was ist jetzt für dich der Standardkonstruktor? Ist das der Teil im System, der die Instanz erzeugt oder die Konstruktor-Methode einer Superklasse, von der alle anderen Klassen abgeleitet werden?

Kannst Du jetzt programmieren oder nicht? Was macht denn ein leerer Konstruktor einer Klasse?
Das ist nichts anderes, als ein FarReturn, wenn Du mal genauer hingesehen hast.

Erst ein angepasster Kondtruktor einer Klasse tut etwas. I.d.R. initialisiert und erzeugt/initilisiert er diverse Variablen und Datenkonstrukte.

Also muss der angepasste Konstruktor irgendwo als Codeblock bestehen. Der kann statisch sein.

Wenn dieser nun noch weitere übergeornete Kontruktoren anzieht (i.d.R. wegen Vererbung), dann entsteht der endgültige Code im Speicher erst bei der Instantiierung des Konstruktors. Vorher war der noch gar nicht zusammngebaut.

Wenn jetzt als nächstes die Kontrolle an den Konstruktor übergeben wird, kann er für neue Speicherallokationen sorgen und diese Fragmente innerhalb der statisch vorbereiteten Teile der Instanz eintragen. Wohin sollte der Konstruktor denn die Referenzen schreiben, wenn noch kein Variablenplatz ("Ankeradresse") dafür vorgesehen wäre?

Auch hier gehst du wieder zu sehr ins Detail.

Ich versuche, genauer hinzugucken, und mich nicht in Allgemeinplätzen zu halten. Denn die eigentliche Frage war ja:

*********
Es ging einzig und alleine darum, ob die Instanz durch "new" gebildet wird, oder aber durch den Konstruktor einer Klasse!
*********

Ob Speicher allokiert werden muss (für die Instantiierung von Referenztypen), bereits da ist (Wertetypen, deren Größe beim Erzeugen der Instanz ja bereits bekannt ist und deren Speicher gleich mit angefordert werden kann), von einer Wurst abgeschnitten wird oder aus der Cloud kommt, ist alles nicht so wichtig für das Verständnis der Aufgaben einer Konstruktor-Methode. Vereinfacht würde ich das so formulieren:

Nö, Du redest im Kreis. Genau davon hängt die Beantwortung der Frage ab.

Es ist immer wichtig, was zuerst da war: die Wurst oder der Bauch.

Liebe Grüße aus dem schönen Oberharz

Tom vom Berg

--
 ☻_
/▌
/ \ Nur selber lernen macht schlau
http://bergpost.annerschbarrich.de