我知道在C++中,变量具有块级作用域,例如以下代码可以在C++中运行:
void foo(){
int a = 0;
for (int i = 0; i < 10; ++i){
int a = 1; // Redefine a here.
}
}
但这段代码在Java中不起作用,它报告“重复局部变量a”,这是否意味着Java变量没有块级作用域?
我知道在C++中,变量具有块级作用域,例如以下代码可以在C++中运行:
void foo(){
int a = 0;
for (int i = 0; i < 10; ++i){
int a = 1; // Redefine a here.
}
}
它们具有块级作用域。这意味着您无法在块之外使用它们。但是,Java禁止通过内部块中的名称隐藏外部块中的名称。
Java变量具有块级作用域,但如果您注意到int a已在作用域中定义,则所有子作用域都在最上层花括号的作用域内。因此,您会收到重复变量错误。
{ int a = 0; { { } }
}
第 §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
,因此它是有效的。void foo(){
{
int a = 0;
// Do something with a
}
for(int i = 0; i < 10; ++i){
int a = 1; //define a here.
}
}