Tach!
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.
Nicht oberflächlich sondern abstrahiert. Selbst mit deiner Beschreibung des Hintergrundes berührst du nur eine Möglichkeit, die sich noch dazu auf kein konkretes System bezieht, obwohl du ja selbst eingeräumt hast, dass jedes System intern anders arbeitet.
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.
Ja, es ist vorhanden. Mehr muss man nicht wissen. Ob es vom System im Arbeitsspeicher gehalten oder von einem anderen Medien gelesen oder zwischen ihnen hin- und hergeschubst wird, spielt keine Rolle. Wenn du mit Details anfängst, musst du sie auch vollständig klären, sonst wirst du "oberflächlich". Oder du lässt es weg, weil du eben grad nicht die Rolle eines Compilerbauers oder Betriebssystemprogrammierer einnimmst, sondern aus der Perspektive eines Hochsprachenprogrammierers schaust.
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.
Schade, denn ich wüsste grad nicht, was da die Unterschiede sind und inwieweit sie relevant sind.
es wird Speicherplatz für die Klassenvariable allokiert, egal, wieviel daws jetzt ist.
"Klassenvariable"?
Korrektur: Für die Instanzvariable der Klasse. Nun zufrieden? :-)
Nein, nur Instanz, nicht Instanzvariable. Ansonsten wäre jeder auch nur intern und temporär verwendeter Datenspeicher bereits eine Variable, was aus Sicht des Hochsprachenprogrammierers nicht der Fall ist. Eine Variable kommt entweder gar nicht oder erst nach dem Instantiieren (nebst Konstruktoraufruf) ins Spiel, wenn im Code eine Zuweisung notiert ist und diese ausgeführt wird.
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
Nimm einfach mit, dass statische Dinge zum Programmstart (oder spätenstens wenn der Code der Klasse geladen wird) initialisiert werden, bevor die Kontrolle an das eigentliche Programm übergeben wird, und nicht erst, wenn die erste Instanz einer Klasse erzeugt wird. Denn die Initialisierung muss bereits stattgefunden haben, oder das Programm kann sich nicht darauf verlassen, dass statische Dinge da sind. Du hast das so beschrieben, dass die statischen Dinge die Folge einer Instantiierung ist. Sie existieren jedoch auch ohne jegliche Instanzen.
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.
Und die Klärung ist recht einfach. Spezialfälle außen vor gelassen, wird alles, was durch Syntax im Klassencode notiert ist und weder statisch noch Methode ist, bei der Instantiierung bereitgestellt. Das "wo" und "wie" ist für eine Hochsprache, die sich nicht um die Speicherverwaltung kümmern muss, uninteressant. Dann kommt eine Konstruktor-Methode zur Ausführung, so sie existiert, die dann das macht, was noch individuell nötig oder aus Sicht der Anwendung komplexer zu initialisieren ist.
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?
Hätte ja sein können, dass du wieder ungenau mit den Begriffen hantierst. Bei PHP gibt es nur einen oder keinen Konstruktor (PHP4 und seine Hinterlassenschaft außen vor gelassen). Der Begriff Standard-Konstruktor ist damit gegenstandslos. In anderen Systemen, die Methoden gleichen Namens mit unterschiedlichen Signaturen erlauben, kann es einen Standard-Konstruktor geben, explizit in der Klasse oder implizit durch den Compiler. Hier, nehme ich an, hat der Konstruktor auch die Aufgabe, die Instanz zu erstellen, bevor der Code in ihm ausgeführt wird. Ich habe es auch so gelernt: "Der Konstruktor erstellt die Instanz." Das mag bei einigen Systemen zutreffen, bei PHP aber eben nicht, denn da gibt es keinen Konstruktor-Zwang. Wer es letzlich macht und ob überhaupt ein impliziter Standard-Konstruktor vom Compiler erstellt wird, ist auch nicht weiter wichtig, weil man es nicht beeinflussen kann.
Das ist nichts anderes, als ein FarReturn, wenn Du mal genauer hingesehen hast.
Ach du Heimatland, jetzt steigst du auch noch zum Prozessor hinab. Geh ruhig, ich bleibe hier oben. Katakomben in Paris anschauen mag interessant und an heißen Sommertagen erfrischend sein, aber zum täglichen Leben braucht man es nicht (es sei denn, man ist Stadtführer oder Historiker).
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.
Bitte was? Du beschreibst das ja so, als ob der Code im Speicher erst sortiert werden müsse, bevor er abgearbeitet werden kann. Warum machst du so etwas? Der Code wird irgendwie im Speicher stehen und der Compiler weiß genau, welche Instruktionen er in welcher Reihenfolge erzeugen und mit welchen Sprungbefehlen versehen muss. Da habe ich volles Vertrauen in ihn.
dedlfix.