Java Primitiver Datentyp auf Stack oder Heap?

8

Wenn ich richtig bin Primitiver Datentyp, der lokal definiert wird, wäre auf dem Stapel. Wenn jedoch ein primitiver Datentyp als Teil einer Instanz von on -Objekt definiert wurde, würde dieses Primitiv auf Heap gehen.

%Vor%

Also wird im obigen Code x auf dem Stapel und y auf dem Heap gespeichert? Ich bin verwirrt, wie sie gespeichert werden und warum spielt es eine Rolle Stack oder Heap?

    
dev_marshell08 01.04.2014, 07:12
quelle

5 Antworten

20

Wenn eine Methode aufgerufen wird, werden bestimmte Daten auf dem Stapel abgelegt. Wenn das Verfahren abgeschlossen ist, werden Daten vom Stapel entfernt. Zu anderen Zeitpunkten der Ausführung eines Programms werden Daten dem 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 - beispielsweise am Ende der Methode, in der sie erstellt wurde, oder noch früher, dann ist es angemessen, dass diese Variable auf dem Stapel erstellt wird. Lokale Variablen und Methodenargumente entsprechen diesem Kriterium; Wenn es sich um Primitive handelt, befindet sich der tatsächliche Wert auf dem Stapel. Wenn es sich um Objekte handelt, befindet sich ein Verweis auf das Objekt (nicht aber das Objekt selbst) auf dem Stapel.

In Ihrem speziellen Beispiel ist x unbrauchbar, sobald function1 beendet ist. Es ist also vernünftig, dass es auf dem Stapel erstellt wird. Am Ende von function1 werden die Daten effektiv aus dem Stack entfernt, einschließlich x . Auf der anderen Seite 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.

    
Dawood ibn Kareem 01.04.2014, 07:16
quelle
6

Nur lokale primitive Variablen und Verweise auf ein Objekt (d. h. eine in der Methode deklarierte Variable) werden im Stapel gespeichert. Andere werden in Heap gespeichert

    
Prakash Bhagat 01.04.2014 07:16
quelle
1

Variablen auf Instanzebene (können auch Primitive sein) sind Teil von Instanzen (Objekten). Sie werden also auf dem Heap (als Teil des Objekts) zugeordnet.

Methodenebene / Lokale Variablen: Stack (für Primitive) oder Heap (Objekte mit Referenzen auf dem Stack). Zeichenfolgen können entweder auf Stack oder auf Heap zugeordnet werden.

    
TheLostMind 01.04.2014 07:15
quelle
1

Ich bin mir ziemlich sicher, dass Sie inzwischen Ihre Antwort bekommen haben ... eine Sache, die es zu bemerken gilt. Selbst wenn Sie Variablen auf dem Heap speichern, lädt Java ihre Werte immer noch auf den Stack, wenn sie darauf reagieren müssen. So funktioniert JVM - es ist eine Stack-Sprache .

    
Eugene 01.04.2014 07:19
quelle
0

Wenn Sie eine Test -Instanz initiieren, werden alle Felder wie y im Heap gespeichert.

Wenn Sie function1 aufrufen, wird die lokale Variable x in den Stapel geschoben.

Aber in Ihrem Beispiel wird x nicht im Stack gespeichert, weil function1 niemals aufgerufen wird.

    
Weibo Li 01.04.2014 07:18
quelle

Tags und Links