Dha*_*tel 4 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.println(x);
final int x = 10;
}
}
Run Code Online (Sandbox Code Playgroud)
并且上述代码的输出为"3".但是我无法弄清楚为什么输出是3.我可以理解if块中的"int x = 4"将在IF块之外看到.但不应该"最终int x = 10;" 抛出编译器偏离轨道,因为已经有x作为静态变量?
我们按照代码顺序来看一下.
static int x = 2;
Run Code Online (Sandbox Code Playgroud)
这声明了一个名为x初始化为的静态类变量2.
if(x>1)
Run Code Online (Sandbox Code Playgroud)
这是指静态类变量,因为x尚未发生其他声明.
x++;
Run Code Online (Sandbox Code Playgroud)
这会将静态类变量x增加到3.
int x = 4;
Run Code Online (Sandbox Code Playgroud)
这声明了一个x与静态类变量不同的新局部变量x,并将其初始化为4.这个新的局部变量会影响静态类变量.但是,它立即超出了范围; 它的范围仅限于if块.声明之后以及超出范围之前不会引用它.
System.out.println(x);
Run Code Online (Sandbox Code Playgroud)
这将打印唯一x的范围,静态类变量,即3.x上面声明的本地超出范围,不再隐藏静态类变量.
final int x = 10;
Run Code Online (Sandbox Code Playgroud)
这声明了另一个新的局部变量x,它也与静态类变量x不同,并且与x先前在if块中声明的范围已经不同,并将其初始化为10.这个新的局部变量会影响静态类变量.但是,它也立即超出了范围; 其范围仅限于main方法块.声明之后以及超出范围之前也不会引用它.
要点是: