Distinguishing local variables with same name in a loop

时间:2019-01-15 18:23:09

标签: java

I have found the following java code:

test:
    for (int i = 0; i <= max; i++) {
        int n = substring.length();
        int j = i;
        int k = 0;
        while (n-- != 0) {
            if (searchMe.charAt(j++) != substring.charAt(k++)) {
                continue test;
            }
        }
        foundIt = true;
            break test;
    }
    System.out.println(foundIt ? "Found it" : "Didn't find it");
}

Inside the loop, the above code is creating 'n', 'j' and 'k' several times. How the program distinguishes between these variables of the same name?

I mean where they are stored in the memory to distinguish them?

2 个答案:

答案 0 :(得分:1)

有点简化:

{ ... }块中,int k = 0;创建一个变量,该变量一直存在,直到到达块末尾为止,然后该变量被销毁。因此,在程序运行期间的任何时候,最多存在一个njk

更接近现实:

编译器扫描整个方法,找到可能并行存在的变量列表(injk和{{1} }),并在堆栈上为这些变量分配足够的位置(在您的示例中为5个位置)。这些堆栈位置从您输入方法的那一刻起就一直存在,直到您从该方法返回为止,但并非一直使用它们,例如foundIt位置仅包含从执行k到当前循环迭代结束的有用值。

答案 1 :(得分:0)

Java的局部变量具有称为确定赋值的保护,这意味着您无法在为其赋值之前从它们中读取值。

它们也在作用域中定义:您只能在程序的特定块内访问变量。

将这两种方法结合在一起,循环的每次迭代都不需要单独的变量:可以保证在使用局部变量之前为其分配一个值,因此可以保证覆盖之前以前存储在其中。

变量实际上只是源代码中的一个有用概念。编译后,字节码就没有变量名:编译器只是简单地确定它可以在有限的时间内临时使用内存的特定部分来存储值。它将多次重复使用此内存,但要确保它们在使用之间不会重叠。