为什么迭代器变量初始化是在java中为每个块内部完成的
我是java新手,我正在处理数组和每个循环。我面临着迭代器初始化的问题 当迭代器变量初始化在每个块的内部完成时,代码工作正常,而当迭代器初始化在循环外部完成时,代码抛出错误 例如: 此代码适用于:为什么迭代器变量初始化是在java中为每个块内部完成的,java,loops,foreach,Java,Loops,Foreach,我是java新手,我正在处理数组和每个循环。我面临着迭代器初始化的问题 当迭代器变量初始化在每个块的内部完成时,代码工作正常,而当迭代器初始化在循环外部完成时,代码抛出错误 例如: 此代码适用于: class Array { public static void main(String args[]) { int[] array = {1,2,3,4,5,6,7,8,9,10}; for (int iterator : array
class Array {
public static void main(String args[]) {
int[] array = {1,2,3,4,5,6,7,8,9,10};
for (int iterator : array) {
System.out.println(iterator);
}
}
}
此代码不起作用
class Array {
public static void main(String args[]) {
int[] array = {1,2,3,4,5,6,7,8,9,10};
int iterator;
for (iterator : array) {
System.out.println(iterator);
}
}
}
有人请给我一些关于这个主题的见解,如果有人能解释每个循环的内存映射,它将是有用的。提前谢谢这就是我们的工作。接收每个值的变量必须在循环头中声明
原因是为每个循环迭代创建一个单独的变量。在“链接规范”部分中,请参见增强型for
循环的示例,如果它是一个简单的for
循环:
// Your enhanced `for` loop rendered as a normal `for` loop per the spec:
int[] array = {1,2,3,4,5,6,7,8,9,10};
{
int[] a = array;
for (int index = 0; index < a.length; index++) {
int iterator = a[index];
System.out.println(iterator);
}
}
//根据规范,增强的`for`循环呈现为普通`for`循环:
int[]数组={1,2,3,4,5,6,7,8,9,10};
{
int[]a=数组;
for(int index=0;index
请注意在每次迭代中是如何重新创建迭代器的(该变量不是一个很好的名称)。(它在概念上类似于另一种形式的增强型for
处理Iterable
而不是数组。)
它每次都是一个单独变量的一个优点是,我们可以使用final
,这对于在lambda中使用它的值尤其有用
这也解决了关于内存的问题:与任何块一样,新的堆栈空间被分配并用于块内的局部变量。我们在上面有三个层次:独立的块,包含了一个概念上的a
变量,它包裹了整个事物;包含索引的for
语句本身;以及包含迭代器的主体块
值得注意的是,增强的
for
可以定义为允许您选择性地在循环外声明值变量,但事实并非如此。它可以这样定义:如果变量是预先声明的,那么在循环迭代中,它将只执行赋值,而不是创建新变量并执行赋值。但这会使它变得更复杂,而且它已经有了需要同时处理数组和Iterable
s的复杂性。显然,复杂化的代价并不值得这么灵活。您正在放弃增强循环的语法。每个循环的可编译语法是
EnhancedForStatement:
for ( {VariableModifier} **UnannType** VariableDeclaratorId : Expression ) Statement
循环必须知道它自己作用域中的类型,因为你打破了这个错误。你的外观应该是:for(int iterator:array){
并删除上面的int iterator;
@kism3t我知道“for each”循环的语法是for(int iterator:array)。但我的问题是为什么。如果你这么做了,我不明白你为什么这么大以至于代码不起作用。你提供的代码不会编译。它不起作用,因为它是无效的语法。不需要其他解释。当变量不指向迭代器时,命名变量迭代器
,既不符合常规又令人困惑>.