Hi,
dankeschön. Dürfte ich nur noch kurz die genannten Wörter nochmals aufgreifen, ob ich es "grob" verstanden habe.
Mit Heap und Stack hat das Ganze nur intern zu tun. Der Punkt bei der ganzen Angelegenheit ist, dass man in bestimmten Situationen nicht den Speicherbereich, also den Wert an sich haben will, sondern die Adresse desselben, also eine Referenz auf einen Wert.
Beim Boxing wird ein Speicherbereich reserviert, der Wert der zu verschachtelnden Variablen in diesen Speicherbereich kopiert und die Adresse des Speicherbereichs zurückgegeben. Im obigen Beispiel landet die Adresse in der Variablen obj (die übrigens ihrerseits auf dem Stack liegt, aber das tut –wie gesagt– nichts zur Sache).
MyStruct ms; //[1]
ms.SetI(1); //[2]
object obj = (object) ms; //[3]
((MyStruct)obj).SetI(5); //[4]
In der ersten Zeile wird ein Speicherbereich/Wertebereich (Stack) erzeugt/reserviert.
In Zeile zwei die Zahl 1 darin gespeichert.
Zeile drei reserviert nun im Systemspeicher (Heap) Speicher und kopiert den Wert von dem Speicherbereich "ms" in den Heap. Unboxing?
In Zeile 4, wird ein Speicherbereich/Wertebereich (Stack) reserviert und der Wert der Variable "obj" in den Stack kopiert. Man erhält dann die Adresse des Speicherbereichs.
Ist das so richtig herum oder vertausche ich Zeile drei und vier?
Grüße
Schau doch nochmal hin: A ist eine Unterklasse von Thread. Kaufst du ein A, bekommst auch einen Thread. Die Funktionalität der Klasse hängt an der Klasse und nicht am Typ der Variablen.
Ja wie gesagt, ich schau mir das alles nochmals an. Bisher hatten wir das in der Vorlesung nur so benutzt:
Mutterklasse var = new AbgeleiteteKlasse()
Macht aber, wie ich sehe kein Sinn, da man nur die Elemente dann von abgeleiteteKlasse nutzen könnte. Andersherum wie folgt würde eh nicht funktionieren:
AbleiteteKlasse var = new Mutterklasse()
Ist mir aber nun wieder klar, wenn ich es genau wieder anschaue.
Die Klasse A und B sind zwar von Thread abgeleitet und haben folglich deren Funktionalität. Muss man aber nicht die Methode "run" der Mutterklasse explizit aufrufen in Klasse A und B, wenn man die Funktionalität (Parallelität) nutzen will.
Ah shit, jetzt sehe ich es. Auch der aufruft mit start().
Dürfte wohl gestern noch an der Uhrzeit gelegen haben :-) Sorry für den letzten Teil.
Grüße