for循环中声明的变量范围

时间:2013-12-12 11:42:32

标签: java scope

让我解释一下。

我在main方法中有一个int i = 9。现在我在同一个main方法中有循环。看下面的例子

class Test {

  public static void main(String... args) throws Exception{   
    int i =39;
    for (int i = 0; i < 10; i++) {   // error:i already defined
    }
  }

}

对于上面的例子,它显示了我已经定义的编译时错误。从这个错误我认为我在for条件中声明的范围也是在循环之外。

现在参见以下示例

class Test {

  public static void main(String... args) throws Exception{   

    for (int i = 0; i < 10; i++) {
    }
    System.out.println(i); // error: cannot find symbol i
  }

}

在上面的示例中,它显示了无法找到符号i的循环外的错误。

如果没有找到我在for循环条件中声明。那么为什么它显示i已在第一个例子中定义

7 个答案:

答案 0 :(得分:3)

根据Block

的定义
  

块是平衡大括号之间的一组零个或多个语句,可以在允许单个语句的任何位置使用。

所以

{   //block started

}    //block ended

块中声明的变量是什么,范围仅限于该块。

拇指规则的变量范围是{}

public static void main(String... args) throws Exception{   
    int i =39;
    for (int i = 0; i < 10; i++) {   
     System.out.println(i); // which i ?? 
    }
  }

在上面的例子中,编译器混淆了它正在寻找的 i ,因为i已经定义了,并且它也有一个在循环中访问的范围。

i方法范围

中已定义main
public static void main(String... args) throws Exception{   

    for (int i = 0; i < 10; i++) {
    }
    System.out.println(i); // the scope ended already with in {}
  }

在上述情况下,i范围已在for {}中结束,但在外部不可用。

答案 1 :(得分:1)

在第一个场景中,i具有方法范围。它在声明后的main()方法中随处可见。因此,当您尝试在i中声明另一个for时,它会给出已定义的错误。

  public static void main(String... args) throws Exception{   
    int i =39; // i will be visible throughout the main method
    for (int i = 0; i < 10; i++) {   // i already declared above, thus the error
    }
  }

在第二种情况中,ifor内声明,因此在其外部不可见。在i循环中声明的变量for只能使用{ for loop block }访问,并且在结束花括号后超出范围。这就是为什么它会在i循环之后在SOP语句中找不到符号for的错误。

  public static void main(String... args) throws Exception{   
    for (int i = 0; i < 10; i++) { // i is declared within the for
        // anywhere within this block, i is visible/in-scope
    } // after this closing braces of for, i has gone out of scope
    System.out.println(i); // thus the error: cannot find symbol i
  }

答案 2 :(得分:1)

第一个例子: i范围是完整的main方法

第二个例子: i范围是for循环

干杯

答案 3 :(得分:1)

你可以想到

for (int i = 0; i < 10; i++) {
}

等同于

{
  int i;
  for (i = 0; i < 10; i++) {
  }
}

换句话说,声明的范围是for(...)本身的各种表达式,加上循环体,但没有超出循环体的末尾。

在您的第一个示例中,您可以从int中删除for,使其成为作业而不是声明:

public static void main(String... args) throws Exception{   
  int i =39;
  for (i = 0; i < 10; i++) { // re-assigns the existing i variable
  }
  System.out.println(i); // prints 10
}

答案 4 :(得分:1)

下面的代码给出错误

int i =39;
for (int i = 0; i < 10; i++) {   // error:i already defined
}

下面不会给出错误

for (int i = 0; i < 10; i++) {   
}
int i =39;

答案 5 :(得分:1)

在这个例子中

class Test {

  public static void main(String... args) throws Exception{   
    int i =39;
    for (int i = 0; i < 10; i++) {   // error:i already defined
    }
  }

}

您将i声明为int 2次,这在java中是不允许的,因为它们在同一范围内。

现在在这个例子中

class Test {

  public static void main(String... args) throws Exception{   

    for (int i = 0; i < 10; i++) {
    }
    System.out.println(i); // error: cannot find symbol i
  }

}

i的范围在for循环中,并且您尝试在for循环外打印i

这是工作代码

class Test {

  public static void main(String... args) throws Exception{   
    int i;
        for ( i = 0; i < 10; i++) {
        }
        System.out.println(i); // error: cannot find symbol i
      }

}

输出 10

答案 6 :(得分:0)

您要做的就是在for循环之前添加另一个变量。然后,使用所需的i进行检查。

public static void main(String[] args) {
    int j = 0;
    for (int i = 0; i < 10; i++) {
        j = i;
    }
    System.out.println(j);
}