Wozu ein Link, was man in jeder einschlägigen Fachliteratur findet? Was ist wohl kürzer? Eine Method-ID oder eine Adresse? Welches Objekt har auf Maschinencode-Ebene noch einen Namen? Es gibt dort nur noch Startadressen von Klassen, Objekten und Methoden in Form von Referenzen. Natürlich liegt der Code einer überschriebenen Methode an einer anderen Stelle als die überschreibende Methode und das muss in der Sprungtabelle der jeweiligen Objektstruktur verzeichnet werden. In Fachkreisen heißen startadressen für Methoden btw. Handle, falls du danach suchen und dich darin einlesen möchtest.
Und wie das passt. Wozu sollte ein ordinäres Objekt ganze 16 Byte Speicher verbrauchen? Liegt da zufällig die Adresse auf die eben erwähnte Sprungtabelle? Wie labg diese Sprungtabelle ist, hängt jedenfalls von der Anzahl der definierten Methoden ab und das wird von dem Programm in deinem Link gar nicht erfasst. Die Sprungtabellen können immer die selben sein, müssen sie aber nicht.
Genau, es passiert außenrum aber immerhin innerhalb der Runtime - die Initialisierung von Objektmethoden (Sprungtabellen) z.B. normalerweise unmittelbar nach super() oder this()
Die Kapriolen, die du bei deiner Klasse Test schlägst, sind dir hoffentlich bewusst - die Klasse kann nicht ohne Test2 (ClassCastException). Und während der Konstruktor Test() aufgerufen wird, steht für a, b, c und d bereits Speicher zur Verfügung, c wird nicht mal initialisiert - du kannst dich ja mal fragen, welches von Beiden (a oder b) zum Zeitpunkt der Verwendung im Konstruktor Test() noch 0 ist. Ich würde ja sagen, dass es beide sind, die 4 aus dem Hut gezaubert (vom Stack geholt) wird und Initialisierung von Test2 (inkl. Sprungtabellen und Variablen) erst nach super() fertig gestellt wird. Feststellen kann man dies indem man einen BP vor „t2.c = t2.a + t2.b;“ setzt.
Und jetzt komm mir nicht damit, ich hätte zuvor nur von Startadressen von Methoden gesprochen. Die Sache ist kompliziert genug und es genügt, sich zu merken, dass einem Objektmethoden erst nach super() und this() für das Objekt zur Verfügung stehen, selbst wenn man sie bereits im Konstruktor von Test() aufrufen kann (Test2 ist sozusagen noch Ghost-Instance).