Java变量在块级作用域中的范围是什么?

3

我知道在C++中,变量具有块级作用域,例如以下代码可以在C++中运行:

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

但这段代码在Java中不起作用,它报告“重复局部变量a”,这是否意味着Java变量没有块级作用域?

这个问题有一个很好的扩展讨论,可以在这里找到: https://dev59.com/l3VC5IYBdhLWcg3w7V73 - Andriy Sholokh
1
“不起作用”是什么意思?编译器出现错误或警告,还是其他问题?请尽量准确地描述。 - Péter Török
5个回答

10

它们具有块级作用域。这意味着您无法在块之外使用它们。但是,Java禁止通过内部块中的名称隐藏外部块中的名称。


4

Java变量具有块级作用域,但如果您注意到int a已在作用域中定义,则所有子作用域都在最上层花括号的作用域内。因此,您会收到重复变量错误。

  { 
     int a = 0;
      {
       {
        } 
      }
}

4

第 §14.4.2 节中提到:

在块(§14.2)中声明的局部变量的作用域是包含该声明的块的其余部分,从其自己的初始化程序(§14.4)开始,并包括在局部变量声明语句中向右的任何进一步声明符。

局部变量 v 的名称不能在 v 的作用域内作为直接封闭方法、构造函数或初始化程序块的局部变量重新声明,否则会导致编译时错误。


3

之前的回答已经说明了原因,但我想展示一下这仍然是允许的:

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

在这种情况下,循环内部的a不会隐藏外部的a,因此它是有效的。
另外,在我看来,在C++中也应该这样做,这样可以减少混淆并防止意外声明具有相同名称的变量。

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.
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接