块中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. } }
- java.lang.ClassNotFoundException:org.apache.commons.fileupload.FileItemFactory
- 无法在Eclipse中编译枚举
- 会话计数器具有HttpSessionListener和会话计数变量访问权限
- Java:格式数以百万计
- 从jsr-303自定义validation器访问数据库
- 河内塔递归java
- 当另一个类调用Singleton.instance.show()时,带有CardLayout的Singleton将不会显示卡片
- 在Java中以恒定时间合并两个列表
- 是不是在try块中捕获的未经检查的exception在Java中检查了exception?