2014-04-01 14 views
8

Wenn ich richtig bin Primitive Datentyp lokal definiert 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.Java Primitive Datentyp auf Stack oder Heap?

class Test 
{ 
    int y=10; // defined as part of the class 

    public void function1(){ 
     int x = 5; // defined locally 
    } 

    public static void main(String[] args) 
    { 
     Test obj = new Test(); 
    } 
} 

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

Antwort

19

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.

1

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

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

6

Nur lokale Variablen primitive und Verweise auf Objekt (d.h. variable in Methode deklariert) im Stapel gespeichert. Andere werden im Heap gespeichert

0

Wenn Sie eine Test Instanz initiieren, werden alle Felder wie y im Heap gespeichert. Wenn Sie function1 anrufen, wird die lokale Variable x in den Stapel geschoben. In Ihrem Beispiel wird x nicht im Stapel gespeichert, da function1 nie aufgerufen wird.

1

Ich bin mir ziemlich sicher, dass Sie jetzt Ihre Antwort bekommen haben ... eine Sache zu bemerken. 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 Stapelsprache.