我知道Java中的域是在创建对象的时候为其分配空间的,但是我一直不明白方法体内部的局部变量是什么时候为其分配空间的。难道也是在创建对象时分配?还是在该方法被调用时候分配?
java bytecode 是基于栈的。局部变量区在栈帧里面,同时还有操作数栈和帧数据区。只不过java的栈跟x86的栈不一样的地方是,x86的栈可以拿ebp加偏移来随便访问,java不行,局部变量区和操作数栈都有专门的访问指令,互不相通。
比如:
public static void main(String[] args) {
int i = 0;
int j = 4;
int k = i + j;
float a = 0;
float b = 1;
float c = a + b;
long x = 0;
long y = 1;
long z = x + y;
String string = null;
}
会被编译成:
public static void main(java.lang.String[]);
Code:
// int i = 0;
0: iconst_0
1: istore_1
// int j = 4;
2: iconst_4
3: istore_2
// int k = i + j;
4: iload_1
5: iload_2
6: iadd
7: istore_3
// float a = 0;
8: fconst_0
9: fstore 4
// float b = 1;
11: fconst_1
12: fstore 5
// float c = a + b;
14: fload 4
16: fload 5
18: fadd
19: fstore 6
// long x = 0;
21: lconst_0
22: lstore 7
// long y = 1;
24: lconst_1
25: lstore 9
// long z = x + y;
27: lload 7
29: lload 9
31: ladd
32: lstore 11
// String string = null;
34: aconst_null
35: astore 13
37: return
一般书中不会提及这些,需要你自己拿着jd-gui反编译你写的程序来看。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。