Java8变量范围
我参加了模拟考试,因为我正在准备OCAJP考试,我遇到了下面这个关于变量和变量范围的问题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
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,这是一个输入错误。