我在准备OCAJP考试时参加了模拟考试,我遇到了以下有关变量和变量范围的问题。
.navbar-collapse
,以上代码的输出为“ 3”。 但是我无法弄清楚为什么输出为3。我可以理解,如果在IF块之外可以看到if块中的“ int x = 4”。但是不应该“ final int x = 10;”因为已经有x作为静态变量,所以使编译器偏离轨道了吗?
答案 0 :(得分:5)
让我们按照代码顺序来做。
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
,并且不同于先前在x
块中声明的范围if
,并将其初始化为10
。这个新的局部变量阴影静态类变量。但是,它也立即超出范围。它的范围仅限于main
方法块。在声明之后和超出范围之前也不会引用它。
要点是: