2 回答
TA贡献2019条经验 获得超9个赞
在嵌套作用域中创建同名的新变量称为变量隐藏,Java 在多种情况下确实允许这样做。这x是在嵌套范围内声明四次的示例:
class MyTest {
String x = "class member";
void foo() {
System.out.println("x = " + x);
String x = "local variable";
System.out.println("x = " + x);
new Runnable() {
String x = "inner class member";
public void run() {
System.out.println("x = " + x);
String x = "inner local variable";
System.out.println("x = " + x);
}
}.run();
}
public static void main(String[] list) {
new test().foo();
}
}
如您所见,它已经有些令人困惑。当您不小心使用错误的变量时,这可能会导致严重的错误,即使代码在不同的范围内非常好并且编译时没有警告。
例如,这段代码应该做什么?
for(int i=0; i<10; i++) {
for(int i=0; i<10; i++) {
System.out.println(i);
}
}
C++ 会说“这些应该是两个单独的变量”
JavaScript 会说“这些应该是同一个变量”
Java 说“这令人困惑,请选择更好的名称”,并且不允许在单个函数中隐藏局部变量。
TA贡献1802条经验 获得超5个赞
这没有改变。Java 就是这样设计的。局部变量不能被同一函数中定义的其他变量遮蔽。原因是一致性,所有外部变量对内部作用域也是可见的。
这是一种情况,Java 的工作方式与 C 和 C++ 不同,后者允许同一函数中的变量相互遮蔽。
添加回答
举报