Wenn eine Methode aufgerufen wird, werden bestimmte Daten auf dem Stapel abgelegt. Wenn das Verfahren abgeschlossen ist, werden Daten vom Stapel entfernt. An anderen Punkten einer Programmausführung werden Daten zum Stapel hinzugefügt oder daraus entfernt.
Wenn Sie also eine Variable haben, die die Ausführung der Methode, die sie erstellt hat, überleben soll, muss sie sich auf dem Heap befinden. Dies gilt sowohl für alle von Ihnen erstellten Objekte als auch für alle Grundelemente, die in diesen Objekten gespeichert sind.
Wenn jedoch eine Variable kurz nach ihrer Erstellung den Gültigkeitsbereich verlassen soll - z. B. am Ende der Methode, in der sie erstellt wurde, oder noch früher, ist es sinnvoll, diese Variable auf dem Stack zu erstellen . Lokale Variablen und Methodenargumente entsprechen diesem Kriterium; Wenn es sich um Primitive handelt, befindet sich der tatsächliche Wert auf dem Stapel, und wenn es sich um Objekte handelt, befindet sich ein Verweis auf das Objekt (nicht aber das Objekt selbst) auf dem Stapel.
In Ihrem spezifischen Beispiel ist x
unbrauchbar, sobald function1
fertig ist. Es ist also vernünftig, dass es auf dem Stapel erstellt wird. Am Ende von function1
werden Daten effektiv vom Stapel entfernt, einschließlich x
. Andererseits wird erwartet, dass die Variable y
noch so lange existiert, wie das enthaltene Objekt existiert. Wenn es auf dem Stapel erstellt würde, würde es aufhören zu existieren, sobald der Objektkonstruktor, der es erstellt hat, fertig ist. Daher muss y
auf dem Heap erstellt werden.