Khi các biến cục bộ được cấp phát trên ngăn xếp, đoạn bộ nhớ cho một biến cục bộ được cấp phát khi biến được gán với một giá trị.
Hãy ví dụ đơn giản
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;
}
}
và bytecode từ 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
}
Khi một phương pháp được inovked một không gian bộ nhớ trong ngăn xếp gọi khung hiện được phân bổ
Nếu bạn xem xét kỹ lưỡng việc chuyển nhượng int a=-111;
xảy ra trong hàm init ngầm định Abc()
!
int a = -111;
5: bipush -111
7: putfield #2 // Field a:I
Như lĩnh vực biến e
không được gắn bất kỳ giá trị nó sẽ là 0 nếu nguyên thủy hoặc null nếu một tham chiếu Object
Và nếu bạn nhìn vào doSomething()
int a = 10;
0: bipush 10
cho một địa phương được sử dụng giá trị ban đầu cần được đẩy vào ngăn xếp trong trường hợp này 10. mà không có 'đẩy' này [khởi tạo] giá trị của a không thể truy cập được tới các câu lệnh tiếp theo (vì giá trị không nằm trong ngăn xếp). một khi giá trị được đẩy để ngăn xếp các hoạt động khác như iadd istore, vv được thực hiện trên ngăn xếp
câu lệnh dưới đây thực sự tạo một đối tượng trên không gian heap và gọi phương thức init. Đây là nơi un khởi tạo các biến như 'e' được giá trị mặc định
15: new #3 // class Abc
18: dup
tôi để lại tiếp tục so sánh bytecode tối đa bạn;) nhưng tôi hy vọng nó là rõ ràng
Nguồn
2013-08-14 09:14:54
'int a' thực sự có giá trị mặc định của '0 '. – Vulcan
toàn bộ khối bộ nhớ của đối tượng luôn luôn được lấp đầy bằng số không, đó là lý do tại sao tất cả các biến trong một đối tượng mặc định là 0, 'b' là biến cục bộ và đơn giản là không được khởi tạo ở phần đó. nó được khởi tạo khi một giá trị được gán – x4rf41
nhưng y b biến không có giá trị mặc định? –