Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java静态变量和局部变量_Java_Variables_Foreach_Static_Local Variables - Fatal编程技术网

Java静态变量和局部变量

Java静态变量和局部变量,java,variables,foreach,static,local-variables,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

我是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没有将错误作为重复变量抛出,对于每个循环“intx”内部声明的变量。由于静态变量具有类级作用域?

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

访问该变量。局部变量在某种程度上隐藏了原始静态字段,但不可访问:

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

因为这是错误的样式,导致混淆。

对于在同一范围内声明的两个同名变量,会发生重复变量编译错误:字段或方法声明范围。
在您的示例中,每个变量都在不同的范围内声明。
因此,当您在声明
x
的方法中引用
x
时,默认情况下,它引用的是范围更近的变量(“code>x局部变量”),该变量与另一个变量(“code>x字段变量”)形成阴影

要引用阴影变量,请执行以下操作:

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

当您有一个与静态变量相同的局部变量时,该类的静态变量将被局部变量隐藏

它不会抛出错误,因为Java有。本质上,使用的是最低的变量

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

for(int x:nums){
    System.out.println(x);       // Local x
    System.out.println(Test.x);  // static x
}
这可能会让代码的读者感到困惑,因此在大多数情况下应该避免。如果您发现自己的字段和局部变量的名称相同,那么可能有问题,您应该重新评估如何命名变量

在您的特定情况下,
x
不是一个描述性名称,这两个变量都将受益于更好、更具描述性的名称


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

您应该读取变量的范围。这在所有语言中几乎都是一样的。FYI-类级别、方法级别、块级别等,称为变量阴影局部变量始终隐藏(阴影)声明为“全局”(类变量)的变量更改为
System.out.println(Test.x)然后您将访问静态变量。