Java静态变量和局部变量

时间:2017-11-06 12:07:48

标签: java variables foreach static local-variables

我是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 个答案:

答案 0 :(得分:4)

局部变量稍微隐藏了原始静态字段,但它不可访问:

Test.x

对于非静态字段:

this.x // not in this case

所以这是允许的,实际上人们常常看到:

public class Pt {
    private final int x;
    public Pt(int x) {
        this.x = x;
    }
}

这可以防止引入一些约定(_x,mX)。

什么是不允许的:

void f() {
    int x = 42;
    if (true) {
        int x = 13; // COMPILER ERROR
        ...
    }
}

因为这是不好的风格,造成混乱。

答案 1 :(得分:2)

x的内部变量声明覆盖静态声明。 如果您需要访问静态变量,可以使用Test.x

访问它

答案 2 :(得分:2)

对于在同一范围内声明的具有相同名称的两个变量,会发生重复变量编译错误:字段或方法声明范围。
在您的示例中,每个变量都在不同的范围内声明 因此,当您在声明x的方法中引用x时,默认情况下它引用具有更近范围的变量(x局部变量),从而影响其他变量(x字段变量)。

引用阴影变量:

  • 如果是静态字段(您的情况),请在其前面加上声明它的类名:Test.x
  • 如果是实例字段,请在其前面加上this关键字:this.x

答案 3 :(得分:1)

当局部变量与静态变量相同时,类的静态变量将被局部变量遮蔽。

答案 4 :(得分:1)

它没有抛出错误,因为Java具有shadowing的概念。实质上,使用具有最低scope的变量。

静态字段仍然可访问,您只需要完全限定它:

for(int x:nums){
    System.out.println(x);       // Local x
    System.out.println(Test.x);  // static x
}

这可能会使代码的读者感到困惑,因此在大多数情况下应该避免使用。如果您发现自己的字段和局部变量名称相同,那么可能某些内容,您应该重新评估您对变量的命名方式。

在您的具体情况下,x不是一个描述性名称,两个变量都会受益于更好,更具描述性的名称。

在某些情况下,例如在构造函数或setter方法中,使局部变量和具有相同名称的字段是有益的,这就是阴影是一个有用的功能。