Ponieważ zmienne lokalne są przydzielane na stosie, fragment pamięci dla zmiennej lokalnej jest alokowany, gdy jest przypisany z wartością.
Weźmy prosty przykład
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;
}
}
i kodu bajtowego z 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
}
Gdy metoda jest inovked przestrzeń pamięci w stosie nazwie prąd rama przeznaczono
Jeśli spójrz uważnie nawet na int a=-111;
przypisanie odbywa się w niejawnej funkcji init Abc()
!
int a = -111;
5: bipush -111
7: putfield #2 // Field a:I
W polu Zmienna e
nie przypisano żadnej wartości to będzie 0 jeżeli prymitywny lub null, jeśli obiekt odniesienia
A jeśli spojrzeć na doSomething()
int a = 10;
0: bipush 10
dla lokalnej być w tym przypadku wartość początkowa musi zostać przesunięta do stosu 10. bez tej "wypychania" [inicjalizacja] wartość a nie jest dostępna dla kolejnych instrukcji (ponieważ wartość nie znajduje się na stosie). po przesunięciu wartości w celu ułożenia stosu innych operacji, takich jak iadd istore itd., są one wykonywane na stosie, a poniższe instrukcje faktycznie tworzą obiekt na obszarze sterty i wywołują metodę init. To gdzie un zainicjowany zmienne, takie jak „e” pobiera wartości domyślne
15: new #3 // class Abc
18: dup
zostawiam dalszego porównania kodu bajtowego zapisu do Ciebie;), ale mam nadzieję, że jest jasne
'int A' rzeczywiście ma wartość domyślną' 0 '. – Vulcan
cały blok pamięci obiektu jest zawsze wypełniony zerami, dlatego wszystkie zmienne w obiekcie mają domyślnie wartość 0, "b" jest zmienną lokalną i po prostu nie jest inicjowana w tej części. jest inicjowany po przypisaniu wartości – x4rf41
, ale zmienna y b ma domyślną wartość? –