- 此问题在此处已有答案**:
Why is it not possible to shadow a local variable in a loop?(7个答案)
5年前关闭。
我是Java新手,遇到了一个OCJA-1.8示例问题,我对此有一些疑问。我需要澄清JVM的这种行为。
public class Test{
static int x=1;//**This is static class level variable**
public static void main(String[] args){
int[] nums={1,2,3,4,5};
for(int x:nums){ // Local variable declared for for-each loop.
System.out.println(x);
}
}
}
为什么JVM没有在每个循环'int x'中声明的变量出现重复变量时抛出错误?因为静态变量具有类级作用域。
5条答案
按热度按时间dhxwm5r41#
局部变量在一定程度上隐藏了原始静态字段,但并非不可访问:
对于非静态字段:
所以这是允许的,实际上人们经常看到:
这就避免了引入某种约定(_x,mX)的需要。
不允许的情况:
因为这是不好的作风,造成混乱。
niknxzdl2#
x的内部变量声明覆盖了静态变量声明。如果需要访问静态变量,可以使用
Test.x
进行访问cvxl0en23#
如果在同一作用域中声明了两个同名变量,则会发生重复变量编译错误:字段或方法声明范围。
在您的示例中,每个变量都在不同的作用域中声明。
因此,当您在声明
x
的方法中引用x
时,默认情况下,它引用的变量具有更近的可用作用域(x
局部变量),因此遮蔽了另一个变量(x
字段变量)。要引用隐藏的变量:
Test.x
this
关键字:this.x
omqzjyyz4#
当你有一个和静态变量相同的局部变量时,类的静态变量被局部变量遮蔽。
8gsdolmq5#
它不会抛出错误,因为Java有shadowing的概念,本质上,使用scope最小的变量。
静态字段仍然是可访问的,您只需要完全限定它:
这可能会让你的代码读者感到困惑,所以在大多数情况下应该避免。如果你发现你的字段和局部变量同名,那么 * 可能 * 出了什么问题,你应该重新评估你给变量命名的方式。
在您的特定情况下,
x
不是一个描述性名称,两个变量都将受益于更好、更具描述性的名称。在某些情况下,比如在构造函数或setter方法中,使用同名的局部变量和字段是有益的,这就是隐藏是一个有用特性的地方。