作者:ConstruWoodPan | 来源:互联网 | 2022-12-10 13:18
当我准备参加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块之外看到.但不应该"最终int x = 10;" 抛出编译器偏离轨道,因为已经有x作为静态变量?
1> rgettman..:
我们按照代码顺序来看一下.
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
方法块.声明之后以及超出范围之前也不会引用它.
要点是:
局部变量可以隐藏同名的类变量.但是,它只在自己的本地范围内这样做.
尚未声明的变量尚未影响类变量.