块中java变量的范围是什么?

时间:2010-10-05 08:49:40

标签: java variables scope

我知道在c ++变量中有块作用域,例如,下面的代码在C ++中起作用

void foo(){
    int a = 0;
    for(int i = 0; i < 10; ++i){
        int a = 1; //re-define a here.
    }

}

但是这个片段在java中不起作用,它报告“重复的局部变量a”,它是否意味着java变量没有BLOCK范围?

5 个答案:

答案 0 :(得分:10)

他们有块范围。这意味着您不能在块之外使用它们。但是,Java不允许在内部块中使用内部名称隐藏名称。

答案 1 :(得分:4)

Section §14.4.2说:

  

局部变量的范围   区块(第14.2节)中的声明是   其余的块在其中   声明出现,从它开始   自己的初始化程序(§14.4)并包括   右边的任何进一步的声明者   在局部变量声明中   言。

     

本地变量v的名称可能   被重新声明为当地变量   直接封闭的方法,   构造函数或初始化程序块   在v或a的范围内   发生编译时错误。

答案 2 :(得分:3)

java变量确实有一个块作用域但是如果你注意到int已经在作用域中定义了

  { 
     int a = 0;
      {
       {
        } 
      }




   }

所有子范围都在最上面的花括号的范围内。因此,您会收到重复的变量错误。

答案 3 :(得分:3)

之前的答案已经说明了原因,但我只是想证明这仍然是允许的:

void foo(){
    for(int i = 0; i < 10; ++i){
        int a = 1;
    }
    int a = 0;
}

在这种情况下,循环内的a不会隐藏外部a,因此它是有效的。

同样恕我直言,它也应该是这种方式在C ++中,它不那么混乱,并防止意外声明具有相同名称的变量。

答案 4 :(得分:2)

确实如此,但是它是嵌套的,所以foo()中定义的“a”在foo中的所有块中都可用。

以下是您正在寻找的示例:

void foo(){
    {
        int a = 0;
        // Do something with a
    }
    for(int i = 0; i < 10; ++i){
        int a = 1; //define a here.
    }
}