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

我知道在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范围?

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

  { 
      int a = 0;
       {
        {
         } 
       }




    } 

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

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

Section §14.4.2说:

块(第14.2节)中局部变量声明的范围是声明出现的块的其余部分,从其自己的初始化器(第14.4节)开始,并包括局部变量声明语句中右侧的任何其他声明器。

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

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

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

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

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

它确实如此,但它是嵌套的,所以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. } }