Java静态变量和局部变量[重复]

rnmwe5a2  于 2023-03-06  发布在  Java
关注(0)|答案(5)|浏览(197)
    • 此问题在此处已有答案**:

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'中声明的变量出现重复变量时抛出错误?因为静态变量具有类级作用域。

dhxwm5r4

dhxwm5r41#

局部变量在一定程度上隐藏了原始静态字段,但并非不可访问:

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

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

niknxzdl

niknxzdl2#

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

cvxl0en2

cvxl0en23#

如果在同一作用域中声明了两个同名变量,则会发生重复变量编译错误:字段或方法声明范围。
在您的示例中,每个变量都在不同的作用域中声明。
因此,当您在声明x的方法中引用x时,默认情况下,它引用的变量具有更近的可用作用域(x局部变量),因此遮蔽了另一个变量(x字段变量)。
要引用隐藏的变量:

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

omqzjyyz4#

当你有一个和静态变量相同的局部变量时,类的静态变量被局部变量遮蔽。

8gsdolmq

8gsdolmq5#

它不会抛出错误,因为Java有shadowing的概念,本质上,使用scope最小的变量。
静态字段仍然是可访问的,您只需要完全限定它:

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

这可能会让你的代码读者感到困惑,所以在大多数情况下应该避免。如果你发现你的字段和局部变量同名,那么 * 可能 * 出了什么问题,你应该重新评估你给变量命名的方式。
在您的特定情况下,x不是一个描述性名称,两个变量都将受益于更好、更具描述性的名称。
在某些情况下,比如在构造函数或setter方法中,使用同名的局部变量和字段是有益的,这就是隐藏是一个有用特性的地方。

相关问题