Java 区分循环中具有相同名称的局部变量
我发现了以下java代码:Java 区分循环中具有相同名称的局部变量,java,Java,我发现了以下java代码: 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:
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");
}
测试:
对于(inti=0;iJava的局部变量有一种称为确定赋值的保护,这意味着在赋值之前不能从它们中读取值
它们也在一个范围内定义:您只能访问程序某个块内的变量
将这两个因素结合在一起,循环的每次迭代都不需要单独的变量:保证在使用局部变量之前为其指定一个值,因此保证覆盖之前存储在其中的任何值(如果有的话)
变量实际上只是源代码中一个有用的概念。一旦编译,字节码就没有变量名:编译器只是确定它可以临时使用内存的特定部分在有限的时间内存储一个值。它将多次重用该内存,但以确保usag之间不重叠的方式是的。稍微简化一下:
在{…}
块中,int k=0;
创建一个变量,该变量一直存在,直到到达块的末尾,变量在块中被销毁。因此,在程序运行期间的任何时候,最多存在一个n
、j
或k
更接近现实:
编译器扫描整个方法,找到可能并行存在的变量列表(i
,n
,j
,k
,和foundIt
),并在堆栈上为这些变量分配足够的位置(在您的示例中为5个位置)。这些堆栈位置从您输入方法的那一刻起一直存在,直到您从方法返回为止,但它们并非一直都在使用,例如k
位置仅包含从您执行int k=0;
到当前循环迭代结束的有用值。n
、j
和k
都只是decla每个循环一次红色。在循环结束时,它们超出范围,垃圾回收难以辨认。在循环的下一次迭代中,会创建新的变量。变量名在字节码中几乎不存在,因此它们在不同的迭代中具有相同的名称这一事实并不重要:我还想看看:作为一个普通的prGrammer我们不需要关心Java在内存中把变量放在哪里。只要相信,比如说,你的变量n
从声明到右大括号都存在。然后它就不存在了,所以下次在循环中创建一个新的n
时就不会有任何混淆。@GBlodgett它们不符合垃圾收集的条件:这些是原始的局部变量,因此在堆栈上。就内存空间而言(或与任何其他问题相关),这种编码有什么好处吗?