首页 > 解决方案 > Java8 变量范围

问题描述

我在准备 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;
     }
}

上面代码的输出是“3”。但我无法弄清楚为什么输出是 3。我可以理解 if 块中的“int x=4”将在 IF 块之外看到。但不应该是“final int x = 10;” 因为已经有 x 作为静态变量,所以让编译器偏离轨道?

标签: javavariablesscope

解决方案


让我们按代码顺序来处理。

static int x = 2;

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

if(x>1)

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

    x++;

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

    int x = 4;

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

System.out.println(x);

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

final int x = 10;

这声明了另一个新的局部变量x,也不同于静态类变量,也不同于先前在块中声明x的已经超出范围的变量,并将其初始化为。这个新的局部变量隐藏了静态类变量。但是,它也会立即超出范围;它的范围仅限于方法块。在声明之后和超出范围之前也不会引用它。xif10main

要点是:

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

推荐阅读