开发者社区> 问答> 正文

Java中方法内部的变量何时分配空间?

我知道Java中的域是在创建对象的时候为其分配空间的,但是我一直不明白方法体内部的局部变量是什么时候为其分配空间的。难道也是在创建对象时分配?还是在该方法被调用时候分配?

展开
收起
蛮大人123 2016-03-11 16:07:13 2147 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    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反编译你写的程序来看。

    2019-07-17 18:59:30
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载