当我准备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块之外看到。但是"final int x= 10;“不应该抛出编译器的轨道,因为已经有x作为静态变量了吗?
发布于 2018-07-18 04:30:32
让我们按照代码顺序来处理这个问题。
static int x = 2;这将声明一个初始化为2的名为x的静态类变量。
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。这个新的局部变量隐藏了静态类变量。但是,它也立即超出了作用域;它的作用域仅限于main方法块。它在声明之后和超出范围之前也不会被引用。
要点是:
https://stackoverflow.com/questions/51389547
复制相似问题