我知道在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范围?
答案 0 :(得分:10)
他们有块范围。这意味着您不能在块之外使用它们。但是,Java不允许在内部块中使用内部名称隐藏名称。
答案 1 :(得分:4)
局部变量的范围 区块(第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.
}
}