Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么迭代器变量初始化是在java中为每个块内部完成的_Java_Loops_Foreach - Fatal编程技术网

为什么迭代器变量初始化是在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

我是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) {
                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)。但我的问题是为什么。如果你这么做了,我不明白你为什么这么大以至于代码不起作用。你提供的代码不会编译。它不起作用,因为它是无效的语法。不需要其他解释。当变量不指向
迭代器时,命名变量
迭代器
,既不符合常规又令人困惑>.