我在准备 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 block 内的“int x=4”将在 IF block 外看到。但不应该是“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
block 。它在声明之后和超出范围之前不被引用。
System.out.println(x);
这会打印范围内唯一的x
,静态类变量,即3
。上面声明的局部 x
超出范围,不再隐藏静态类变量。
final int x = 10;
这声明了另一个新的局部变量x
,它也不同于静态类变量x
,也不同于之前已经超出范围的x
在 if
block 中声明,并将其初始化为 10
。这个新的局部变量隐藏 静态类变量。但是,它也会立即超出范围;它的范围仅限于 main
方法 block 。它在声明之后和超出范围之前也不会被引用。
主要有以下几点:
- 一个局部变量可以隐藏一个同名的类变量。但是,它只在自己的本地范围内这样做。
- 尚未声明的变量还不影响类变量。
关于Java8 变量作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51389547/