【问题标题】:what are the extra works Java compiler need to implement block scope?Java 编译器需要哪些额外的工作来实现块作用域?
【发布时间】:2017-08-13 06:30:11
【问题描述】:

函数范围对我来说很有意义,因为局部变量的生命周期 == 它的可见性,但我对 块范围

有点不确定

看看这个java代码:

public static void main(String[] args) {
    int j;
    { // block A
        int i;
    }
    { // block B
        int i;
    }
}
  1. 调用函数时,所有三个变量都在调用堆栈上分配空间?即使 i 在块外不可访问,但在函数返回之前它不会被删除? (如果在block终止后删除,如何实现?如果模仿调用堆栈,我们将无法访问j...)
  2. 如果1为真,编译时Java需要给每个作用域一个命名空间,然后再放入符号表中? (类似于 blockA.i = sp+4,blockB.i = sp+8)。如果1 为假,我想它只是解决了名称冲突问题
  3. int j;{int j;} 在 Java 中是不允许的,编译器是否还需要检查当前符号表中是否存在冲突(重命名之前)? (我知道C++ 允许这样做)

【问题讨论】:

    标签: java syntax scope


    【解决方案1】:

    让我们像下面这样更改您的代码:

    public static void main(String[] args) {
        int j;
        { // block A
            int i;
            i=1;
        }
        { // block B
            int i;
            i=1;
        }
    }
    

    并在编译后查看上述代码的字节码。

    public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=1, locals=3, args_size=1
         0: iconst_1
         1: istore_2     //statement 1
         2: iconst_1
         3: istore_2     //statement 2
         4: return
      LineNumberTable:
        line 14: 0
        line 18: 2
        line 20: 4
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  args   [Ljava/lang/String;
    

    查看语句1和语句2,这意味着不同范围内的局部变量i保存在局部变量表中存储在插槽2的相同位置。

    由于变量i在不同的作用域,当程序在块二执行时,块一的局部变量i是无效的,所以我们可以使用局部变量i的那个槽。

    java 编译器还会检查当前范围内是否有相同的标识符。注意当前范围意味着您可以分别在实例范围和本地范围内声明具有相同名称的变量,但不能全部在实例范围或本地范围内。

    【讨论】:

    • 看起来我的第一条语句是正确的,在 Java 中,局部变量的生命周期与其可见性不同,如果我有 { int i; { int j;}}j 将与 @987654329 同时被“删除” @(当函数结束时),但在整个函数期间不可见
    • @watashiSHUN 是的,第一个说法是正确的。所有的局部变量都存储在jvm上的局部变量表中,与它的范围无关。所以变量j的生命周期与变量i相同。但是注意有时不止一个变量会使用相同的空间,比如不同范围的局部变量。
    猜你喜欢
    • 2023-04-09
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多