2010-10-05 48 views
3

我知道在C++变量已经区块范围,例如,下面的代码在C++块中java变量的作用域是什么?

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

}

但在Java这个片段中不起作用,它会报告“副本局部变量”,确实它意味着Java变量不具有BLOCK范围?

+1

你是什么意思的“不工作”?编译器错误或警告,或...?请尽量准确描述您的描述。 – 2010-10-05 08:53:38

+0

关于此的良好扩展讨论可以在这里找到: http://stackoverflow.com/questions/141140/why-does-java-not-have-block-scoped-variable-declarations – 2010-10-05 08:53:07

回答

3

Java变量确实有块范围,但如果你注意到INT一个在范围上已经定义

 { 
    int a = 0; 
     { 
     { 
     } 
     } 




    }

所有子范围是在最上面的大括号的范围。因此你会得到一个重复的变量错误。

8

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

1

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

以前的答案已经提到的原因,但我只是想表明,这仍然是允许的:

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

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

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

4

Section §14.4.2说:

局部变量 声明的块中的(§14.2)范围是 其余在其中出现的 声明,以开始其自己的 初始化(§块的14.4)并且在 声明中包含 的任何进一步声明者 中的局部变量声明 。

局部变量v的名称可能 重新声明作为 局部变量的直接封闭方法,V的范围内 构造或初始化块 或 编译时间错误发生。