Da lokale Variablen im Stack zugewiesen werden, wird der Speicherbereich für eine lokale Variable zugewiesen, wenn ihm ein Wert zugewiesen wird.
Nehmen einfaches Beispiel
class Abc {
int i = -111;
int e;
int doSomething() {
int a = 10;
int b = a + i;
int c = b + 100;
Abc d = new Abc();
e = b + c + d.a;
return e + 1000;
}
}
und den Bytecode von javap -c Abc
Compiled from "Abc.java"
class Abc {
int i;
int e;
Abc();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: aload_0
5: bipush -111
7: putfield #2 // Field i:I
10: return
int doSomething();
Code:
0: bipush 10
2: istore_1
3: iload_1
4: aload_0
5: getfield #2 // Field i:I
8: iadd
9: istore_2
10: iload_2
11: bipush 100
13: iadd
14: istore_3
15: new #3 // class Abc
18: dup
19: invokespecial #4 // Method "<init>":()V
22: astore 4
24: aload_0
25: iload_2
26: iload_3
27: iadd
28: aload 4
30: getfield #2 // Field i:I
33: iadd
34: putfield #5 // Field e:I
37: aload_0
38: getfield #5 // Field e:I
41: sipush 1000
44: iadd
45: ireturn
}
Wenn eine Methode einen Speicherplatz in dem aktuellen Frame genannt Stack inovked wird
zugeordnet ist
Wenn Sie genau hinschauen selbst Zuordnung geschieht in einer impliziten Init-Funktion Abc()
!
int a = -111;
5: bipush -111
7: putfield #2 // Field a:I
Als Feldvariable e
einen beliebigen Wert nicht zugeordnet ist, wird es 0, wenn primitive oder null sein, wenn ein Objektverweis
Und wenn Sie doSomething()
sehen
int a = 10;
0: bipush 10
für eine lokale zu sein verwendet der Anfangswert muss in diesem Fall 10 in den Stapel geschoben werden. Ohne diesen 'push' [Initialisierung] ist der Wert 'a' für nachfolgende Anweisungen nicht zugänglich (da der Wert nicht auf dem Stapel liegt). Sobald der Wert auf den Stack geschoben wurde, werden andere Operationen wie iadd ddore usw. auf dem Stapel ausgeführt
unter Anweisung erstellt tatsächlich ein Objekt auf dem Heap-Speicher und ruft init-Methode auf. Dies ist, wo un initialisierten Variablen wie ‚e‘ Standardwerte bekommt
15: new #3 // class Abc
18: dup
ich weiter Bytecode Vergleich bis zu Ihnen verlassen;) aber ich hoffe, es ist klar,
'int a' tatsächlich hat einen Standardwert von' 0 '. – Vulcan
Der gesamte Speicherblock des Objekts ist immer mit Nullen gefüllt, deshalb sind alle Variablen in einem Objekt standardmäßig auf 0 gesetzt, "b" ist eine lokale Variable und wird einfach nicht in diesem Teil initialisiert. Es wird initialisiert, wenn ein Wert – x4rf41
zugewiesen wird, aber y b Variable hat keinen Standardwert? –