Java8变量范围

Dha*_*tel 4 java variables scope

当我准备参加OCAJP考试时,我参加了模拟考试,我在下面的变量和变量范围问题上遇到了这个问题.

public class HelloWorld{
     static int x = 2;            
     public static void main(String []args){
        if(x>1)
        {
            x++;
            int x = 4;
        }
        System.out.println(x);
        final int x = 10;
     }
}
Run Code Online (Sandbox Code Playgroud)

并且上述代码的输出为"3".但是我无法弄清楚为什么输出是3.我可以理解if块中的"int x = 4"将在IF块之外看到.但不应该"最终int x = 10;" 抛出编译器偏离轨道,因为已经有x作为静态变量?

rge*_*man 5

我们按照代码顺序来看一下.

static int x = 2;
Run Code Online (Sandbox Code Playgroud)

这声明了一个名为x初始化为的静态类变量2.

if(x>1)
Run Code Online (Sandbox Code Playgroud)

这是指静态类变量,因为x尚未发生其他声明.

    x++;
Run Code Online (Sandbox Code Playgroud)

这会将静态类变量x增加到3.

    int x = 4;
Run Code Online (Sandbox Code Playgroud)

这声明了一个x与静态类变量不同的新局部变量x,并将其初始化为4.这个新的局部变量会影响静态类变量.但是,它立即超出了范围; 它的范围仅限于if块.声明之后以及超出范围之前不会引用它.

System.out.println(x);
Run Code Online (Sandbox Code Playgroud)

这将打印唯一x的范围,静态类变量,即3.x上面声明的本地超出范围,不再隐藏静态类变量.

final int x = 10;
Run Code Online (Sandbox Code Playgroud)

这声明了另一个新的局部变量x,它也与静态类变量x不同,并且与x先前在if块中声明的范围已经不同,并将其初始化为10.这个新的局部变量会影响静态类变量.但是,它也立即超出了范围; 其范围仅限于main方法块.声明之后以及超出范围之前也不会引用它.

要点是:

  • 局部变量可以隐藏同名的类变量.但是,它只在自己的本地范围内这样做.
  • 尚未声明的变量尚未影响类变量.