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
Java8变量范围_Java_Variables_Scope - Fatal编程技术网

Java8变量范围

Java8变量范围,java,variables,scope,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.pr

我参加了模拟考试,因为我正在准备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块内的“intx=4”将在if块外看到。但“final int x=10;”不应该让编译器偏离正轨,因为已经有x作为静态变量了吗

让我们按代码顺序来处理这个问题

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
。上面声明的局部
x
超出范围,不再隐藏静态类变量

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

System.out.println(x);
要点是:

  • 局部变量可以隐藏同名的类变量。但是,它只在自己的局部范围内这样做
  • 尚未声明的变量不会对类变量进行阴影处理

您可以使用与静态或非静态字段同名的局部变量。代码中没有
int x=3
。抱歉@Arkadiy,这是一个输入错误。