java - Java8 变量范围
问题描述
我在准备 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 作为静态变量,所以让编译器偏离轨道?
解决方案
让我们按代码顺序来处理。
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
. 上面声明的 localx
超出范围,不再隐藏静态类变量。
final int x = 10;
这声明了另一个新的局部变量x
,也不同于静态类变量,也不同于先前在块中声明x
的已经超出范围的变量,并将其初始化为。这个新的局部变量隐藏了静态类变量。但是,它也会立即超出范围;它的范围仅限于方法块。在声明之后和超出范围之前也不会引用它。x
if
10
main
要点是:
- 局部变量可以隐藏同名的类变量。但是,它只在自己的本地范围内这样做。
- 尚未声明的变量不会影响类变量。
推荐阅读
- reactjs - 在 React.js 的内容显示组件中的渲染中的条件
- javascript - 在 React 16.7 中,在 setState 调用之后,返回 null 的 getDerivedStateFromProps 也正在更新状态
- wpf - 无法设置 WPF Datagrid 列前景
- javascript - 在 React 中从 WatermelonDB 中获取数据
- webpack - Nuxt - 模块解析失败:意外字符“#”
- c# - 获取类型而不是值
- ios - .oga 快速播放
- angular - Angular 7在重定向后保留来自URL的'objects id based'
- modelsim - 在 Modelsim 中仿真时意外退出
- c# - 如何转换字符串,使每个单词的第一个字符为大写,其余字符为小写?